ZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL0NyeXB0L1JDNC5wbSBiL21jdS90b29scy9wZXJsL0NyeXB0L1JDNC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2QyN2EwCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvQ3J5cHQvUkM0LnBtCkBAIC0wLDAgKzEsMTY1IEBACisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisjIENyeXB0OjpSQzQKKyMgICAgICAgRGF0ZSBXcml0dGVuOiAgIDA3LUp1bi0yMDAwIDA0OjE1OjU1IFBNCisjICAgICAgIExhc3QgTW9kaWZpZWQ6ICAxMy1EZWMtMjAwMSAwMzozMzo0OSBQTSAKKyMgICAgICAgQXV0aG9yOiAgICAgICAgIEt1cnQgS2luY2FpZCAoc2lmdWt1cnRAeWFob28uY29tKQorIyAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDEsIEt1cnQgS2luY2FpZAorIyAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgICAgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlIGFuZCBtYXkgYmUgbW9kaWZpZWQgYW5kL29yCisjICAgICAgIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisKK3BhY2thZ2UgQ3J5cHQ6OlJDNDsKKwordXNlIHN0cmljdDsKK3VzZSB2YXJzIHF3KCAkVkVSU0lPTiBASVNBIEBFWFBPUlQgJE1BWF9DSFVOS19TSVpFICk7CisKKyRNQVhfQ0hVTktfU0laRSA9IDEwMjQgdW5sZXNzICRNQVhfQ0hVTktfU0laRTsKKworcmVxdWlyZSBFeHBvcnRlcjsKKworQElTQSAgICAgPSBxdyhFeHBvcnRlcik7CitARVhQT1JUICA9IHF3KFJDNCk7CiskVkVSU0lPTiA9ICcyLjAyJzsKKworc3ViIG5ldyB7CisgICAgbXkgKCAkY2xhc3MsICRrZXkgKSAgPSBAXzsKKyAgICBteSAkc2VsZiA9IGJsZXNzIHt9LCAkY2xhc3M7CisgICAgJHNlbGYtPntzdGF0ZX0gPSBTZXR1cCggJGtleSApOworICAgICRzZWxmLT57eH0gPSAwOworICAgICRzZWxmLT57eX0gPSAwOworICAgICRzZWxmOworfQorCitzdWIgUkM0IHsKKyAgICBteSAkc2VsZjsKKyAgICBteSggQHN0YXRlLCAkeCwgJHkgKTsKKyAgICBpZiAoIHJlZiAkX1swXSApIHsKKyAgICAgICAgJHNlbGYgPSBzaGlmdDsKKyAgICBAc3RhdGUgPSBAeyAkc2VsZi0+e3N0YXRlfSB9OworICAgICR4ID0gJHNlbGYtPnt4fTsKKyAgICAkeSA9ICRzZWxmLT57eX07CisgICAgfSBlbHNlIHsKKyAgICAgICAgQHN0YXRlID0gU2V0dXAoIHNoaWZ0ICk7CisgICAgJHggPSAkeSA9IDA7CisgICAgfQorICAgIG15ICRtZXNzYWdlID0gc2hpZnQ7CisgICAgbXkgJG51bV9waWVjZXMgPSBkbyB7CisgICAgbXkgJG51bSA9IGxlbmd0aCgkbWVzc2FnZSkgLyAkTUFYX0NIVU5LX1NJWkU7CisgICAgbXkgJGludCA9IGludCAkbnVtOworICAgICRpbnQgPT0gJG51bSA/ICRpbnQgOiAkaW50KzE7CisgICAgfTsKKyAgICBmb3IgbXkgJHBpZWNlICggMC4uJG51bV9waWVjZXMgLSAxICkgeworICAgIG15IEBtZXNzYWdlID0gdW5wYWNrICJDKiIsIHN1YnN0cigkbWVzc2FnZSwgJHBpZWNlICogJE1BWF9DSFVOS19TSVpFLCAkTUFYX0NIVU5LX1NJWkUpOworICAgIGZvciAoIEBtZXNzYWdlICkgeworICAgICAgICAkeCA9IDAgaWYgKyskeCA+IDI1NTsKKyAgICAgICAgJHkgLT0gMjU2IGlmICgkeSArPSAkc3RhdGVbJHhdKSA+IDI1NTsKKyAgICAgICAgQHN0YXRlWyR4LCAkeV0gPSBAc3RhdGVbJHksICR4XTsKKyAgICAgICAgJF8gXj0gJHN0YXRlWyggJHN0YXRlWyR4XSArICRzdGF0ZVskeV0gKSAlIDI1Nl07CisgICAgfQorICAgIHN1YnN0cigkbWVzc2FnZSwgJHBpZWNlICogJE1BWF9DSFVOS19TSVpFLCAkTUFYX0NIVU5LX1NJWkUpID0gcGFjayAiQyoiLCBAbWVzc2FnZTsKKyAgICB9CisgICAgaWYgKCRzZWxmKSB7CisgICAgJHNlbGYtPntzdGF0ZX0gPSBcQHN0YXRlOworICAgICRzZWxmLT57eH0gPSAkeDsKKyAgICAkc2VsZi0+e3l9ID0gJHk7CisgICAgfQorICAgICRtZXNzYWdlOworfQorCitzdWIgU2V0dXAgeworICAgIG15IEBrID0gdW5wYWNrKCAnQyonLCBzaGlmdCApOworICAgIG15IEBzdGF0ZSA9IDAuLjI1NTsKKyAgICBteSAkeSA9IDA7CisgICAgZm9yIG15ICR4ICgwLi4yNTUpIHsKKyAgICAkeSA9ICggJGtbJHggJSBAa10gKyAkc3RhdGVbJHhdICsgJHkgKSAlIDI1NjsKKyAgICBAc3RhdGVbJHgsICR5XSA9IEBzdGF0ZVskeSwgJHhdOworICAgIH0KKyAgICB3YW50YXJyYXkgPyBAc3RhdGUgOiBcQHN0YXRlOworfQorCisKKzE7CitfX0VORF9fCisKKz1oZWFkMSBOQU1FCisKK0NyeXB0OjpSQzQgLSBQZXJsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSQzQgZW5jcnlwdGlvbiBhbGdvcml0aG0KKworPWhlYWQxIFNZTk9QU0lTCisKKyMgRnVuY3Rpb25hbCBTdHlsZQorICB1c2UgQ3J5cHQ6OlJDNDsKKyAgJGVuY3J5cHRlZCA9IFJDNCggJHBhc3NwaHJhc2UsICRwbGFpbnRleHQgKTsKKyAgJGRlY3J5cHQgPSBSQzQoICRwYXNzcGhyYXNlLCAkZW5jcnlwdGVkICk7CisgIAorIyBPTyBTdHlsZQorICB1c2UgQ3J5cHQ6OlJDNDsKKyAgJHJlZiA9IENyeXB0OjpSQzQtPm5ldyggJHBhc3NwaHJhc2UgKTsKKyAgJGVuY3J5cHRlZCA9ICRyZWYtPlJDNCggJHBsYWludGV4dCApOworCisgICRyZWYyID0gQ3J5cHQ6OlJDNC0+bmV3KCAkcGFzc3BocmFzZSApOworICAkZGVjcnlwdGVkID0gJHJlZjItPlJDNCggJGVuY3J5cHRlZCApOworCisjIHByb2Nlc3MgYW4gZW50aXJlIGZpbGUsIG9uZSBsaW5lIGF0IGEgdGltZQorIyAoV2FybmluZzogRW5jcnlwdGVkIGZpbGUgbGVha3MgbGluZSBsZW5ndGhzLikKKyAgJHJlZjMgPSBDcnlwdDo6UkM0LT5uZXcoICRwYXNzcGhyYXNlICk7CisgIHdoaWxlICg8RklMRT4pIHsKKyAgICAgIGNob21wOworICAgICAgcHJpbnQgJHJlZjMtPlJDNCgkXyksICJcbiI7CisgIH0KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0Egc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSQzQgYWxnb3JpdGhtLCBkZXZlbG9wZWQgYnkgUlNBIFNlY3VyaXR5LCBJbmMuIEhlcmUgaXMgdGhlIGRlc2NyaXB0aW9uCitmcm9tIFJTQSdzIHdlYnNpdGU6CisKK1JDNCBpcyBhIHN0cmVhbSBjaXBoZXIgZGVzaWduZWQgYnkgUml2ZXN0IGZvciBSU0EgRGF0YSBTZWN1cml0eSAobm93IFJTQSBTZWN1cml0eSkuIEl0IGlzIGEgdmFyaWFibGUKK2tleS1zaXplIHN0cmVhbSBjaXBoZXIgd2l0aCBieXRlLW9yaWVudGVkIG9wZXJhdGlvbnMuIFRoZSBhbGdvcml0aG0gaXMgYmFzZWQgb24gdGhlIHVzZSBvZiBhIHJhbmRvbQorcGVybXV0YXRpb24uIEFuYWx5c2lzIHNob3dzIHRoYXQgdGhlIHBlcmlvZCBvZiB0aGUgY2lwaGVyIGlzIG92ZXJ3aGVsbWluZ2x5IGxpa2VseSB0byBiZSBncmVhdGVyIHRoYW4KKzEwMTAwLiBFaWdodCB0byBzaXh0ZWVuIG1hY2hpbmUgb3BlcmF0aW9ucyBhcmUgcmVxdWlyZWQgcGVyIG91dHB1dCBieXRlLCBhbmQgdGhlIGNpcGhlciBjYW4gYmUKK2V4cGVjdGVkIHRvIHJ1biB2ZXJ5IHF1aWNrbHkgaW4gc29mdHdhcmUuIEluZGVwZW5kZW50IGFuYWx5c3RzIGhhdmUgc2NydXRpbml6ZWQgdGhlIGFsZ29yaXRobSBhbmQgaXQKK2lzIGNvbnNpZGVyZWQgc2VjdXJlLgorCitCYXNlZCBzdWJzdGFudGlhbGx5IG9uIHRoZSAiUkM0IGluIDMgbGluZXMgb2YgcGVybCIgZm91bmQgYXQgaHR0cDovL3d3dy5jeXBoZXJzcGFjZS5vcmcKKworQSBtYWpvciBidWcgaW4gdjEuMCB3YXMgZml4ZWQgYnkgRGF2aWQgSG9vayAoZGdoQHd1bXB1cy5jb20uYXUpLiAgVGhhbmtzLCBEYXZpZC4KKworPWhlYWQxIEFVVEhPUgorCitLdXJ0IEtpbmNhaWQgKHNpZnVrdXJ0QHlhaG9vLmNvbSkKK1JvbmFsZCBSaXZlc3QgZm9yIFJTQSBTZWN1cml0eSwgSW5jLgorCis9aGVhZDEgQlVHUworCitEaXNjbGFpbWVyOiBTdHJpY3RseSBzcGVha2luZywgdGhpcyBtb2R1bGUgdXNlcyB0aGUgImFsbGVnZWQiIFJDNAorYWxnb3JpdGhtLiBUaGUgQWxnb3JpdGhtIGtub3duIGFzICJSQzQiIGlzIGEgdHJhZGVtYXJrIG9mIFJTQSBTZWN1cml0eQorSW5jLiwgYW5kIHRoaXMgZG9jdW1lbnQgbWFrZXMgbm8gY2xhaW1zIG9uZSB3YXkgb3IgYW5vdGhlciB0aGF0IHRoaXMKK2lzIHRoZSBjb3JyZWN0IGFsZ29yaXRobSwgYW5kIGZ1cnRoZXIsIG1ha2Ugbm8gY2xhaW1zIGFib3V0IHRoZQorcXVhbGl0eSBvZiB0aGUgc291cmNlIGNvZGUgbm9yIGFueSBsaWNlbnNpbmcgcmVxdWlyZW1lbnRzIGZvcgorY29tbWVyY2lhbCB1c2UuCisKK1RoZXJlJ3Mgbm90aGluZyBwcmV2ZW50aW5nIHlvdSBmcm9tIHVzaW5nIHRoaXMgbW9kdWxlIGluIGFuIGluc2VjdXJlCit3YXkgd2hpY2ggbGVha3MgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCBlbmNyeXB0aW5nIG11bHRpbHBsZQorbWVzc2FnZXMgd2l0aCB0aGUgc2FtZSBwYXNzcGhyYXNlIG1heSBhbGxvdyBhbiBhdHRhY2tlciB0byBkZWNvZGUgYWxsIG9mCit0aGVtIHdpdGggbGl0dGxlIGVmZm9ydCwgZXZlbiB0aG91Z2ggdGhleSdsbCBhcHBlYXIgdG8gYmUgc2VjdXJlZC4gSWYKK3NlcmlvdXMgY3J5cHRvIGlzIHlvdXIgZ29hbCwgYmUgY2FyZWZ1bC4gQmUgdmVyeSBjYXJlZnVsLgorCitJdCdzIGEgcHVyZS1QZXJsIGltcGxlbWVudGF0aW9uLCBzbyB0aGF0IHJhdGluZyBvZiAiRWlnaHQKK3RvIHNpeHRlZW4gbWFjaGluZSBvcGVyYXRpb25zIiBpcyBnb29kIGZvciBub3RoaW5nIGJ1dCBhIGdvb2QgbGF1Z2guCitJZiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIGFyZSBhIGJvdHRsZW5lY2sgZm9yIHlvdSwgcGxlYXNlIHJlLXdyaXRlCit0aGlzIG1vZHVsZSB0byB1c2UgbmF0aXZlIGNvZGUgd2hlcmV2ZXIgcHJhY3RpY2FsLgorCis9aGVhZDEgTElDRU5TRQorCitUaGlzIGlzIGZyZWUgc29mdHdhcmUgYW5kIG1heSBiZSBtb2RpZmllZCBhbmQvb3IKK3JlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKKz1oZWFkMSBTRUUgQUxTTworCitMPHBlcmw+LCBMPGh0dHA6Ly93d3cuY3lwaGVyc3BhY2Uub3JnPiwgTDxodHRwOi8vd3d3LnJzYXNlY3VyaXR5LmNvbT4sIAorTDxodHRwOi8vd3d3LmFjaHR1bmcuY29tL2NyeXB0by9yYzQuaHRtbD4sIAorTDxodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9+YXJpZWwvc3NsZWF5L3JyYzQuaHRtbD4KKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvRGlnZXN0L1BlcmwvTUQ1LnBtIGIvbWN1L3Rvb2xzL3BlcmwvRGlnZXN0L1BlcmwvTUQ1LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTg3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9EaWdlc3QvUGVybC9NRDUucG0KQEAgLTAsMCArMSw0ODEgQEAKKyMhIC91c3IvYmluL2ZhbHNlCisjCisjICRJZDogTUQ1LnBtLHYgMS4yMyAyMDA0LzA4LzI3IDIwOjI4OjI1IGxhY2thcyBFeHAgJAorIworCitwYWNrYWdlIERpZ2VzdDo6UGVybDo6TUQ1OwordXNlIHN0cmljdDsKK3VzZSBpbnRlZ2VyOwordXNlIEV4cG9ydGVyOwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSBARVhQT1JURVIgQEVYUE9SVF9PSyk7CisKK0BFWFBPUlRfT0sgPSBxdyhtZDUgbWQ1X2hleCBtZDVfYmFzZTY0KTsKKworQElTQSA9ICdFeHBvcnRlcic7CiskVkVSU0lPTiA9ICcxLjgnOworCisjIEktVmVrdG9yCitzdWIgQSgpIHsgMHg2N180NV8yM18wMSB9CitzdWIgQigpIHsgMHhlZl9jZF9hYl84OSB9CitzdWIgQygpIHsgMHg5OF9iYV9kY19mZSB9CitzdWIgRCgpIHsgMHgxMF8zMl81NF83NiB9CisKKyMgZm9yIGludGVybmFsIHVzZQorc3ViIE1BWCgpIHsgMHhGRkZGRkZGRiB9CisKKyMgcGFkZCBhIG1lc3NhZ2UgdG8gYSBtdWx0aXBsZSBvZiA2NAorc3ViIHBhZGRpbmcgeworICAgIG15ICRsID0gbGVuZ3RoIChteSAkbXNnID0gc2hpZnQoKSAuIGNocigxMjgpKTsgICAgCisgICAgJG1zZyAuPSAiXDAiIHggKCgkbCU2NDw9NTY/NTY6MTIwKS0kbCU2NCk7CisgICAgJGwgPSAoJGwtMSkqODsKKyAgICAkbXNnIC49IHBhY2sgJ1ZWJywgJGwgJiBNQVggLCAoJGwgPj4gMTYgPj4gMTYpOworfQorCisKK3N1YiByb3RhdGVfbGVmdCgkJCkgeworCSMkX1swXSA8PCAkX1sxXSB8ICRfWzBdID4+ICgzMiAtICRfWzFdKTsKKwkjbXkgJHJpZ2h0ID0gJF9bMF0gPj4gKDMyIC0gJF9bMV0pOworCSNteSAkcm1hc2sgPSAoMSA8PCAkX1sxXSkgLSAxOworCSgkX1swXSA8PCAkX1sxXSkgfCAoKCAkX1swXSA+PiAoMzIgLSAkX1sxXSkgICkgICYgKCgxIDw8ICRfWzFdKSAtIDEpKTsKKwkjJF9bMF0gPDwgJF9bMV0gfCAoKCRfWzBdPj4gKDMyIC0gJF9bMV0pKSAmICgxIDw8ICgzMiAtICRfWzFdKSkgLSAxKTsKK30KKworc3ViIGdlbl9jb2RlIHsKKyAgIyBEaXNjYXJkIHVwcGVyIDMyIGJpdHMgb24gNjQgYml0IGFyY2hzLgorICBteSAkTVNLID0gKCgxIDw8IDE2KSA8PCAxNikgPyAnICYgJyAuIE1BWCA6ICcnOworIwlGRiA9PiAiWDA9cm90YXRlX2xlZnQoKChYMSZYMil8KH5YMSZYMykpK1gwK1g0K1g2JE1TSyxYNSkrWDEkTVNLOyIsCisjCUdHID0+ICJYMD1yb3RhdGVfbGVmdCgoKFgxJlgzKXwoWDImKH5YMykpKStYMCtYNCtYNiRNU0ssWDUpK1gxJE1TSzsiLAorICBteSAlZiA9ICgKKwlGRiA9PiAiWDA9cm90YXRlX2xlZnQoKFgzXihYMSYoWDJeWDMpKSkrWDArWDQrWDYkTVNLLFg1KStYMSRNU0s7IiwKKwlHRyA9PiAiWDA9cm90YXRlX2xlZnQoKFgyXihYMyYoWDFeWDIpKSkrWDArWDQrWDYkTVNLLFg1KStYMSRNU0s7IiwKKwlISCA9PiAiWDA9cm90YXRlX2xlZnQoKFgxXlgyXlgzKStYMCtYNCtYNiRNU0ssWDUpK1gxJE1TSzsiLAorCUlJID0+ICJYMD1yb3RhdGVfbGVmdCgoWDJeKFgxfCh+WDMpKSkrWDArWDQrWDYkTVNLLFg1KStYMSRNU0s7IiwKKyAgKTsKKyAgI3VubGVzcyAoICgxIDw8IDE2KSA8PCAxNikgeyAlZiA9ICV7JENPREVTeyczMmJpdCd9fSB9CisgICNlbHNlIHsgJWYgPSAleyRDT0RFU3snNjRiaXQnfX0gfQorCisgIG15ICVzID0gKCAgIyBzaGlmdCBsZW5ndGhzCisJUzExID0+IDcsIFMxMiA9PiAxMiwgUzEzID0+IDE3LCBTMTQgPT4gMjIsIFMyMSA9PiA1LCBTMjIgPT4gOSwgUzIzID0+IDE0LAorCVMyNCA9PiAyMCwgUzMxID0+IDQsIFMzMiA9PiAxMSwgUzMzID0+IDE2LCBTMzQgPT4gMjMsIFM0MSA9PiA2LCBTNDIgPT4gMTAsCisJUzQzID0+IDE1LCBTNDQgPT4gMjEKKyAgKTsKKworICBteSAkaW5zZXJ0ID0gIlxuIjsKKyAgd2hpbGUoPERBVEE+KSB7CisJY2hvbXA7CisJbmV4dCB1bmxlc3MgL15bRkdISV0vOworCW15ICgkZnVuYyxAeCkgPSBzcGxpdCAvLC87CisJbXkgJGMgPSAkZnskZnVuY307CisJJGMgPX4gcy9YKFxkKS8keFskMV0vZzsKKwkkYyA9fiBzLyhTXGR7Mn0pLyRzeyQxfS87CisJJGMgPX4gcy9eKC4qKT1yb3RhdGVfbGVmdFwoKC4qKSwoLiopXClcKyguKikkLy87CisKKwlteSAkc3UgPSAzMiAtICQzOworCW15ICRzaCA9ICgxIDw8ICQzKSAtIDE7CisKKwkkYyA9ICIkMT0oKChcJHI9JDIpPDwkMyl8KChcJHI+PiRzdSkmJHNoKSkrJDQiOworCisJI215ICRyb3RhdGUgPSAiKCgkMiA8PCAkMykgfHwgKCgkMiA+PiAoMzIgLSAkMykpICYgKDEgPDwgJDIpIC0gMSkpKSI7IAorCSMgJGMgPSAiXCRyID0gJDI7CisJIyAkMSA9ICgoXCRyIDw8ICQzKSB8ICgoXCRyID4+ICgzMiAtICQzKSkgICYgKCgxIDw8ICQzKSAtIDEpKSkgKyAkNCI7CisJJGluc2VydCAuPSAiXHQkY1xuIjsKKyAgfQorICBjbG9zZSBEQVRBOworICAKKyAgbXkgJGR1bXAgPSAnCisgIHN1YiByb3VuZCB7CisJbXkgKCRhLCRiLCRjLCRkKSA9IEBfWzAgLi4gM107CisJbXkgJHI7JyAuICRpbnNlcnQgLiAnCisJJF9bMF0rJGEnIC4gJE1TSyAuICcsICRfWzFdKyRiICcgLiAkTVNLIC4gCisgICAgICAgICcsICRfWzJdKyRjJyAuICRNU0sgLiAnLCAkX1szXSskZCcgLiAkTVNLIC4gJzsKKyAgfSc7CisgIGV2YWwgJGR1bXA7CisgICMgcHJpbnQgIiRkdW1wXG4iOworICAjIGV4aXQgMDsKK30KKworZ2VuX2NvZGUoKTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUHJpdmF0ZSBvdXRwdXQgY29udmVydGVyIGZ1bmN0aW9uczoKK3N1YiBfZW5jb2RlX2hleCB7IHVucGFjayAnSConLCAkX1swXSB9CitzdWIgX2VuY29kZV9iYXNlNjQgeworCW15ICRyZXM7CisJd2hpbGUgKCRfWzBdID1+IC8oLnsxLDQ1fSkvZ3MpIHsKKwkJJHJlcyAuPSBzdWJzdHIgcGFjaygndScsICQxKSwgMTsKKwkJY2hvcCAkcmVzOworCX0KKwkkcmVzID1+IHRyfGAgLV98QUEtWmEtejAtOSsvfDsjYAorCWNob3AgJHJlczsgY2hvcCAkcmVzOworCSRyZXMKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT09QIGludGVyZmFjZToKK3N1YiBuZXcgeworCW15ICRwcm90byA9IHNoaWZ0OworCW15ICRjbGFzcyA9IHJlZiAkcHJvdG8gfHwgJHByb3RvOworCW15ICRzZWxmID0ge307CisJYmxlc3MgJHNlbGYsICRjbGFzczsKKwkkc2VsZi0+cmVzZXQoKTsKKwkkc2VsZgorfQorCitzdWIgcmVzZXQgeworCW15ICRzZWxmID0gc2hpZnQ7CisJZGVsZXRlICRzZWxmLT57X2RhdGF9OworCSRzZWxmLT57X3N0YXRlfSA9IFtBLEIsQyxEXTsKKwkkc2VsZi0+e19sZW5ndGh9ID0gMDsKKwkkc2VsZgorfQorCitzdWIgYWRkIHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCSRzZWxmLT57X2RhdGF9IC49IGpvaW4gJycsIEBfIGlmIEBfOworCW15ICgkaSwkYyk7CisJZm9yICRpICgwIC4uIChsZW5ndGggJHNlbGYtPntfZGF0YX0pLzY0LTEpIHsKKwkJbXkgQFggPSB1bnBhY2sgJ1YxNicsIHN1YnN0ciAkc2VsZi0+e19kYXRhfSwgJGkqNjQsIDY0OworCQlAeyRzZWxmLT57X3N0YXRlfX0gPSByb3VuZChAeyRzZWxmLT57X3N0YXRlfX0sQFgpOworCQkrKyRjOworCX0KKwlpZiAoJGMpIHsKKwkJc3Vic3RyICgkc2VsZi0+e19kYXRhfSwgMCwgJGMqNjQpID0gJyc7CisJCSRzZWxmLT57X2xlbmd0aH0gKz0gJGMqNjQ7CisJfQorCSRzZWxmCit9CisKK3N1YiBmaW5hbGl6ZSB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwkkc2VsZi0+e19kYXRhfSAuPSBjaHIoMTI4KTsKKyAgICBteSAkbCA9ICRzZWxmLT57X2xlbmd0aH0gKyBsZW5ndGggJHNlbGYtPntfZGF0YX07CisgICAgJHNlbGYtPntfZGF0YX0gLj0gIlwwIiB4ICgoJGwlNjQ8PTU2PzU2OjEyMCktJGwlNjQpOworICAgICRsID0gKCRsLTEpKjg7CisgICAgJHNlbGYtPntfZGF0YX0gLj0gcGFjayAnVlYnLCAkbCAmIE1BWCAsICgkbCA+PiAxNiA+PiAxNik7CisJJHNlbGYtPmFkZCgpOworCSRzZWxmCit9CisKK3N1YiBhZGRmaWxlIHsKKyAgCW15ICgkc2VsZiwkZmgpID0gQF87CisJaWYgKCFyZWYoJGZoKSAmJiByZWYoXCRmaCkgbmUgIkdMT0IiKSB7CisJICAgIHJlcXVpcmUgU3ltYm9sOworCSAgICAkZmggPSBTeW1ib2w6OnF1YWxpZnkoJGZoLCBzY2FsYXIgY2FsbGVyKTsKKwl9CisJIyAkc2VsZi0+e19kYXRhfSAuPSBkb3tsb2NhbCQvOzwkZmg+fTsKKwlteSAkcmVhZCA9IDA7CisJbXkgJGJ1ZmZlciA9ICcnOworCSRzZWxmLT5hZGQoJGJ1ZmZlcikgd2hpbGUgJHJlYWQgPSByZWFkICRmaCwgJGJ1ZmZlciwgODE5MjsKKwlkaWUgX19QQUNLQUdFX18sICIgcmVhZCBmYWlsZWQ6ICQhIiB1bmxlc3MgZGVmaW5lZCAkcmVhZDsKKwkkc2VsZgorfQorCitzdWIgYWRkX2JpdHMgeworCW15ICRzZWxmID0gc2hpZnQ7CisJcmV0dXJuICRzZWxmLT5hZGQoIHBhY2sgJ0IqJywgc2hpZnQgKSBpZiBAXyA9PSAxOworCW15ICgkYiwkbikgPSBAXzsKKwlkaWUgX19QQUNLQUdFX18sICIgSW52YWxpZCBudW1iZXIgb2YgYml0c1xuIiBpZiAkbiU4OworCSRzZWxmLT5hZGQoIHN1YnN0ciAkYiwgMCwgJG4vOCApCit9CisKK3N1YiBkaWdlc3QgeworCW15ICRzZWxmID0gc2hpZnQ7CisJJHNlbGYtPmZpbmFsaXplKCk7CisJbXkgJHJlcyA9IHBhY2sgJ1Y0JywgQHskc2VsZi0+e19zdGF0ZX19OworCSRzZWxmLT5yZXNldCgpOworCSRyZXMKK30KKworc3ViIGhleGRpZ2VzdCB7CisJX2VuY29kZV9oZXgoJF9bMF0tPmRpZ2VzdCkKK30KKworc3ViIGI2NGRpZ2VzdCB7CisJX2VuY29kZV9iYXNlNjQoJF9bMF0tPmRpZ2VzdCkKK30KKworc3ViIGNsb25lIHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCW15ICRjbG9uZSA9IHsgCisJCV9zdGF0ZSA9PiBbQHskc2VsZi0+e19zdGF0ZX19XSwKKwkJX2xlbmd0aCA9PiAkc2VsZi0+e19sZW5ndGh9LAorCQlfZGF0YSA9PiAkc2VsZi0+e19kYXRhfQorCX07CisJYmxlc3MgJGNsb25lLCByZWYgJHNlbGYgfHwgJHNlbGY7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFByb2NlZHVyYWwgaW50ZXJmYWNlOgorc3ViIG1kNSB7CisJbXkgJG1lc3NhZ2UgPSBwYWRkaW5nKGpvaW4nJyxAXyk7CisJbXkgKCRhLCRiLCRjLCRkKSA9IChBLEIsQyxEKTsKKwlteSAkaTsKKwlmb3IgJGkgKDAgLi4gKGxlbmd0aCAkbWVzc2FnZSkvNjQtMSkgeworCQlteSBAWCA9IHVucGFjayAnVjE2Jywgc3Vic3RyICRtZXNzYWdlLCRpKjY0LDY0OwkKKwkJKCRhLCRiLCRjLCRkKSA9IHJvdW5kKCRhLCRiLCRjLCRkLEBYKTsKKwl9CisJcGFjayAnVjQnLCRhLCRiLCRjLCRkOworfQorc3ViIG1kNV9oZXggeyBfZW5jb2RlX2hleCAmbWQ1IH0gCitzdWIgbWQ1X2Jhc2U2NCB7IF9lbmNvZGVfYmFzZTY0ICZtZDUgfQorCisKKzE7CisKKz1oZWFkMSBOQU1FCisKK0RpZ2VzdDo6TUQ1OjpQZXJsIC0gUGVybCBpbXBsZW1lbnRhdGlvbiBvZiBSb24gUml2ZXN0cyBNRDUgQWxnb3JpdGhtCisKKz1oZWFkMSBESVNDTEFJTUVSCisKK1RoaXMgaXMgQjxub3Q+IGFuIGludGVyZmFjZSAobGlrZSBDPERpZ2VzdDo6TUQ1PikgYnV0IGEgUGVybCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUuCitJdCBpcyB3cml0dGVuIGluIHBlcmwgb25seSBhbmQgYmVjYXVzZSBvZiB0aGlzIGl0IGlzIHNsb3cgYnV0IGl0IHdvcmtzIHdpdGhvdXQgQy1Db2RlLgorWW91IHNob3VsZCB1c2UgQzxEaWdlc3Q6Ok1ENT4gaW5zdGVhZCBvZiB0aGlzIG1vZHVsZSBpZiBpdCBpcyBhdmFpbGFibGUuCitUaGlzIG1vZHVsZSBpcyBvbmx5IHVzZWZ1bGwgZm9yCisKKz1vdmVyIDQKKworPWl0ZW0KKworY29tcHV0ZXJzIHdoZXJlIHlvdSBjYW5ub3QgaW5zdGFsbCBDPERpZ2VzdDo6TUQ1PiAoZS5nLiBsYWNrIG9mIGEgQy1Db21waWxlcikKKworPWl0ZW0KKworZW5jcnlwdGluZyBvbmx5IHNtYWxsIGFtb3VudHMgb2YgZGF0YSAobGVzcyB0aGFuIG9uZSBtaWxsaW9uIGJ5dGVzKS4gSSB1c2UgaXQgdG8KK2hhc2ggcGFzc3dvcmRzLgorCis9aXRlbQorCitlZHVjYXRpb25hbCBwdXJwb3NlcworCis9YmFjaworCis9aGVhZDEgU1lOT1BTSVMKKworICMgRnVuY3Rpb25hbCBzdHlsZQorIHVzZSBEaWdlc3Q6Ok1ENSAgcXcobWQ1IG1kNV9oZXggbWQ1X2Jhc2U2NCk7CisKKyAkaGFzaCA9IG1kNSAkZGF0YTsKKyAkaGFzaCA9IG1kNV9oZXggJGRhdGE7CisgJGhhc2ggPSBtZDVfYmFzZTY0ICRkYXRhOworICAgIAorCisgIyBPTyBzdHlsZQorIHVzZSBEaWdlc3Q6Ok1ENTsKKworICRjdHggPSBEaWdlc3Q6Ok1ENS0+bmV3OworCisgJGN0eC0+YWRkKCRkYXRhKTsKKyAkY3R4LT5hZGRmaWxlKCpGSUxFKTsKKworICRkaWdlc3QgPSAkY3R4LT5kaWdlc3Q7CisgJGRpZ2VzdCA9ICRjdHgtPmhleGRpZ2VzdDsKKyAkZGlnZXN0ID0gJGN0eC0+YjY0ZGlnZXN0OworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGVzIGhhcyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgdGhlIG11Y2ggZmFzdGVyIEM8RGlnZXN0OjpNRDU+LiBTbyB5b3UgY2FuCitlYXNpbHkgZXhjaGFuZ2UgdGhlbSwgZS5nLgorCisJQkVHSU4geworCSAgZXZhbCB7CisJICAgIHJlcXVpcmUgRGlnZXN0OjpNRDU7CisJICAgIGltcG9ydCBEaWdlc3Q6Ok1ENSAnbWQ1X2hleCcKKwkgIH07CisJICBpZiAoJEApIHsgIyB1cHMsIG5vIERpZ2VzdDo6TUQ1CisJICAgIHJlcXVpcmUgRGlnZXN0OjpQZXJsOjpNRDU7CisJICAgIGltcG9ydCBEaWdlc3Q6OlBlcmw6Ok1ENSAnbWQ1X2hleCcKKwkgIH0JCQorCX0KKworSWYgdGhlIEM8RGlnZXN0OjpNRDU+IG1vZHVsZSBpcyBhdmFpbGFibGUgaXQgaXMgdXNlZCBhbmQgaWYgbm90IHlvdSB0YWtlCitDPERpZ2VzdDo6UGVybDo6TUQ1Pi4KKworWW91IGNhbiBhbHNvIGluc3RhbGwgdGhlIFBlcmwgcGFydCBvZiBEaWdlc3Q6Ok1ENSB0b2dldGhlciB3aXRoIERpZ2VzdDo6UGVybDo6TUQ1CithbmQgdXNlIERpZ2VzdDo6TUQ1IGFzIG5vcm1hbCwgaXQgZmFsbHMgYmFjayB0byBEaWdlc3Q6OlBlcmw6Ok1ENSBpZiBpdAorY2Fubm90IGxvYWQgaXRzIG9iamVjdCBmaWxlcy4KKworRm9yIGEgZGV0YWlsZWQgRG9jdW1lbnRhdGlvbiBzZWUgdGhlIEM8RGlnZXN0OjpNRDU+IG1vZHVsZS4KKworPWhlYWQxIEVYQU1QTEVTCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gdXNlIHRoaXMgbGlicmFyeSBpcyB0byBpbXBvcnQgdGhlIG1kNV9oZXgoKQorZnVuY3Rpb24gKG9yIG9uZSBvZiBpdHMgY291c2lucyk6CisKKyAgICB1c2UgRGlnZXN0OjpQZXJsOjpNRDUgJ21kNV9oZXgnOworICAgIHByaW50ICdEaWdlc3QgaXMgJywgbWQ1X2hleCgnZm9vYmFyYmF6JyksICJcbiI7CisKK1RoZSBhYm92ZSBleGFtcGxlIHdvdWxkIHByaW50IG91dCB0aGUgbWVzc2FnZQorCisgICAgRGlnZXN0IGlzIDZkZjIzZGMwM2Y5YjU0Y2MzOGEwZmMxNDgzZGY2ZTIxCisKK3Byb3ZpZGVkIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIHdvcmtpbmcgY29ycmVjdGx5LiAgVGhlIHNhbWUKK2NoZWNrc3VtIGNhbiBhbHNvIGJlIGNhbGN1bGF0ZWQgaW4gT08gc3R5bGU6CisKKyAgICB1c2UgRGlnZXN0OjpNRDU7CisgICAgCisgICAgJG1kNSA9IERpZ2VzdDo6TUQ1LT5uZXc7CisgICAgJG1kNS0+YWRkKCdmb28nLCAnYmFyJyk7CisgICAgJG1kNS0+YWRkKCdiYXonKTsKKyAgICAkZGlnZXN0ID0gJG1kNS0+aGV4ZGlnZXN0OworICAgIAorICAgIHByaW50ICJEaWdlc3QgaXMgJGRpZ2VzdFxuIjsKKworVGhlIGRpZ2VzdCBtZXRob2RzIGFyZSBkZXN0cnVjdGl2ZS4gVGhhdCBtZWFucyB5b3UgY2FuIG9ubHkgY2FsbCB0aGVtCitvbmNlIGFuZCB0aGUgJG1kNSBvYmplY3RzIGlzIHJlc2V0IGFmdGVyIHVzZS4gWW91IGNhbiBtYWtlIGEgY29weSB3aXRoIGNsb25lOgorCisJJG1kNS0+Y2xvbmUtPmhleGRpZ2VzdAorCis9aGVhZDEgTElNSVRBVElPTlMKKworVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUQ1IGFsZ29yaXRobSBoYXMgc29tZSBsaW1pdGF0aW9uczoKKworPW92ZXIgNAorCis9aXRlbQorCitJdCdzIHNsb3csIHZlcnkgc2xvdy4gSSd2ZSBkb25lIG15IHZlcnkgYmVzdCBidXQgRGlnZXN0OjpNRDUgaXMgc3RpbGwgYWJvdXQgMTAwIHRpbWVzIGZhc3Rlci4KK1lvdSBjYW4gb25seSBlbmNyeXB0IERhdGEgdXAgdG8gb25lIG1pbGxpb24gYnl0ZXMgaW4gYW4gYWNjZXB0YWJsZSB0aW1lLiBCdXQgaXQncyB2ZXJ5IHVzZWZ1bGwKK2ZvciBlbmNyeXB0aW5nIHNtYWxsIGFtb3VudHMgb2YgZGF0YSBsaWtlIHBhc3N3b3Jkcy4KKworPWl0ZW0KKworWW91IGNhbiBvbmx5IGVuY3J5cHQgdXAgdG8gMl4zMiBiaXRzID0gNTEyIE1CIG9uIDMyYml0IGFyY2hzLiBCdXQgWW91IHNob3VsZAordXNlIEM8RGlnZXN0OjpNRDU+IGZvciB0aG9zZSBhbW91bnRzIG9mIGRhdGEgYW55d2F5LgorCis9YmFjaworCis9aGVhZDEgU0VFIEFMU08KKworTDxEaWdlc3Q6Ok1ENT4KKworTDxtZDUoMSk+CisKK1JGQyAxMzIxCisKK3Rvb2xzL21kNTogYSBzbWFsbCBCU0QgY29tcGF0aWJsZSBtZDUgdG9vbCB3cml0dGVuIGluIHB1cmUgcGVybC4KKworPWhlYWQxIENPUFlSSUdIVAorCitUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKKyBDb3B5cmlnaHQgMjAwMCBDaHJpc3RpYW4gTGFja2FzLCBJbXBlcmlhIFNvZnR3YXJlIFNvbHV0aW9ucworIENvcHlyaWdodCAxOTk4LTE5OTkgR2lzbGUgQWFzLgorIENvcHlyaWdodCAxOTk1LTE5OTYgTmVpbCBXaW50b24uCisgQ29weXJpZ2h0IDE5OTEtMTk5MiBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgorCitUaGUgTUQ1IGFsZ29yaXRobSBpcyBkZWZpbmVkIGluIFJGQyAxMzIxLiBUaGUgYmFzaWMgQyBjb2RlCitpbXBsZW1lbnRpbmcgdGhlIGFsZ29yaXRobSBpcyBkZXJpdmVkIGZyb20gdGhhdCBpbiB0aGUgUkZDIGFuZCBpcworY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodDoKKworPW92ZXIgNAorCis9aXRlbQorCitDb3B5cmlnaHQgKEMpIDE5OTEtMTk5MiwgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gQ3JlYXRlZCAxOTkxLiBBbGwKK3JpZ2h0cyByZXNlcnZlZC4KKworTGljZW5zZSB0byBjb3B5IGFuZCB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoYXQgaXQKK2lzIGlkZW50aWZpZWQgYXMgdGhlICJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QKK0FsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhpcyBzb2Z0d2FyZQorb3IgdGhpcyBmdW5jdGlvbi4KKworTGljZW5zZSBpcyBhbHNvIGdyYW50ZWQgdG8gbWFrZSBhbmQgdXNlIGRlcml2YXRpdmUgd29ya3MgcHJvdmlkZWQKK3RoYXQgc3VjaCB3b3JrcyBhcmUgaWRlbnRpZmllZCBhcyAiZGVyaXZlZCBmcm9tIHRoZSBSU0EgRGF0YQorU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsCittZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoZSBkZXJpdmVkIHdvcmsuCisKK1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBjb25jZXJuaW5nIGVpdGhlcgordGhlIG1lcmNoYW50YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIG9yIHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCitzb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgord2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkgb2YgYW55IGtpbmQuCisKK1RoZXNlIG5vdGljZXMgbXVzdCBiZSByZXRhaW5lZCBpbiBhbnkgY29waWVzIG9mIGFueSBwYXJ0IG9mIHRoaXMKK2RvY3VtZW50YXRpb24gYW5kL29yIHNvZnR3YXJlLgorCis9YmFjaworCitUaGlzIGNvcHlyaWdodCBkb2VzIG5vdCBwcm9oaWJpdCBkaXN0cmlidXRpb24gb2YgYW55IHZlcnNpb24gb2YgUGVybAorY29udGFpbmluZyB0aGlzIGV4dGVuc2lvbiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBvciBBcnRpc3RpYworbGljZW5zZXMuCisKKz1oZWFkMSBBVVRIT1JTCisKK1RoZSBvcmlnaW5hbCBNRDUgaW50ZXJmYWNlIHdhcyB3cml0dGVuIGJ5IE5laWwgV2ludG9uCisoPE4uV2ludG9uIChhdCkgYXhpb24uYnQuY28udWs+KS4KKworQzxEaWdlc3Q6Ok1ENT4gd2FzIG1hZGUgYnkgR2lzbGUgQWFzIDxnaXNsZSAoYXQpIGFhcy5ubz4gKEkgdG9vayBoaXMgSW50ZXJmYWNlCithbmQgcGFydCBvZiB0aGUgZG9jdW1lbnRhdGlvbikuCisKK1RoYW5rcyB0byBHdWlkbyBGbG9ociBmb3IgaGlzICd1c2UgaW50ZWdlcictaGludC4KKworVGhpcyByZWxlYXNlIHdhcyBtYWRlIGJ5IENocmlzdGlhbiBMYWNrYXMgPGRlbHRhIChhdCkgbGFja2FzLm5ldD4uCisKKz1jdXQKKworX19EQVRBX18KK0ZGLCRhLCRiLCRjLCRkLCRfWzRdLDcsMHhkNzZhYTQ3OCwvKiAxICovCitGRiwkZCwkYSwkYiwkYywkX1s1XSwxMiwweGU4YzdiNzU2LC8qIDIgKi8KK0ZGLCRjLCRkLCRhLCRiLCRfWzZdLDE3LDB4MjQyMDcwZGIsLyogMyAqLworRkYsJGIsJGMsJGQsJGEsJF9bN10sMjIsMHhjMWJkY2VlZSwvKiA0ICovCitGRiwkYSwkYiwkYywkZCwkX1s4XSw3LDB4ZjU3YzBmYWYsLyogNSAqLworRkYsJGQsJGEsJGIsJGMsJF9bOV0sMTIsMHg0Nzg3YzYyYSwvKiA2ICovCitGRiwkYywkZCwkYSwkYiwkX1sxMF0sMTcsMHhhODMwNDYxMywvKiA3ICovCitGRiwkYiwkYywkZCwkYSwkX1sxMV0sMjIsMHhmZDQ2OTUwMSwvKiA4ICovCitGRiwkYSwkYiwkYywkZCwkX1sxMl0sNywweDY5ODA5OGQ4LC8qIDkgKi8KK0ZGLCRkLCRhLCRiLCRjLCRfWzEzXSwxMiwweDhiNDRmN2FmLC8qIDEwICovCitGRiwkYywkZCwkYSwkYiwkX1sxNF0sMTcsMHhmZmZmNWJiMSwvKiAxMSAqLworRkYsJGIsJGMsJGQsJGEsJF9bMTVdLDIyLDB4ODk1Y2Q3YmUsLyogMTIgKi8KK0ZGLCRhLCRiLCRjLCRkLCRfWzE2XSw3LDB4NmI5MDExMjIsLyogMTMgKi8KK0ZGLCRkLCRhLCRiLCRjLCRfWzE3XSwxMiwweGZkOTg3MTkzLC8qIDE0ICovCitGRiwkYywkZCwkYSwkYiwkX1sxOF0sMTcsMHhhNjc5NDM4ZSwvKiAxNSAqLworRkYsJGIsJGMsJGQsJGEsJF9bMTldLDIyLDB4NDliNDA4MjEsLyogMTYgKi8gCitHRywkYSwkYiwkYywkZCwkX1s1XSw1LDB4ZjYxZTI1NjIsLyogMTcgKi8KK0dHLCRkLCRhLCRiLCRjLCRfWzEwXSw5LDB4YzA0MGIzNDAsLyogMTggKi8KK0dHLCRjLCRkLCRhLCRiLCRfWzE1XSwxNCwweDI2NWU1YTUxLC8qIDE5ICovCitHRywkYiwkYywkZCwkYSwkX1s0XSwyMCwweGU5YjZjN2FhLC8qIDIwICovCitHRywkYSwkYiwkYywkZCwkX1s5XSw1LDB4ZDYyZjEwNWQsLyogMjEgKi8KK0dHLCRkLCRhLCRiLCRjLCRfWzE0XSw5LDB4MjQ0MTQ1MywvKiAyMiAqLworR0csJGMsJGQsJGEsJGIsJF9bMTldLDE0LDB4ZDhhMWU2ODEsLyogMjMgKi8KK0dHLCRiLCRjLCRkLCRhLCRfWzhdLDIwLDB4ZTdkM2ZiYzgsLyogMjQgKi8KK0dHLCRhLCRiLCRjLCRkLCRfWzEzXSw1LDB4MjFlMWNkZTYsLyogMjUgKi8KK0dHLCRkLCRhLCRiLCRjLCRfWzE4XSw5LDB4YzMzNzA3ZDYsLyogMjYgKi8KK0dHLCRjLCRkLCRhLCRiLCRfWzddLDE0LDB4ZjRkNTBkODcsLyogMjcgKi8KK0dHLCRiLCRjLCRkLCRhLCRfWzEyXSwyMCwweDQ1NWExNGVkLC8qIDI4ICovCitHRywkYSwkYiwkYywkZCwkX1sxN10sNSwweGE5ZTNlOTA1LC8qIDI5ICovCitHRywkZCwkYSwkYiwkYywkX1s2XSw5LDB4ZmNlZmEzZjgsLyogMzAgKi8KK0dHLCRjLCRkLCRhLCRiLCRfWzExXSwxNCwweDY3NmYwMmQ5LC8qIDMxICovCitHRywkYiwkYywkZCwkYSwkX1sxNl0sMjAsMHg4ZDJhNGM4YSwvKiAzMiAqLworSEgsJGEsJGIsJGMsJGQsJF9bOV0sNCwweGZmZmEzOTQyLC8qIDMzICovCitISCwkZCwkYSwkYiwkYywkX1sxMl0sMTEsMHg4NzcxZjY4MSwvKiAzNCAqLworSEgsJGMsJGQsJGEsJGIsJF9bMTVdLDE2LDB4NmQ5ZDYxMjIsLyogMzUgKi8KK0hILCRiLCRjLCRkLCRhLCRfWzE4XSwyMywweGZkZTUzODBjLC8qIDM2ICovCitISCwkYSwkYiwkYywkZCwkX1s1XSw0LDB4YTRiZWVhNDQsLyogMzcgKi8KK0hILCRkLCRhLCRiLCRjLCRfWzhdLDExLDB4NGJkZWNmYTksLyogMzggKi8KK0hILCRjLCRkLCRhLCRiLCRfWzExXSwxNiwweGY2YmI0YjYwLC8qIDM5ICovCitISCwkYiwkYywkZCwkYSwkX1sxNF0sMjMsMHhiZWJmYmM3MCwvKiA0MCAqLworSEgsJGEsJGIsJGMsJGQsJF9bMTddLDQsMHgyODliN2VjNiwvKiA0MSAqLworSEgsJGQsJGEsJGIsJGMsJF9bNF0sMTEsMHhlYWExMjdmYSwvKiA0MiAqLworSEgsJGMsJGQsJGEsJGIsJF9bN10sMTYsMHhkNGVmMzA4NSwvKiA0MyAqLworSEgsJGIsJGMsJGQsJGEsJF9bMTBdLDIzLDB4NDg4MWQwNSwvKiA0NCAqLworSEgsJGEsJGIsJGMsJGQsJF9bMTNdLDQsMHhkOWQ0ZDAzOSwvKiA0NSAqLworSEgsJGQsJGEsJGIsJGMsJF9bMTZdLDExLDB4ZTZkYjk5ZTUsLyogNDYgKi8KK0hILCRjLCRkLCRhLCRiLCRfWzE5XSwxNiwweDFmYTI3Y2Y4LC8qIDQ3ICovCitISCwkYiwkYywkZCwkYSwkX1s2XSwyMywweGM0YWM1NjY1LC8qIDQ4ICovCitJSSwkYSwkYiwkYywkZCwkX1s0XSw2LDB4ZjQyOTIyNDQsLyogNDkgKi8KK0lJLCRkLCRhLCRiLCRjLCRfWzExXSwxMCwweDQzMmFmZjk3LC8qIDUwICovCitJSSwkYywkZCwkYSwkYiwkX1sxOF0sMTUsMHhhYjk0MjNhNywvKiA1MSAqLworSUksJGIsJGMsJGQsJGEsJF9bOV0sMjEsMHhmYzkzYTAzOSwvKiA1MiAqLworSUksJGEsJGIsJGMsJGQsJF9bMTZdLDYsMHg2NTViNTljMywvKiA1MyAqLworSUksJGQsJGEsJGIsJGMsJF9bN10sMTAsMHg4ZjBjY2M5MiwvKiA1NCAqLworSUksJGMsJGQsJGEsJGIsJF9bMTRdLDE1LDB4ZmZlZmY0N2QsLyogNTUgKi8KK0lJLCRiLCRjLCRkLCRhLCRfWzVdLDIxLDB4ODU4NDVkZDEsLyogNTYgKi8KK0lJLCRhLCRiLCRjLCRkLCRfWzEyXSw2LDB4NmZhODdlNGYsLyogNTcgKi8KK0lJLCRkLCRhLCRiLCRjLCRfWzE5XSwxMCwweGZlMmNlNmUwLC8qIDU4ICovCitJSSwkYywkZCwkYSwkYiwkX1sxMF0sMTUsMHhhMzAxNDMxNCwvKiA1OSAqLworSUksJGIsJGMsJGQsJGEsJF9bMTddLDIxLDB4NGUwODExYTEsLyogNjAgKi8KK0lJLCRhLCRiLCRjLCRkLCRfWzhdLDYsMHhmNzUzN2U4MiwvKiA2MSAqLworSUksJGQsJGEsJGIsJGMsJF9bMTVdLDEwLDB4YmQzYWYyMzUsLyogNjIgKi8KK0lJLCRjLCRkLCRhLCRiLCRfWzZdLDE1LDB4MmFkN2QyYmIsLyogNjMgKi8KK0lJLCRiLCRjLCRkLCRhLCRfWzEzXSwyMSwweGViODZkMzkxLC8qIDY0ICovCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9NSU1FL0xpdGUucG0gYi9tY3UvdG9vbHMvcGVybC9NSU1FL0xpdGUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2NzU1OQotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL01JTUUvTGl0ZS5wbQpAQCAtMCwwICsxLDMyNzUgQEAKK3BhY2thZ2UgTUlNRTo6TGl0ZTsNCisNCisNCis9aGVhZDEgTkFNRQ0KKw0KK01JTUU6OkxpdGUgLSBsb3ctY2Fsb3JpZSBNSU1FIGdlbmVyYXRvcg0KKw0KKw0KKz1oZWFkMSBTWU5PUFNJUw0KKw0KKyAgICB1c2UgTUlNRTo6TGl0ZTsNCisNCitDcmVhdGUgYSBzaW5nbGUtcGFydCBtZXNzYWdlOg0KKw0KKyAgICAjIyMgQ3JlYXRlIGEgbmV3IHNpbmdsZS1wYXJ0IG1lc3NhZ2UsIHRvIHNlbmQgYSBHSUYgZmlsZToNCisgICAgJG1zZyA9IE1JTUU6OkxpdGUtPm5ldygNCisgICAgICAgICAgICAgICAgIEZyb20gICAgID0+J21lQG15aG9zdC5jb20nLA0KKyAgICAgICAgICAgICAgICAgVG8gICAgICAgPT4neW91QHlvdXJob3N0LmNvbScsDQorICAgICAgICAgICAgICAgICBDYyAgICAgICA9Pidzb21lQG90aGVyLmNvbSwgc29tZUBtb3JlLmNvbScsDQorICAgICAgICAgICAgICAgICBTdWJqZWN0ICA9PidIZWxsb29vb29vLCBudXJzZSEnLA0KKyAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4naW1hZ2UvZ2lmJywNCisgICAgICAgICAgICAgICAgIEVuY29kaW5nID0+J2Jhc2U2NCcsDQorICAgICAgICAgICAgICAgICBQYXRoICAgICA9PidoZWxsb251cnNlLmdpZicNCisJCSApOw0KKw0KK0NyZWF0ZSBhIG11bHRpcGFydCBtZXNzYWdlIChpLmUuLCBvbmUgd2l0aCBhdHRhY2htZW50cyk6DQorDQorICAgICMjIyBDcmVhdGUgYSBuZXcgbXVsdGlwYXJ0IG1lc3NhZ2U6DQorICAgICRtc2cgPSBNSU1FOjpMaXRlLT5uZXcoDQorICAgICAgICAgICAgICAgICBGcm9tICAgID0+J21lQG15aG9zdC5jb20nLA0KKyAgICAgICAgICAgICAgICAgVG8gICAgICA9Pid5b3VAeW91cmhvc3QuY29tJywNCisgICAgICAgICAgICAgICAgIENjICAgICAgPT4nc29tZUBvdGhlci5jb20sIHNvbWVAbW9yZS5jb20nLA0KKyAgICAgICAgICAgICAgICAgU3ViamVjdCA9PidBIG1lc3NhZ2Ugd2l0aCAyIHBhcnRzLi4uJywNCisgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4nbXVsdGlwYXJ0L21peGVkJw0KKwkJICk7DQorDQorICAgICMjIyBBZGQgcGFydHMgKGVhY2ggImF0dGFjaCIgaGFzIHNhbWUgYXJndW1lbnRzIGFzICJuZXciKToNCisgICAgJG1zZy0+YXR0YWNoKFR5cGUgICAgID0+J1RFWFQnLA0KKyAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4iSGVyZSdzIHRoZSBHSUYgZmlsZSB5b3Ugd2FudGVkIg0KKwkJICk7DQorICAgICRtc2ctPmF0dGFjaChUeXBlICAgICA9PidpbWFnZS9naWYnLA0KKyAgICAgICAgICAgICAgICAgUGF0aCAgICAgPT4nYWFhMDAwMTIzLmdpZicsDQorICAgICAgICAgICAgICAgICBGaWxlbmFtZSA9Pidsb2dvLmdpZicsDQorCQkgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnDQorCQkgKTsNCisNCitPdXRwdXQgYSBtZXNzYWdlOg0KKw0KKyAgICAjIyMgRm9ybWF0IGFzIGEgc3RyaW5nOg0KKyAgICAkc3RyID0gJG1zZy0+YXNfc3RyaW5nOw0KKw0KKyAgICAjIyMgUHJpbnQgdG8gYSBmaWxlaGFuZGxlIChzYXksIGEgInNlbmRtYWlsIiBzdHJlYW0pOg0KKyAgICAkbXNnLT5wcmludChcKlNFTkRNQUlMKTsNCisNCisNCitTZW5kIGEgbWVzc2FnZToNCisNCisgICAgIyMjIFNlbmQgaW4gdGhlICJiZXN0IiB3YXkgKHRoZSBkZWZhdWx0IGlzIHRvIHVzZSAic2VuZG1haWwiKToNCisgICAgJG1zZy0+c2VuZDsNCisNCisNCisNCis9aGVhZDEgREVTQ1JJUFRJT04NCisNCitJbiB0aGUgbmV2ZXItZW5kaW5nIHF1ZXN0IGZvciBncmVhdCB0YXN0ZSB3aXRoIGZld2VyIGNhbG9yaWVzLA0KK3dlIHByb3VkbHkgcHJlc2VudDogSTxNSU1FOjpMaXRlPi4NCisNCitNSU1FOjpMaXRlIGlzIGludGVuZGVkIGFzIGEgc2ltcGxlLCBzdGFuZGFsb25lIG1vZHVsZSBmb3IgZ2VuZXJhdGluZw0KKyhub3QgcGFyc2luZyEpIE1JTUUgbWVzc2FnZXMuLi4gc3BlY2lmaWNhbGx5LCBpdCBhbGxvd3MgeW91IHRvDQorb3V0cHV0IGEgc2ltcGxlLCBkZWNlbnQgc2luZ2xlLSBvciBtdWx0aS1wYXJ0IG1lc3NhZ2Ugd2l0aCB0ZXh0IG9yIGJpbmFyeQ0KK2F0dGFjaG1lbnRzLiAgSXQgZG9lcyBub3QgcmVxdWlyZSB0aGF0IHlvdSBoYXZlIHRoZSBNYWlsOjogb3IgTUlNRTo6DQorbW9kdWxlcyBpbnN0YWxsZWQuDQorDQorWW91IGNhbiBzcGVjaWZ5IGVhY2ggbWVzc2FnZSBwYXJ0IGFzIGVpdGhlciB0aGUgbGl0ZXJhbCBkYXRhIGl0c2VsZiAoaW4NCithIHNjYWxhciBvciBhcnJheSksIG9yIGFzIGEgc3RyaW5nIHdoaWNoIGNhbiBiZSBnaXZlbiB0byBvcGVuKCkgdG8gZ2V0DQorYSByZWFkYWJsZSBmaWxlaGFuZGxlIChlLmcuLCAiPGZpbGVuYW1lIiBvciAic29tZWNvbW1hbmR8IikuDQorDQorWW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgZW5jb2RpbmcgeW91ciBtZXNzYWdlIGRhdGE6DQordGhpcyBtb2R1bGUgd2lsbCBkbyB0aGF0IGZvciB5b3UuICBJdCBoYW5kbGVzIHRoZSA1IHN0YW5kYXJkIE1JTUUgZW5jb2RpbmdzLg0KKw0KK0lmIHlvdSBuZWVkIG1vcmUgc29waGlzdGljYXRlZCBiZWhhdmlvciwgcGxlYXNlIGdldCB0aGUgTUlNRS10b29scw0KK3BhY2thZ2UgaW5zdGVhZC4gIEkgd2lsbCBiZSBtb3JlIGxpa2VseSB0byBhZGQgc3R1ZmYgdG8gdGhhdCB0b29sa2l0DQorb3ZlciB0aGlzIG9uZS4NCisNCisNCis9aGVhZDEgRVhBTVBMRVMNCisNCis9aGVhZDIgQ3JlYXRlIGEgc2ltcGxlIG1lc3NhZ2UgY29udGFpbmluZyBqdXN0IHRleHQNCisNCisgICAgJG1zZyA9IE1JTUU6OkxpdGUtPm5ldygNCisgICAgICAgICAgICAgICAgIEZyb20gICAgID0+J21lQG15aG9zdC5jb20nLA0KKyAgICAgICAgICAgICAgICAgVG8gICAgICAgPT4neW91QHlvdXJob3N0LmNvbScsDQorICAgICAgICAgICAgICAgICBDYyAgICAgICA9Pidzb21lQG90aGVyLmNvbSwgc29tZUBtb3JlLmNvbScsDQorICAgICAgICAgICAgICAgICBTdWJqZWN0ICA9PidIZWxsb29vb29vLCBudXJzZSEnLA0KKyAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4iSG93J3MgaXQgZ29pbicsIGVoPyINCisJCSApOw0KKw0KKz1oZWFkMiBDcmVhdGUgYSBzaW1wbGUgbWVzc2FnZSBjb250YWluaW5nIGp1c3QgYW4gaW1hZ2UNCisNCisgICAgJG1zZyA9IE1JTUU6OkxpdGUtPm5ldygNCisgICAgICAgICAgICAgICAgIEZyb20gICAgID0+J21lQG15aG9zdC5jb20nLA0KKyAgICAgICAgICAgICAgICAgVG8gICAgICAgPT4neW91QHlvdXJob3N0LmNvbScsDQorICAgICAgICAgICAgICAgICBDYyAgICAgICA9Pidzb21lQG90aGVyLmNvbSwgc29tZUBtb3JlLmNvbScsDQorICAgICAgICAgICAgICAgICBTdWJqZWN0ICA9PidIZWxsb29vb29vLCBudXJzZSEnLA0KKyAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4naW1hZ2UvZ2lmJywNCisgICAgICAgICAgICAgICAgIEVuY29kaW5nID0+J2Jhc2U2NCcsDQorICAgICAgICAgICAgICAgICBQYXRoICAgICA9PidoZWxsb251cnNlLmdpZicNCisJCSApOw0KKw0KKw0KKz1oZWFkMiBDcmVhdGUgYSBtdWx0aXBhcnQgbWVzc2FnZQ0KKw0KKyAgICAjIyMgQ3JlYXRlIHRoZSBtdWx0aXBhcnQgImNvbnRhaW5lciI6DQorICAgICRtc2cgPSBNSU1FOjpMaXRlLT5uZXcoDQorICAgICAgICAgICAgICAgICBGcm9tICAgID0+J21lQG15aG9zdC5jb20nLA0KKyAgICAgICAgICAgICAgICAgVG8gICAgICA9Pid5b3VAeW91cmhvc3QuY29tJywNCisgICAgICAgICAgICAgICAgIENjICAgICAgPT4nc29tZUBvdGhlci5jb20sIHNvbWVAbW9yZS5jb20nLA0KKyAgICAgICAgICAgICAgICAgU3ViamVjdCA9PidBIG1lc3NhZ2Ugd2l0aCAyIHBhcnRzLi4uJywNCisgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4nbXVsdGlwYXJ0L21peGVkJw0KKwkJICk7DQorDQorICAgICMjIyBBZGQgdGhlIHRleHQgbWVzc2FnZSBwYXJ0Og0KKyAgICAjIyMgKE5vdGUgdGhhdCAiYXR0YWNoIiBoYXMgc2FtZSBhcmd1bWVudHMgYXMgIm5ldyIpOg0KKyAgICAkbXNnLT5hdHRhY2goVHlwZSAgICAgPT4nVEVYVCcsDQorICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiJIZXJlJ3MgdGhlIEdJRiBmaWxlIHlvdSB3YW50ZWQiDQorCQkgKTsNCisNCisgICAgIyMjIEFkZCB0aGUgaW1hZ2UgcGFydDoNCisgICAgJG1zZy0+YXR0YWNoKFR5cGUgICAgID0+J2ltYWdlL2dpZicsDQorICAgICAgICAgICAgICAgICBQYXRoICAgICA9PidhYWEwMDAxMjMuZ2lmJywNCisgICAgICAgICAgICAgICAgIEZpbGVuYW1lID0+J2xvZ28uZ2lmJywNCisJCSBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcNCisJCSApOw0KKw0KKw0KKz1oZWFkMiBBdHRhY2ggYSBHSUYgdG8gYSB0ZXh0IG1lc3NhZ2UNCisNCitUaGlzIHdpbGwgY3JlYXRlIGEgbXVsdGlwYXJ0IG1lc3NhZ2UgZXhhY3RseSBhcyBhYm92ZSwgYnV0IHVzaW5nIHRoZQ0KKyJhdHRhY2ggdG8gc2luZ2xlcGFydCIgaGFjazoNCisNCisgICAgIyMjIFN0YXJ0IHdpdGggYSBzaW1wbGUgdGV4dCBtZXNzYWdlOg0KKyAgICAkbXNnID0gTUlNRTo6TGl0ZS0+bmV3KA0KKyAgICAgICAgICAgICAgICAgRnJvbSAgICA9PidtZUBteWhvc3QuY29tJywNCisgICAgICAgICAgICAgICAgIFRvICAgICAgPT4neW91QHlvdXJob3N0LmNvbScsDQorICAgICAgICAgICAgICAgICBDYyAgICAgID0+J3NvbWVAb3RoZXIuY29tLCBzb21lQG1vcmUuY29tJywNCisgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4nQSBtZXNzYWdlIHdpdGggMiBwYXJ0cy4uLicsDQorICAgICAgICAgICAgICAgICBUeXBlICAgID0+J1RFWFQnLA0KKyAgICAgICAgICAgICAgICAgRGF0YSAgICA9PiJIZXJlJ3MgdGhlIEdJRiBmaWxlIHlvdSB3YW50ZWQiDQorICAgICAgICAgICAgICAgICApOw0KKw0KKyAgICAjIyMgQXR0YWNoIGEgcGFydC4uLiB0aGUgbWFrZSB0aGUgbWVzc2FnZSBhIG11bHRpcGFydCBhdXRvbWF0aWNhbGx5Og0KKyAgICAkbXNnLT5hdHRhY2goVHlwZSAgICAgPT4naW1hZ2UvZ2lmJywNCisgICAgICAgICAgICAgICAgIFBhdGggICAgID0+J2FhYTAwMDEyMy5naWYnLA0KKyAgICAgICAgICAgICAgICAgRmlsZW5hbWUgPT4nbG9nby5naWYnDQorICAgICAgICAgICAgICAgICApOw0KKw0KKw0KKz1oZWFkMiBBdHRhY2ggYSBwcmUtcHJlcGFyZWQgcGFydCB0byBhIG1lc3NhZ2UNCisNCisgICAgIyMjIENyZWF0ZSBhIHN0YW5kYWxvbmUgcGFydDoNCisgICAgJHBhcnQgPSBNSU1FOjpMaXRlLT5uZXcoDQorICAgICAgICAgICAgICAgICBUeXBlICAgICA9Pid0ZXh0L2h0bWwnLA0KKyAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4nPEgxPkhlbGxvPC9IMT4nLA0KKyAgICAgICAgICAgICAgICAgKTsNCisgICAgJHBhcnQtPmF0dHIoJ2NvbnRlbnQtdHlwZS5jaGFyc2V0JyA9PiAnVVRGOCcpOw0KKyAgICAkcGFydC0+YWRkKCdYLUNvbW1lbnQnID0+ICdBIG1lc3NhZ2UgZm9yIHlvdScpOw0KKw0KKyAgICAjIyMgQXR0YWNoIGl0IHRvIGFueSBtZXNzYWdlOg0KKyAgICAkbXNnLT5hdHRhY2goJHBhcnQpOw0KKw0KKw0KKz1oZWFkMiBQcmludCBhIG1lc3NhZ2UgdG8gYSBmaWxlaGFuZGxlDQorDQorICAgICMjIyBXcml0ZSBpdCB0byBhIGZpbGVoYW5kbGU6DQorICAgICRtc2ctPnByaW50KFwqU1RET1VUKTsNCisNCisgICAgIyMjIFdyaXRlIGp1c3QgdGhlIGhlYWRlcjoNCisgICAgJG1zZy0+cHJpbnRfaGVhZGVyKFwqU1RET1VUKTsNCisNCisgICAgIyMjIFdyaXRlIGp1c3QgdGhlIGVuY29kZWQgYm9keToNCisgICAgJG1zZy0+cHJpbnRfYm9keShcKlNURE9VVCk7DQorDQorDQorPWhlYWQyIFByaW50IGEgbWVzc2FnZSBpbnRvIGEgc3RyaW5nDQorDQorICAgICMjIyBHZXQgZW50aXJlIG1lc3NhZ2UgYXMgYSBzdHJpbmc6DQorICAgICRzdHIgPSAkbXNnLT5hc19zdHJpbmc7DQorDQorICAgICMjIyBHZXQganVzdCB0aGUgaGVhZGVyOg0KKyAgICAkc3RyID0gJG1zZy0+aGVhZGVyX2FzX3N0cmluZzsNCisNCisgICAgIyMjIEdldCBqdXN0IHRoZSBlbmNvZGVkIGJvZHk6DQorICAgICRzdHIgPSAkbXNnLT5ib2R5X2FzX3N0cmluZzsNCisNCisNCis9aGVhZDIgU2VuZCBhIG1lc3NhZ2UNCisNCisgICAgIyMjIFNlbmQgaW4gdGhlICJiZXN0IiB3YXkgKHRoZSBkZWZhdWx0IGlzIHRvIHVzZSAic2VuZG1haWwiKToNCisgICAgJG1zZy0+c2VuZDsNCisNCisNCis9aGVhZDIgU2VuZCBhbiBIVE1MIGRvY3VtZW50Li4uIHdpdGggaW1hZ2VzIGluY2x1ZGVkIQ0KKw0KKyAgICAkbXNnID0gTUlNRTo6TGl0ZS0+bmV3KA0KKyAgICAgICAgICAgICAgICAgVG8gICAgICA9Pid5b3VAeW91cmhvc3QuY29tJywNCisgICAgICAgICAgICAgICAgIFN1YmplY3QgPT4nSFRNTCB3aXRoIGluLWxpbmUgaW1hZ2VzIScsDQorICAgICAgICAgICAgICAgICBUeXBlICAgID0+J211bHRpcGFydC9yZWxhdGVkJw0KKyAgICAgICAgICAgICAgICAgKTsNCisgICAgJG1zZy0+YXR0YWNoKFR5cGUgPT4gJ3RleHQvaHRtbCcsDQorICAgICAgICAgICAgICAgICBEYXRhID0+IHFxeyA8Ym9keT4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUncyA8aT5teTwvaT4gaW1hZ2U6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iY2lkOm15aW1hZ2UuZ2lmIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYm9keT4gfQ0KKyAgICAgICAgICAgICAgICAgKTsNCisgICAgJG1zZy0+YXR0YWNoKFR5cGUgPT4gJ2ltYWdlL2dpZicsDQorICAgICAgICAgICAgICAgICBJZCAgID0+ICdteWltYWdlLmdpZicsDQorICAgICAgICAgICAgICAgICBQYXRoID0+ICcvcGF0aC90by9zb21lZmlsZS5naWYnLA0KKyAgICAgICAgICAgICAgICAgKTsNCisgICAgJG1zZy0+c2VuZCgpOw0KKw0KKw0KKz1oZWFkMiBDaGFuZ2UgaG93IG1lc3NhZ2VzIGFyZSBzZW50DQorDQorICAgICMjIyBEbyBzb21ldGhpbmcgbGlrZSB0aGlzIGluIHlvdXIgJ21haW4nOg0KKyAgICBpZiAoJElfRE9OVF9IQVZFX1NFTkRNQUlMKSB7DQorICAgICAgIE1JTUU6OkxpdGUtPnNlbmQoJ3NtdHAnLCAic210cC5teWlzcC5uZXQiLCBUaW1lb3V0PT42MCk7DQorICAgIH0NCisNCisgICAgIyMjIE5vdyB0aGlzIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nOg0KKyAgICAkbXNnLT5zZW5kOyAgICAgICAgICMjIyB3aWxsIG5vdyB1c2UgTmV0OjpTTVRQIGFzIHNob3duIGFib3ZlDQorDQorDQorDQorDQorDQorDQorPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UNCisNCis9aGVhZDIgR2xvYmFsIGNvbmZpZ3VyYXRpb24NCisNCitUbyBhbHRlciB0aGUgd2F5IHRoZSBlbnRpcmUgbW9kdWxlIGJlaGF2ZXMsIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcNCittZXRob2RzL29wdGlvbnM6DQorDQorPW92ZXIgNA0KKw0KKw0KKz1pdGVtIE1JTUU6OkxpdGUtPmZpZWxkX29yZGVyKCkNCisNCitXaGVuIHVzZWQgYXMgYSBMPGNsYXNzbWV0aG9kfC9maWVsZF9vcmRlcj4sIHRoaXMgY2hhbmdlcyB0aGUgZGVmYXVsdA0KK29yZGVyIGluIHdoaWNoIGhlYWRlcnMgYXJlIG91dHB1dCBmb3IgSTxhbGw+IG1lc3NhZ2VzLg0KK0hvd2V2ZXIsIHBsZWFzZSBjb25zaWRlciB1c2luZyB0aGUgaW5zdGFuY2UgbWV0aG9kIHZhcmlhbnQgaW5zdGVhZCwNCitzbyB5b3Ugd29uJ3Qgc3RvbXAgb24gb3RoZXIgbWVzc2FnZSBzZW5kZXJzIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLg0KKw0KKw0KKz1pdGVtIE1JTUU6OkxpdGUtPnF1aWV0KCkNCisNCitUaGlzIEw8Y2xhc3NtZXRob2R8L3F1aWV0PiBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcy91bnN1cHByZXNzDQorYWxsIHdhcm5pbmdzIGNvbWluZyBmcm9tIHRoaXMgbW9kdWxlLg0KKw0KKw0KKz1pdGVtIE1JTUU6OkxpdGUtPnNlbmQoKQ0KKw0KK1doZW4gdXNlZCBhcyBhIEw8Y2xhc3NtZXRob2R8L3NlbmQ+LCB0aGlzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkNCithIGRpZmZlcmVudCBkZWZhdWx0IG1lY2hhbmlzbSBmb3Igc2VuZGluZyBtZXNzYWdlLg0KK1RoZSBpbml0aWFsIGRlZmF1bHQgaXM6DQorDQorICAgIE1JTUU6OkxpdGUtPnNlbmQoInNlbmRtYWlsIiwgIi91c3IvbGliL3NlbmRtYWlsIC10IC1vaSAtb2VtIik7DQorDQorSG93ZXZlciwgeW91IHNob3VsZCBjb25zaWRlciB0aGUgc2ltaWxhciBidXQgc21hcnRlciBhbmQgdGFpbnQtc2FmZSB2YXJpYW50Og0KKw0KKyAgICBNSU1FOjpMaXRlLT5zZW5kKCJzZW5kbWFpbCIpOw0KKw0KK09yLCBmb3Igbm9uLVVuaXggdXNlcnM6DQorDQorICAgIE1JTUU6OkxpdGUtPnNlbmQoInNtdHAiKTsNCisNCisNCis9aXRlbSAkTUlNRTo6TGl0ZTo6QVVUT19DQw0KKw0KK0lmIHRydWUsIGF1dG9tYXRpY2FsbHkgc2VuZCB0byB0aGUgQ2MvQmNjIGFkZHJlc3NlcyBmb3Igc2VuZF9ieV9zbXRwKCkuDQorRGVmYXVsdCBpcyBCPHRydWU+Lg0KKw0KKw0KKz1pdGVtICRNSU1FOjpMaXRlOjpBVVRPX0NPTlRFTlRfVFlQRQ0KKw0KK0lmIHRydWUsIHRyeSB0byBhdXRvbWF0aWNhbGx5IGNob29zZSB0aGUgY29udGVudCB0eXBlIGZyb20gdGhlIGZpbGUgbmFtZQ0KK2luIEM8bmV3KCk+L0M8YnVpbGQoKT4uICBJbiBvdGhlciB3b3Jkcywgc2V0dGluZyB0aGlzIHRydWUgY2hhbmdlcyB0aGUNCitkZWZhdWx0IEM8VHlwZT4gZnJvbSBDPCJURVhUIj4gdG8gQzwiQVVUTyI+Lg0KKw0KK0RlZmF1bHQgaXMgQjxmYWxzZT4sIHNpbmNlIHdlIG11c3QgbWFpbnRhaW4gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkNCit3aXRoIHByaW9yIGJlaGF2aW9yLiAgQjxQbGVhc2U+IGNvbnNpZGVyIGtlZXBpbmcgaXQgZmFsc2UsDQorYW5kIGp1c3QgdXNpbmcgVHlwZSAnQVVUTycgd2hlbiB5b3UgYnVpbGQoKSBvciBhdHRhY2goKS4NCisNCisNCis9aXRlbSAkTUlNRTo6TGl0ZTo6QVVUT19FTkNPREUNCisNCitJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IGNob29zZSB0aGUgZW5jb2RpbmcgZnJvbSB0aGUgY29udGVudCB0eXBlLg0KK0RlZmF1bHQgaXMgQjx0cnVlPi4NCisNCisNCis9aXRlbSAkTUlNRTo6TGl0ZTo6QVVUT19WRVJJRlkNCisNCitJZiB0cnVlLCBjaGVjayBwYXRocyB0byBhdHRhY2htZW50cyByaWdodCBiZWZvcmUgcHJpbnRpbmcsIHJhaXNpbmcgYW4gZXhjZXB0aW9uDQoraWYgYW55IHBhdGggaXMgdW5yZWFkYWJsZS4NCitEZWZhdWx0IGlzIEI8dHJ1ZT4uDQorDQorDQorPWl0ZW0gJE1JTUU6OkxpdGU6OlBBUkFOT0lEDQorDQorSWYgdHJ1ZSwgd2Ugd29uJ3QgYXR0ZW1wdCB0byB1c2UgTUlNRTo6QmFzZTY0LCBNSU1FOjpRdW90ZWRQcmludCwNCitvciBNSU1FOjpUeXBlcywgZXZlbiBpZiB0aGV5J3JlIGF2YWlsYWJsZS4NCitEZWZhdWx0IGlzIEI8ZmFsc2U+LiAgUGxlYXNlIGNvbnNpZGVyIGtlZXBpbmcgaXQgZmFsc2UsDQorYW5kIHRydXN0aW5nIHRoZXNlIG90aGVyIHBhY2thZ2VzIHRvIGRvIHRoZSByaWdodCB0aGluZy4NCisNCisNCis9YmFjaw0KKw0KKz1jdXQNCisNCityZXF1aXJlIDUuMDA0OyAgICAgIyMjIGZvciAvYyBtb2RpZmllciBpbiBtL1xHLi4uL2djIG1vZGlmaWVyDQorDQordXNlIENhcnAgKCk7DQordXNlIEZpbGVIYW5kbGU7DQorDQordXNlIHN0cmljdDsNCit1c2UgdmFycyBxdygNCisgICAgICAgICAgICAkQVVUT19DQw0KKyAgICAgICAgICAgICRBVVRPX0NPTlRFTlRfVFlQRQ0KKyAgICAgICAgICAgICRBVVRPX0VOQ09ERQ0KKyAgICAgICAgICAgICRBVVRPX1ZFUklGWQ0KKyAgICAgICAgICAgICRQQVJBTk9JRA0KKyAgICAgICAgICAgICRRVUlFVA0KKyAgICAgICAgICAgICRWQU5JTExBDQorICAgICAgICAgICAgJFZFUlNJT04NCisgICAgICAgICAgICApOw0KKw0KKw0KKw0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIw0KKyMgR0xPQkFMUywgRVhURVJOQUwvQ09ORklHVVJBVElPTi4uLg0KKyRWRVJTSU9OID0gIjMuMDEiOw0KKw0KKyMjIyBBdXRvbWF0aWNhbGx5IGludGVycHJldCBDQy9CQ0MgZm9yIFNNVFA6DQorJEFVVE9fQ0MgPSAxOw0KKw0KKyMjIyBBdXRvbWF0aWNhbGx5IGNob29zZSBjb250ZW50IHR5cGUgZnJvbSBmaWxlIG5hbWU6DQorJEFVVE9fQ09OVEVOVF9UWVBFID0gMDsNCisNCisjIyMgQXV0b21hdGljYWxseSBjaG9vc2UgZW5jb2RpbmcgZnJvbSBjb250ZW50IHR5cGU6DQorJEFVVE9fRU5DT0RFID0gMTsNCisNCisjIyMgQ2hlY2sgcGF0aHMgcmlnaHQgYmVmb3JlIHByaW50aW5nOg0KKyRBVVRPX1ZFUklGWSA9IDE7DQorDQorIyMjIFNldCB0aGlzIHRydWUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIE1JTUU6OkJhc2U2NC9RdW90ZWRQcmludC9UeXBlczoNCiskUEFSQU5PSUQgPSAwOw0KKw0KKyMjIyBEb24ndCB3YXJuIG1lIGFib3V0IGRhbmdlcm91cyBhY3Rpdml0aWVzOg0KKyRRVUlFVCA9IHVuZGVmOw0KKw0KKyMjIyBVbnN1cHBvcnRlZCAoZm9yIHRlc3RlciB1c2UpOiBkb24ndCBxdWFsaWZ5IGJvdW5kYXJ5IHdpdGggdGltZS9waWQ6DQorJFZBTklMTEEgPSAwOw0KKw0KKw0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIw0KKyMgR0xPQkFMUywgSU5URVJOQUwuLi4NCisNCisjIyMgRmluZCBzZW5kbWFpbDoNCitteSAkU0VORE1BSUwgPSAgICAgICAgICAgICAgICAgIi91c3IvbGliL3NlbmRtYWlsIjsNCisoLXggJFNFTkRNQUlMKSBvciAoJFNFTkRNQUlMID0gIi91c3Ivc2Jpbi9zZW5kbWFpbCIpOw0KKygteCAkU0VORE1BSUwpIG9yICgkU0VORE1BSUwgPSAic2VuZG1haWwiKTsNCisNCisjIyMgT3VyIHNlbmRpbmcgZmFjaWxpdGllczoNCitteSAkU2VuZGVyICAgICA9ICJzZW5kbWFpbCI7DQorbXkgJVNlbmRlckFyZ3MgPSAoDQorICAgICJzZW5kbWFpbCIgPT4gWyIkU0VORE1BSUwgLXQgLW9pIC1vZW0iXSwNCisgICAgInNtdHAiICAgICA9PiBbXSwNCisgICAgInN1YiIgICAgICA9PiBbXSwNCispOw0KKw0KKyMjIyBCb3VuZGFyeSBjb3VudGVyOg0KK215ICRCQ291bnQgPSAwOw0KKw0KKyMjIyBLbm93biBNYWlsL01JTUUgZmllbGRzLi4uIHRoZXNlLCBwbHVzIHNvbWUgZ2VuZXJhbCBmb3JtcyBsaWtlDQorIyMjICJ4LSoiLCBhcmUgcmVjb2duaXplZCBieSBidWlsZCgpOg0KK215ICVLbm93bkZpZWxkID0gbWFwIHskXz0+MX0NCitxdygNCisgICBiY2MgICAgICAgICBjYyAgICAgICAgICBjb21tZW50cyAgICAgIGRhdGUgICAgICAgICAgZW5jcnlwdGVkDQorICAgZnJvbSAgICAgICAga2V5d29yZHMgICAgbWVzc2FnZS1pZCAgICBtaW1lLXZlcnNpb24gIG9yZ2FuaXphdGlvbg0KKyAgIHJlY2VpdmVkICAgIHJlZmVyZW5jZXMgIHJlcGx5LXRvICAgICAgcmV0dXJuLXBhdGggICBzZW5kZXINCisgICBzdWJqZWN0ICAgICB0bw0KKw0KKyAgIGFwcHJvdmVkDQorICAgKTsNCisNCisjIyMgV2hhdCBleHRlcm5hbCBwYWNrYWdlcyBkbyB3ZSB1c2UgZm9yIGVuY29kaW5nPw0KK215IEBVc2VzOw0KKw0KKyMjIyBIZWFkZXIgb3JkZXI6DQorbXkgQEZpZWxkT3JkZXI7DQorDQorIyMjIFNlZSBpZiB3ZSBoYXZlIEZpbGU6OkJhc2VuYW1lDQorbXkgJEhhdmVGaWxlQmFzZW5hbWUgPSAwOw0KK2lmIChldmFsICJyZXF1aXJlIEZpbGU6OkJhc2VuYW1lIikgeyAjIG5vdCBhZmZlY3RlZCBieSAkUEFSQU5PSUQsIGNvcmUgUGVybA0KKyAgJEhhdmVGaWxlQmFzZW5hbWUgPSAxOw0KKyAgcHVzaCBAVXNlcywgIkYkRmlsZTo6QmFzZW5hbWU6OlZFUlNJT04iOw0KK30NCisNCisjIyMgU2VlIGlmIHdlIGhhdmUvd2FudCBNSU1FOjpUeXBlcw0KK215ICRIYXZlTWltZVR5cGVzPTA7DQoraWYgKCEkUEFSQU5PSUQgYW5kIGV2YWwgInJlcXVpcmUgTUlNRTo6VHlwZXM7IE1JTUU6OlR5cGVzLT5WRVJTSU9OKDEuMDA0KTsiKSB7DQorICAkSGF2ZU1pbWVUeXBlcyA9IDE7DQorICBwdXNoIEBVc2VzLCAiVCRNSU1FOjpUeXBlczo6VkVSU0lPTiI7DQorfQ0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIw0KKyMgUFJJVkFURSBVVElMSVRZIEZVTkNUSU9OUy4uLg0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjDQorIyBmb2xkIFNUUklORw0KKyMNCisjIE1ha2UgU1RSSU5HIHNhZmUgYXMgYSBmaWVsZCB2YWx1ZS4gIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UsDQorIyBhbmQgbWFrZSBzdXJlIG5ld2xpbmVzIGFyZSByZXByZXNlbnRlZCBhcyBuZXdsaW5lK3NwYWNlDQorDQorc3ViIGZvbGQgew0KKyAgICBteSAkc3RyID0gc2hpZnQ7DQorICAgICRzdHIgPX4gcy9eXHMqfFxzKiQvL2c7ICAgICMjIyB0cmltDQorICAgICRzdHIgPX4gcy9cbi9cbiAvZzsNCisgICAgJHN0cjsNCit9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMNCisjIGdlbl9ib3VuZGFyeQ0KKyMNCisjIEdlbmVyYXRlIGEgbmV3IGJvdW5kYXJ5IHRvIHVzZS4NCisjIFRoZSB1bnN1cHBvcnRlZCAkVkFOSUxMQSBpcyBmb3IgdGVzdCBwdXJwb3NlcyBvbmx5Lg0KKw0KK3N1YiBnZW5fYm91bmRhcnkgew0KKyAgICByZXR1cm4gKCJfLS0tLS0tLS0tLT1fIi4oJFZBTklMTEEgPyAnJyA6IGludCh0aW1lKS4kJCkuJEJDb3VudCsrKTsNCit9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMNCisjIGtub3duX2ZpZWxkIEZJRUxETkFNRQ0KKyMNCisjIElzIHRoaXMgYSByZWNvZ25pemVkIE1haWwvTUlNRSBmaWVsZD8NCisNCitzdWIga25vd25fZmllbGQgew0KKyAgICBteSAkZmllbGQgPSBsYyhzaGlmdCk7DQorICAgICRLbm93bkZpZWxkeyRmaWVsZH0gb3IgKCRmaWVsZCA9fiBte14oY29udGVudHxyZXNlbnR8eCktLn0pOw0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIw0KKyMgaXNfbWltZV9maWVsZCBGSUVMRE5BTUUNCisjDQorIyBJcyB0aGlzIGEgZmllbGQgSSBtYW5hZ2U/DQorDQorc3ViIGlzX21pbWVfZmllbGQgew0KKyAgICAkX1swXSA9fiAvXihtaW1lXC18Y29udGVudFwtKS9pOw0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIw0KKyMgZXh0cmFjdF9hZGRycyBTVFJJTkcNCisjDQorIyBTcGxpdCBTVFJJTkcgaW50byBhbiBhcnJheSBvZiBlbWFpbCBhZGRyZXNzZXM6IHNvbWV3aGF0IG9mIGEgS0xVREdFLg0KKyMNCisjIFVubGVzcyBwYXJhbm9pZCwgd2UgdHJ5IHRvIGxvYWQgdGhlIHJlYWwgY29kZSBiZWZvcmUgc3VwcGx5aW5nIG91ciBvd24uDQorDQorbXkgJEFUT00gICAgICA9ICdbXiBcMDAwLVwwMzcoKTw+QCw7OlwxMzQiXDA1NlwxMzNcMTM1XSsnOw0KK215ICRRU1RSICAgICAgPSAnIi4qPyInOw0KK215ICRXT1JEICAgICAgPSAnKD86JyAuICRRU1RSIC4gJ3wnIC4gJEFUT00gLiAnKSc7DQorbXkgJERPTUFJTiAgICA9ICcoPzonIC4gJEFUT00gLiAnKD86JyAuICdcXC4nIC4gJEFUT00gLiAnKSonIC4gJyknOw0KK215ICRMT0NBTFBBUlQgPSAnKD86JyAuICRXT1JEIC4gJyg/OicgLiAnXFwuJyAuICRXT1JEIC4gJykqJyAuICcpJzsNCitteSAkQUREUiAgICAgID0gJyg/OicgLiAkTE9DQUxQQVJUIC4gJ0AnIC4gJERPTUFJTiAuICcpJzsNCitteSAkUEhSQVNFICAgID0gJyg/OicgLiAkV09SRCAuICcpKyc7DQorbXkgJFNFUCAgICAgICA9ICIoPzpeXFxzKnxcXHMqLFxccyopIjsgICAgICMjIyBiZWZvcmUgZWxlbXMgaW4gYSBsaXN0DQorDQorc3ViIG15X2V4dHJhY3RfYWRkcnMgew0KKyAgICBteSAkc3RyID0gc2hpZnQ7DQorICAgIG15IEBhZGRyczsNCisgICAgJHN0ciA9fiBzL1xzLyAvZzsgICAgICMjIyBjb2xsYXBzZSB3aGl0ZXNwYWNlDQorDQorICAgIHBvcygkc3RyKSA9IDA7DQorICAgIHdoaWxlICgkc3RyICF+IG17XEdccypcWn1nY28pIHsNCisJIyMjIHByaW50IFNUREVSUiAiVEFDS0xJTkc6ICIuc3Vic3RyKCRzdHIsIHBvcygkc3RyKSkuIlxuIjsNCisJaWYgICAgKCRzdHIgPX4gbXtcRyRTRVAkUEhSQVNFXHMqPFxzKigkQUREUilccyo+fWdjbykge3B1c2ggQGFkZHJzLCQxfQ0KKwllbHNpZiAoJHN0ciA9fiBte1xHJFNFUCgkQUREUil9Z2NvKSAgICAgICAgICAgICAgICAgICB7cHVzaCBAYWRkcnMsJDF9DQorCWVsc2lmICgkc3RyID1+IG17XEckU0VQKCRBVE9NKX1nY28pICAgICAgICAgICAgICAgICAgIHtwdXNoIEBhZGRycywkMX0NCisJZWxzZSB7DQorCSAgICBteSAkcHJvYmxlbSA9IHN1YnN0cigkc3RyLCBwb3MoJHN0cikpOw0KKwkgICAgZGllICJjYW4ndCBleHRyYWN0IGFkZHJlc3MgYXQgPCRwcm9ibGVtPiBpbiA8JHN0cj5cbiI7DQorCX0NCisgICAgfQ0KKyAgICByZXR1cm4gQGFkZHJzOw0KK30NCisNCitpZiAoZXZhbCAicmVxdWlyZSBNYWlsOjpBZGRyZXNzIikgew0KKyAgICBwdXNoIEBVc2VzLCAiQSRNYWlsOjpBZGRyZXNzOjpWRVJTSU9OIjsNCisgICAgZXZhbCBxew0KKwlzdWIgZXh0cmFjdF9hZGRycyB7DQorCSAgICByZXR1cm4gbWFwIHsgJF8tPmZvcm1hdCB9IE1haWw6OkFkZHJlc3MtPnBhcnNlKCRfWzBdKTsNCisJfQ0KKyAgICB9OyAjIyMgcQ0KK30NCitlbHNlIHsNCisgICAgZXZhbCBxew0KKyAgICAgICAgc3ViIGV4dHJhY3RfYWRkcnMgew0KKwkgICAgcmV0dXJuIG15X2V4dHJhY3RfYWRkcnMoQF8pOw0KKwl9DQorICAgIH07ICMjIyBxDQorfSAjIyMgaWYNCisNCisNCisNCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMNCisjIFBSSVZBVEUgRU5DT0RJTkcgRlVOQ1RJT05TLi4uDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMNCisjIGVuY29kZV9iYXNlNjQgU1RSSU5HDQorIw0KKyMgRW5jb2RlIHRoZSBnaXZlbiBzdHJpbmcgdXNpbmcgQkFTRTY0Lg0KKyMgVW5sZXNzIHBhcmFub2lkLCB3ZSB0cnkgdG8gbG9hZCB0aGUgcmVhbCBjb2RlIGJlZm9yZSBzdXBwbHlpbmcgb3VyIG93bi4NCisNCitpZiAoISRQQVJBTk9JRCBhbmQgZXZhbCAicmVxdWlyZSBNSU1FOjpCYXNlNjQiKSB7DQorICAgIGltcG9ydCBNSU1FOjpCYXNlNjQgcXcoZW5jb2RlX2Jhc2U2NCk7DQorICAgIHB1c2ggQFVzZXMsICJCJE1JTUU6OkJhc2U2NDo6VkVSU0lPTiI7DQorfQ0KK2Vsc2Ugew0KKyAgICBldmFsIHF7DQorc3ViIGVuY29kZV9iYXNlNjQgew0KKyAgICBteSAkcmVzID0gIiI7DQorICAgIG15ICRlb2wgPSAiXG4iOw0KKw0KKyAgICBwb3MoJF9bMF0pID0gMDsgICAgICAgICMjIyB0aGFua3MsIEFuZHJlYXMhDQorICAgIHdoaWxlICgkX1swXSA9fiAvKC57MSw0NX0pL2dzKSB7DQorCSRyZXMgLj0gc3Vic3RyKHBhY2soJ3UnLCAkMSksIDEpOw0KKwljaG9wKCRyZXMpOw0KKyAgICB9DQorICAgICRyZXMgPX4gdHJ8YCAtX3xBQS1aYS16MC05Ky98Ow0KKw0KKyAgICAjIyMgRml4IHBhZGRpbmcgYXQgdGhlIGVuZDoNCisgICAgbXkgJHBhZGRpbmcgPSAoMyAtIGxlbmd0aCgkX1swXSkgJSAzKSAlIDM7DQorICAgICRyZXMgPX4gcy8ueyRwYWRkaW5nfSQvJz0nIHggJHBhZGRpbmcvZSBpZiAkcGFkZGluZzsNCisNCisgICAgIyMjIEJyZWFrIGVuY29kZWQgc3RyaW5nIGludG8gbGluZXMgb2Ygbm8gbW9yZSB0aGFuIDc2IGNoYXJhY3RlcnMgZWFjaDoNCisgICAgJHJlcyA9fiBzLyguezEsNzZ9KS8kMSRlb2wvZyBpZiAobGVuZ3RoICRlb2wpOw0KKyAgICByZXR1cm4gJHJlczsNCit9ICMjIyBzdWINCisgIH0gIyMjIHENCit9ICMjIyBpZg0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjDQorIyBlbmNvZGVfcXAgU1RSSU5HDQorIw0KKyMgRW5jb2RlIHRoZSBnaXZlbiBzdHJpbmcsIExJTkUgQlkgTElORSwgdXNpbmcgUVVPVEVELVBSSU5UQUJMRS4NCisjIFN0b2xlbiBmcm9tIE1JTUU6OlF1b3RlZFByaW50IGJ5IEdpc2xlIEFhcywgd2l0aCBhIHNsaWdodCBidWcgZml4OiB3ZQ0KKyMgYnJlYWsgbGluZXMgZWFybGllci4gIE5vdGljZSB0aGF0IHRoaXMgc2VlbXMgbm90IHRvIHdvcmsgdW5sZXNzDQorIyBlbmNvZGluZyBsaW5lIGJ5IGxpbmUuDQorIw0KKyMgVW5sZXNzIHBhcmFub2lkLCB3ZSB0cnkgdG8gbG9hZCB0aGUgcmVhbCBjb2RlIGJlZm9yZSBzdXBwbHlpbmcgb3VyIG93bi4NCisNCitpZiAoISRQQVJBTk9JRCBhbmQgZXZhbCAicmVxdWlyZSBNSU1FOjpRdW90ZWRQcmludCIpIHsNCisgICAgaW1wb3J0IE1JTUU6OlF1b3RlZFByaW50IHF3KGVuY29kZV9xcCk7DQorICAgIHB1c2ggQFVzZXMsICJRJE1JTUU6OlF1b3RlZFByaW50OjpWRVJTSU9OIjsNCit9DQorZWxzZSB7DQorICAgIGV2YWwgcXsNCitzdWIgZW5jb2RlX3FwIHsNCisgICAgbXkgJHJlcyA9IHNoaWZ0Ow0KKyAgICBsb2NhbCgkXyk7DQorICAgICRyZXMgPX4gcy8oW14gXHRcbiEtPD4tfl0pL3NwcmludGYoIj0lMDJYIiwgb3JkKCQxKSkvZWc7ICAjIyMgcnVsZSAjMiwjMw0KKyAgICAkcmVzID1+IHMvKFsgXHRdKykkLw0KKyAgICAgIGpvaW4oJycsIG1hcCB7IHNwcmludGYoIj0lMDJYIiwgb3JkKCRfKSkgfQ0KKwkgICAgICAgICAgIHNwbGl0KCcnLCAkMSkNCisgICAgICApL2VnbTsgICAgICAgICAgICAgICAgICAgICAgICAjIyMgcnVsZSAjMyAoZW5jb2RlIHdoaXRlc3BhY2UgYXQgZW9sKQ0KKw0KKyAgICAjIyMgcnVsZSAjNSAobGluZXMgc2hvcnRlciB0aGFuIDc2IGNoYXJzLCBidXQgY2FuJ3QgYnJlYWsgPVhYIGVzY2FwZXM6DQorICAgIG15ICRicm9rZW5saW5lcyA9ICIiOw0KKyAgICAkYnJva2VubGluZXMgLj0gIiQxPVxuIiB3aGlsZSAkcmVzID1+IHMvXiguezcwfShbXj1dezJ9KT8pLy87ICMjIyA3MCB3YXMgNzQNCisgICAgJGJyb2tlbmxpbmVzID1+IHMvPVxuJC8vIHVubGVzcyBsZW5ndGggJHJlczsNCisgICAgIiRicm9rZW5saW5lcyRyZXMiOw0KK30gIyMjIHN1Yg0KKyAgfSAjIyMgcQ0KK30gIyMjIGlmDQorDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMNCisjIGVuY29kZV84Yml0IFNUUklORw0KKyMNCisjIEVuY29kZSB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIDhCSVQuDQorIyBUaGlzIGJyZWFrcyBsb25nIGxpbmVzIGludG8gc2hvcnRlciBvbmVzLg0KKw0KK3N1YiBlbmNvZGVfOGJpdCB7DQorICAgIG15ICRzdHIgPSBzaGlmdDsNCisgICAgJHN0ciA9fiBzL14oLns5OTB9KS8kMVxuL21nOw0KKyAgICAkc3RyOw0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIw0KKyMgZW5jb2RlXzdiaXQgU1RSSU5HDQorIw0KKyMgRW5jb2RlIHRoZSBnaXZlbiBzdHJpbmcgdXNpbmcgN0JJVC4NCisjIFRoaXMgTk8gTE9OR0VSIHByb3RlY3RzIHBlb3BsZSB0aHJvdWdoIGVuY29kaW5nLg0KKw0KK3N1YiBlbmNvZGVfN2JpdCB7DQorICAgIG15ICRzdHIgPSBzaGlmdDsNCisgICAgJHN0ciA9fiBzL1tceDgwLVx4RkZdLy9nOw0KKyAgICAkc3RyID1+IHMvXiguezk5MH0pLyQxXG4vbWc7DQorICAgICRzdHI7DQorfQ0KKw0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorPWhlYWQyIENvbnN0cnVjdGlvbg0KKw0KKz1vdmVyIDQNCisNCis9Y3V0DQorDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIG5ldyBbUEFSQU1IQVNIXQ0KKw0KK0k8Q2xhc3MgbWV0aG9kLCBjb25zdHJ1Y3Rvci4+DQorQ3JlYXRlIGEgbmV3IG1lc3NhZ2Ugb2JqZWN0Lg0KKw0KK0lmIGFueSBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGV5IGFyZSBwYXNzZWQgaW50byBDPGJ1aWxkKCk+OyBvdGhlcndpc2UsDQoranVzdCB0aGUgZW1wdHkgb2JqZWN0IGlzIGNyZWF0ZWQuDQorDQorPWN1dA0KKw0KK3N1YiBuZXcgew0KKyAgICBteSAkY2xhc3MgPSBzaGlmdDsNCisNCisgICAgIyMjIENyZWF0ZSBiYXNpYyBvYmplY3Q6DQorICAgIG15ICRzZWxmID0gew0KKwlBdHRycyAgID0+IHt9LCAgICAgIyMjIE1JTUUgYXR0cmlidXRlcw0KKwlIZWFkZXIgID0+IFtdLCAgICAgIyMjIGV4cGxpY2l0IG1lc3NhZ2UgaGVhZGVycw0KKwlQYXJ0cyAgID0+IFtdLCAgICAgIyMjIGFycmF5IG9mIHBhcnRzDQorICAgIH07DQorICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7DQorDQorICAgICMjIyBCdWlsZCwgaWYgbmVlZGVkOg0KKyAgICByZXR1cm4gKEBfID8gJHNlbGYtPmJ1aWxkKEBfKSA6ICRzZWxmKTsNCit9DQorDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIGF0dGFjaCBQQVJUDQorDQorPWl0ZW0gYXR0YWNoIFBBUkFNSEFTSC4uLg0KKw0KK0k8SW5zdGFuY2UgbWV0aG9kLj4NCitBZGQgYSBuZXcgcGFydCB0byB0aGlzIG1lc3NhZ2UsIGFuZCByZXR1cm4gdGhlIG5ldyBwYXJ0Lg0KKw0KK0lmIHlvdSBzdXBwbHkgYSBzaW5nbGUgUEFSVCBhcmd1bWVudCwgaXQgd2lsbCBiZSByZWdhcmRlZA0KK2FzIGEgTUlNRTo6TGl0ZSBvYmplY3QgdG8gYmUgYXR0YWNoZWQuICBPdGhlcndpc2UsIHRoaXMNCittZXRob2QgYXNzdW1lcyB0aGF0IHlvdSBhcmUgZ2l2aW5nIGluIHRoZSBwYWlycyBvZiBhIFBBUkFNSEFTSA0KK3doaWNoIHdpbGwgYmUgc2VudCBpbnRvIEM8bmV3KCk+IHRvIGNyZWF0ZSB0aGUgbmV3IHBhcnQuDQorDQorT25lIG9mIHRoZSBwb3NzaWJseS1xdWl0ZS11c2VmdWwgaGFja3MgdGhyb3duIGludG8gdGhpcyBpcyB0aGUNCisiYXR0YWNoLXRvLXNpbmdsZXBhcnQiIGhhY2s6IGlmIHlvdSBhdHRlbXB0IHRvIGF0dGFjaCBhIHBhcnQgKGxldCdzDQorY2FsbCBpdCAicGFydCAxIikgdG8gYSBtZXNzYWdlIHRoYXQgZG9lc24ndCBoYXZlIGEgY29udGVudC10eXBlDQorb2YgIm11bHRpcGFydCIgb3IgIm1lc3NhZ2UiLCB0aGUgZm9sbG93aW5nIGhhcHBlbnM6DQorDQorPW92ZXIgNA0KKw0KKz1pdGVtICoNCisNCitBIG5ldyBwYXJ0IChjYWxsIGl0ICJwYXJ0IDAiKSBpcyBtYWRlLg0KKw0KKz1pdGVtICoNCisNCitUaGUgTUlNRSBhdHRyaWJ1dGVzIGFuZCBkYXRhIChidXQgSTxub3Q+IHRoZSBvdGhlciBoZWFkZXJzKQ0KK2FyZSBjdXQgZnJvbSB0aGUgInNlbGYiIG1lc3NhZ2UsIGFuZCBwYXN0ZWQgaW50byAicGFydCAwIi4NCisNCis9aXRlbSAqDQorDQorVGhlICJzZWxmIiBpcyB0dXJuZWQgaW50byBhICJtdWx0aXBhcnQvbWl4ZWQiIG1lc3NhZ2UuDQorDQorPWl0ZW0gKg0KKw0KK1RoZSBuZXcgInBhcnQgMCIgaXMgYWRkZWQgdG8gdGhlICJzZWxmIiwgYW5kIEk8dGhlbj4gInBhcnQgMSIgaXMgYWRkZWQuDQorDQorPWJhY2sNCisNCitPbmUgb2YgdGhlIG5pY2Ugc2lkZS1lZmZlY3RzIGlzIHRoYXQgeW91IGNhbiBjcmVhdGUgYSB0ZXh0IG1lc3NhZ2UNCithbmQgdGhlbiBhZGQgemVybyBvciBtb3JlIGF0dGFjaG1lbnRzIHRvIGl0LCBtdWNoIGluIHRoZSBzYW1lIHdheQ0KK3RoYXQgYSB1c2VyIGFnZW50IGxpa2UgTmV0c2NhcGUgYWxsb3dzIHlvdSB0byBkby4NCisNCis9Y3V0DQorDQorc3ViIGF0dGFjaCB7DQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorDQorICAgICMjIyBDcmVhdGUgbmV3IHBhcnQsIGlmIG5lY2Vzc2FyeToNCisgICAgbXkgJHBhcnQxID0gKChAXyA9PSAxKSA/IHNoaWZ0IDogcmVmKCRzZWxmKS0+bmV3KFRvcD0+MCwgQF8pKTsNCisNCisgICAgIyMjIERvIHRoZSAiYXR0YWNoLXRvLXNpbmdsZXBhcnQiIGhhY2s6DQorICAgIGlmICgkc2VsZi0+YXR0cignY29udGVudC10eXBlJykgIX4gbXteKG11bHRpcGFydHxtZXNzYWdlKS99aSkgew0KKw0KKwkjIyMgQ3JlYXRlIHBhcnQgemVybzoNCisJbXkgJHBhcnQwID0gcmVmKCRzZWxmKS0+bmV3Ow0KKw0KKwkjIyMgQ3V0IE1JTUUgc3R1ZmYgZnJvbSBzZWxmLCBhbmQgcGFzdGUgaW50byBwYXJ0IHplcm86DQorCWZvcmVhY2ggKHF3KEF0dHJzIERhdGEgUGF0aCBGSCkpIHsNCisJICAgICRwYXJ0MC0+eyRffSA9ICRzZWxmLT57JF99OyBkZWxldGUoJHNlbGYtPnskX30pOw0KKwl9DQorCSRwYXJ0MC0+dG9wX2xldmVsKDApOyAgICAjIyMgY2xlYXIgdG9wLWxldmVsIGF0dHJpYnV0ZXMNCisNCisJIyMjIE1ha2Ugc2VsZiBhIHRvcC1sZXZlbCBtdWx0aXBhcnQ6DQorCSRzZWxmLT57QXR0cnN9IHx8PSB7fTsgICAjIyMgcmVzZXQNCisJJHNlbGYtPmF0dHIoJ2NvbnRlbnQtdHlwZScgICAgICAgICAgICAgID0+ICdtdWx0aXBhcnQvbWl4ZWQnKTsNCisJJHNlbGYtPmF0dHIoJ2NvbnRlbnQtdHlwZS5ib3VuZGFyeScgICAgID0+IGdlbl9ib3VuZGFyeSgpKTsNCisJJHNlbGYtPmF0dHIoJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnID0+ICc3Yml0Jyk7DQorCSRzZWxmLT50b3BfbGV2ZWwoMSk7ICAgICAjIyMgYWN0aXZhdGUgdG9wLWxldmVsIGF0dHJpYnV0ZXMNCisNCisJIyMjIEFkZCBwYXJ0IDA6DQorCXB1c2ggQHskc2VsZi0+e1BhcnRzfX0sICRwYXJ0MDsNCisgICAgfQ0KKw0KKyAgICAjIyMgQWRkIHRoZSBuZXcgcGFydDoNCisgICAgcHVzaCBAeyRzZWxmLT57UGFydHN9fSwgJHBhcnQxOw0KKyAgICAkcGFydDE7DQorfQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCis9aXRlbSBidWlsZCBbUEFSQU1IQVNIXQ0KKw0KK0k8Q2xhc3MvaW5zdGFuY2UgbWV0aG9kLCBpbml0aWFsaXplci4+DQorQ3JlYXRlIChvciBpbml0aWFsaXplKSBhIE1JTUUgbWVzc2FnZSBvYmplY3QuDQorTm9ybWFsbHksIHlvdSdsbCB1c2UgdGhlIGZvbGxvd2luZyBrZXlzIGluIFBBUkFNSEFTSDoNCisNCisgICAqIERhdGEsIEZILCBvciBQYXRoICAgICAgKGVpdGhlciBvbmUgb2YgdGhlc2UsIG9yIG5vbmUgaWYgbXVsdGlwYXJ0KQ0KKyAgICogVHlwZSAgICAgICAgICAgICAgICAgICAoZS5nLiwgImltYWdlL2pwZWciKQ0KKyAgICogRnJvbSwgVG8sIGFuZCBTdWJqZWN0ICAoaWYgdGhpcyBpcyB0aGUgInRvcCBsZXZlbCIgb2YgYSBtZXNzYWdlKQ0KKw0KK1RoZSBQQVJBTUhBU0ggY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBrZXlzOg0KKw0KKz1vdmVyIDQNCisNCis9aXRlbSAoZmllbGRuYW1lKQ0KKw0KK0FueSBmaWVsZCB5b3Ugd2FudCBwbGFjZWQgaW4gdGhlIG1lc3NhZ2UgaGVhZGVyLCB0YWtlbiBmcm9tIHRoZQ0KK3N0YW5kYXJkIGxpc3Qgb2YgaGVhZGVyIGZpZWxkcyAoeW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgY2FzZSk6DQorDQorICAgIEFwcHJvdmVkICAgICAgRW5jcnlwdGVkICAgICBSZWNlaXZlZCAgICAgIFNlbmRlcg0KKyAgICBCY2MgICAgICAgICAgIEZyb20gICAgICAgICAgUmVmZXJlbmNlcyAgICBTdWJqZWN0DQorICAgIENjICAgICAgICAgICAgS2V5d29yZHMgICAgICBSZXBseS1UbyAgICAgIFRvDQorICAgIENvbW1lbnRzICAgICAgTWVzc2FnZS1JRCAgICBSZXNlbnQtKiAgICAgIFgtKg0KKyAgICBDb250ZW50LSogICAgIE1JTUUtVmVyc2lvbiAgUmV0dXJuLVBhdGgNCisgICAgRGF0ZSAgICAgICAgICAgICAgICAgICAgICAgIE9yZ2FuaXphdGlvbg0KKw0KK1RvIGdpdmUgZXhwZXJpZW5jZWQgdXNlcnMgc29tZSB2ZXRvIHBvd2VyLCB0aGVzZSBmaWVsZHMgd2lsbCBiZSBzZXQNCitJPGFmdGVyPiB0aGUgb25lcyBJIHNldC4uLiBzbyBiZSBjYXJlZnVsOiBJPGRvbid0IHNldCBhbnkgTUlNRSBmaWVsZHM+DQorKGxpa2UgQzxDb250ZW50LXR5cGU+KSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmchDQorDQorVG8gc3BlY2lmeSBhIGZpZWxkbmFtZSB0aGF0J3MgSTxub3Q+IGluIHRoZSBhYm92ZSBsaXN0LCBldmVuIG9uZSB0aGF0J3MNCitpZGVudGljYWwgdG8gYW4gb3B0aW9uIGJlbG93LCBqdXN0IGdpdmUgaXQgd2l0aCBhIHRyYWlsaW5nIEM8IjoiPiwNCitsaWtlIEM8Ik15LWZpZWxkOiI+LiAgV2hlbiBpbiBkb3VidCwgdGhhdCBJPGFsd2F5cz4gc2lnbmFscyBhIG1haWwNCitmaWVsZCAoYW5kIGl0IHNvcnQgb2YgbG9va3MgbGlrZSBvbmUgdG9vKS4NCisNCis9aXRlbSBEYXRhDQorDQorSTxBbHRlcm5hdGl2ZSB0byAiUGF0aCIgb3IgIkZIIi4+DQorVGhlIGFjdHVhbCBtZXNzYWdlIGRhdGEuICBUaGlzIG1heSBiZSBhIHNjYWxhciBvciBhIHJlZiB0byBhbiBhcnJheSBvZg0KK3N0cmluZ3M7IGlmIHRoZSBsYXR0ZXIsIHRoZSBtZXNzYWdlIGNvbnNpc3RzIG9mIGEgc2ltcGxlIGNvbmNhdGVuYXRpb24NCitvZiBhbGwgdGhlIHN0cmluZ3MgaW4gdGhlIGFycmF5Lg0KKw0KKz1pdGVtIERhdGVzdGFtcA0KKw0KK0k8T3B0aW9uYWwuPg0KK0lmIGdpdmVuIHRydWUgKG9yIG9taXR0ZWQpLCB3ZSBmb3JjZSB0aGUgY3JlYXRpb24gb2YgYSBDPERhdGU6PiBmaWVsZA0KK3N0YW1wZWQgd2l0aCB0aGUgY3VycmVudCBkYXRlL3RpbWUgaWYgdGhpcyBpcyBhIHRvcC1sZXZlbCBtZXNzYWdlLg0KK1lvdSBtYXkgd2FudCB0aGlzIGlmIHVzaW5nIEw8c2VuZF9ieV9zbXRwKCl8L3NlbmRfYnlfc210cD4uDQorSWYgeW91IGRvbid0IHdhbnQgdGhpcyB0byBiZSBkb25lLCBlaXRoZXIgcHJvdmlkZSB5b3VyIG93biBEYXRlDQorb3IgZXhwbGljaXRseSBzZXQgdGhpcyB0byBmYWxzZS4NCisNCis9aXRlbSBEaXNwb3NpdGlvbg0KKw0KK0k8T3B0aW9uYWwuPg0KK1RoZSBjb250ZW50IGRpc3Bvc2l0aW9uLCBDPCJpbmxpbmUiPiBvciBDPCJhdHRhY2htZW50Ij4uDQorVGhlIGRlZmF1bHQgaXMgQzwiaW5saW5lIj4uDQorDQorPWl0ZW0gRW5jb2RpbmcNCisNCitJPE9wdGlvbmFsLj4NCitUaGUgY29udGVudCB0cmFuc2ZlciBlbmNvZGluZyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGVuY29kZSB5b3VyIGRhdGE6DQorDQorICAgVXNlIGVuY29kaW5nOiAgICAgfCBJZiB5b3VyIG1lc3NhZ2UgY29udGFpbnM6DQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorICAgN2JpdCAgICAgICAgICAgICAgfCBPbmx5IDctYml0IHRleHQsIGFsbCBsaW5lcyA8MTAwMCBjaGFyYWN0ZXJzDQorICAgOGJpdCAgICAgICAgICAgICAgfCA4LWJpdCB0ZXh0LCBhbGwgbGluZXMgPDEwMDAgY2hhcmFjdGVycw0KKyAgIHF1b3RlZC1wcmludGFibGUgIHwgOC1iaXQgdGV4dCBvciBsb25nIGxpbmVzIChtb3JlIHJlbGlhYmxlIHRoYW4gIjhiaXQiKQ0KKyAgIGJhc2U2NCAgICAgICAgICAgIHwgTGFyZ2VseSBub24tdGV4dHVhbCBkYXRhOiBhIEdJRiwgYSB0YXIgZmlsZSwgZXRjLg0KKw0KK1RoZSBkZWZhdWx0IGlzIHRha2VuIGZyb20gdGhlIFR5cGU7IGdlbmVyYWxseSBpdCBpcyAiYmluYXJ5IiAobm8NCitlbmNvZGluZykgZm9yIHRleHQvKiwgbWVzc2FnZS8qLCBhbmQgbXVsdGlwYXJ0LyosIGFuZCAiYmFzZTY0IiBmb3INCitldmVyeXRoaW5nIGVsc2UuICBBIHZhbHVlIG9mIEM8ImJpbmFyeSI+IGlzIGdlbmVyYWxseSBJPG5vdD4gc3VpdGFibGUNCitmb3Igc2VuZGluZyBhbnl0aGluZyBidXQgQVNDSUkgdGV4dCBmaWxlcyB3aXRoIGxpbmVzIHVuZGVyIDEwMDANCitjaGFyYWN0ZXJzLCBzbyBjb25zaWRlciB1c2luZyBvbmUgb2YgdGhlIG90aGVyIHZhbHVlcyBpbnN0ZWFkLg0KKw0KK0luIHRoZSBjYXNlIG9mICI3Yml0Ii8iOGJpdCIsIGxvbmcgbGluZXMgYXJlIGF1dG9tYXRpY2FsbHkgY2hvcHBlZCB0bw0KK2xlZ2FsIGxlbmd0aDsgaW4gdGhlIGNhc2Ugb2YgIjdiaXQiLCBhbGwgOC1iaXQgY2hhcmFjdGVycyBhcmUNCithdXRvbWF0aWNhbGx5IEk8cmVtb3ZlZD4uICBUaGlzIG1heSBub3QgYmUgd2hhdCB5b3Ugd2FudCwgc28gcGljayB5b3VyDQorZW5jb2Rpbmcgd2VsbCEgIEZvciBtb3JlIGluZm8sIHNlZSBMPCJBIE1JTUUgUFJJTUVSIj4uDQorDQorPWl0ZW0gRkgNCisNCitJPEFsdGVybmF0aXZlIHRvICJEYXRhIiBvciAiUGF0aCIuPg0KK0ZpbGVoYW5kbGUgY29udGFpbmluZyB0aGUgZGF0YSwgb3BlbmVkIGZvciByZWFkaW5nLg0KK1NlZSAiUmVhZE5vdyIgYWxzby4NCisNCis9aXRlbSBGaWxlbmFtZQ0KKw0KK0k8T3B0aW9uYWwuPg0KK1RoZSBuYW1lIG9mIHRoZSBhdHRhY2htZW50LiAgWW91IGNhbiB1c2UgdGhpcyB0byBzdXBwbHkgYQ0KK3JlY29tbWVuZGVkIGZpbGVuYW1lIGZvciB0aGUgZW5kLXVzZXIgd2hvIGlzIHNhdmluZyB0aGUgYXR0YWNobWVudA0KK3RvIGRpc2suICBZb3Ugb25seSBuZWVkIHRoaXMgaWYgdGhlIGZpbGVuYW1lIGF0IHRoZSBlbmQgb2YgdGhlDQorIlBhdGgiIGlzIGluYWRlcXVhdGUsIG9yIGlmIHlvdSdyZSB1c2luZyAiRGF0YSIgaW5zdGVhZCBvZiAiUGF0aCIuDQorWW91IHNob3VsZCBJPG5vdD4gcHV0IHBhdGggaW5mb3JtYXRpb24gaW4gaGVyZSAoZS5nLiwgbm8gIi8iDQorb3IgIlwiIG9yICI6IiBjaGFyYWN0ZXJzIHNob3VsZCBiZSB1c2VkKS4NCisNCis9aXRlbSBJZA0KKw0KK0k8T3B0aW9uYWwuPg0KK1NhbWUgYXMgc2V0dGluZyAiY29udGVudC1pZCIuDQorDQorPWl0ZW0gTGVuZ3RoDQorDQorSTxPcHRpb25hbC4+DQorU2V0IHRoZSBjb250ZW50IGxlbmd0aCBleHBsaWNpdGx5LiAgTm9ybWFsbHksIHRoaXMgaGVhZGVyIGlzIGF1dG9tYXRpY2FsbHkNCitjb21wdXRlZCwgYnV0IG9ubHkgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzIChzZWUgTDwiTGltaXRhdGlvbnMiPikuDQorDQorPWl0ZW0gUGF0aA0KKw0KK0k8QWx0ZXJuYXRpdmUgdG8gIkRhdGEiIG9yICJGSCIuPg0KK1BhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIGRhdGEuLi4gYWN0dWFsbHksIGl0IGNhbiBiZSBhbnkgb3BlbigpYWJsZQ0KK2V4cHJlc3Npb24uICBJZiBpdCBsb29rcyBsaWtlIGEgcGF0aCwgdGhlIGxhc3QgZWxlbWVudCB3aWxsIGF1dG9tYXRpY2FsbHkNCitiZSB0cmVhdGVkIGFzIHRoZSBmaWxlbmFtZS4NCitTZWUgIlJlYWROb3ciIGFsc28uDQorDQorPWl0ZW0gUmVhZE5vdw0KKw0KK0k8T3B0aW9uYWwsIGZvciB1c2Ugd2l0aCAiUGF0aCIuPg0KK0lmIHRydWUsIHdpbGwgb3BlbiB0aGUgcGF0aCBhbmQgc2x1cnAgdGhlIGNvbnRlbnRzIGludG8gY29yZSBub3cuDQorVGhpcyBpcyB1c2VmdWwgaWYgdGhlIFBhdGggcG9pbnRzIHRvIGEgY29tbWFuZCBhbmQgeW91IGRvbid0IHdhbnQNCit0byBydW4gdGhlIGNvbW1hbmQgb3ZlciBhbmQgb3ZlciBpZiBvdXRwdXR0aW5nIHRoZSBtZXNzYWdlIHNldmVyYWwNCit0aW1lcy4gIEI8RmF0YWwgZXhjZXB0aW9uPiByYWlzZWQgaWYgdGhlIG9wZW4gZmFpbHMuDQorDQorPWl0ZW0gVG9wDQorDQorSTxPcHRpb25hbC4+DQorSWYgZGVmaW5lZCwgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgYSAidG9wLWxldmVsIiBNSU1FIG1lc3NhZ2UuDQorVGhlIHBhcnRzIG9mIGEgbXVsdGlwYXJ0IG1lc3NhZ2UgYXJlIEk8bm90PiB0b3AtbGV2ZWwuDQorRGVmYXVsdCBpcyB0cnVlLg0KKw0KKz1pdGVtIFR5cGUNCisNCitJPE9wdGlvbmFsLj4NCitUaGUgTUlNRSBjb250ZW50IHR5cGUsIG9yIG9uZSBvZiB0aGVzZSBzcGVjaWFsIHZhbHVlcyAoY2FzZS1zZW5zaXRpdmUpOg0KKw0KKyAgICAgIlRFWFQiICAgbWVhbnMgInRleHQvcGxhaW4iDQorICAgICAiQklOQVJZIiBtZWFucyAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIg0KKyAgICAgIkFVVE8iICAgbWVhbnMgYXR0ZW1wdCB0byBndWVzcyBmcm9tIHRoZSBmaWxlbmFtZSwgZmFsbGluZyBiYWNrDQorICAgICAgICAgICAgICB0byAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJy4gIFRoaXMgaXMgZ29vZCBpZiB5b3UgaGF2ZQ0KKyAgICAgICAgICAgICAgTUlNRTo6VHlwZXMgb24geW91ciBzeXN0ZW0gYW5kIHlvdSBoYXZlIG5vIGlkZWEgd2hhdA0KKyAgICAgICAgICAgICAgZmlsZSBtaWdodCBiZSB1c2VkIGZvciB0aGUgYXR0YWNobWVudC4NCisNCitUaGUgZGVmYXVsdCBpcyBDPCJURVhUIj4sIGJ1dCBpdCB3aWxsIGJlIEM8IkFVVE8iPiBpZiB5b3Ugc2V0DQorJEFVVE9fQ09OVEVOVF9UWVBFIHRvIHRydWUgKHNvcnJ5LCBidXQgeW91IGhhdmUgdG8gZW5hYmxlDQoraXQgZXhwbGljaXRseSwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBicmVhayBjb2RlIHdoaWNoIGRlcGVuZHMNCitvbiB0aGUgb2xkIGJlaGF2aW9yKS4NCisNCis9YmFjaw0KKw0KK0EgcGljdHVyZSBiZWluZyB3b3J0aCAxMDAwIHdvcmRzICh3aGljaA0KK2lzIG9mIGNvdXJzZSAyMDAwIGJ5dGVzLCBzbyBpdCdzIHByb2JhYmx5IG1vcmUgb2YgYW4gImljb24iIHRoYW4gYSAicGljdHVyZSIsDQorYnV0IEkgZGlncmVzcy4uLiksIGhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6DQorDQorICAgICRtc2cgPSBNSU1FOjpMaXRlLT5idWlsZCgNCisgICAgICAgICAgICAgICBGcm9tICAgICA9PiAneWVsbGluZ0BpbnRlci5jb20nLA0KKyAgICAgICAgICAgICAgIFRvICAgICAgID0+ICdzdG9ja2luZ0BmaXNoLm5ldCcsDQorICAgICAgICAgICAgICAgU3ViamVjdCAgPT4gIkhpIHRoZXJlISIsDQorICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ1RFWFQnLA0KKyAgICAgICAgICAgICAgIEVuY29kaW5nID0+ICc3Yml0JywNCisgICAgICAgICAgICAgICBEYXRhICAgICA9PiAiSnVzdCBhIHF1aWNrIG5vdGUgdG8gc2F5IGhpISIpOw0KKw0KKyAgICAkbXNnID0gTUlNRTo6TGl0ZS0+YnVpbGQoDQorICAgICAgICAgICAgICAgRnJvbSAgICAgPT4gJ2Rvcm90aHlAZW1lcmFsZC1jaXR5Lm96JywNCisgICAgICAgICAgICAgICBUbyAgICAgICA9PiAnZ2VzdW5kaGVpdEBlZHUuZWR1LmVkdScsDQorICAgICAgICAgICAgICAgU3ViamVjdCAgPT4gIkEgZ2lmIGZvciBVIg0KKyAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdpbWFnZS9naWYnLA0KKyAgICAgICAgICAgICAgIFBhdGggICAgID0+ICIvaG9tZS9odHRwZC9sb2dvLmdpZiIpOw0KKw0KKyAgICAkbXNnID0gTUlNRTo6TGl0ZS0+YnVpbGQoDQorICAgICAgICAgICAgICAgRnJvbSAgICAgPT4gJ2xhdWdoaW5nQGFsbC5vZi51cycsDQorICAgICAgICAgICAgICAgVG8gICAgICAgPT4gJ3NjYXJsZXR0QGZpZGRsZS5kZWUuZGUnLA0KKyAgICAgICAgICAgICAgIFN1YmplY3QgID0+ICJBIGd6aXBwJ2VkIHRhciBmaWxlIiwNCisgICAgICAgICAgICAgICBUeXBlICAgICA9PiAneC1nemlwJywNCisgICAgICAgICAgICAgICBQYXRoICAgICA9PiAiZ3ppcCA8IC91c3IvaW5jL3NvbWVmaWxlLnRhciB8IiwNCisgICAgICAgICAgICAgICBSZWFkTm93ICA9PiAxLA0KKyAgICAgICAgICAgICAgIEZpbGVuYW1lID0+ICJzb21lZmlsZS50Z3oiKTsNCisNCitUbyBzaG93IHlvdSB3aGF0J3MgcmVhbGx5IGdvaW5nIG9uLCB0aGF0IGxhc3QgZXhhbXBsZSBjb3VsZCBhbHNvDQoraGF2ZSBiZWVuIHdyaXR0ZW46DQorDQorICAgICRtc2cgPSBuZXcgTUlNRTo6TGl0ZTsNCisgICAgJG1zZy0+YnVpbGQoVHlwZSAgICAgPT4gJ3gtZ3ppcCcsDQorICAgICAgICAgICAgICAgIFBhdGggICAgID0+ICJnemlwIDwgL3Vzci9pbmMvc29tZWZpbGUudGFyIHwiLA0KKyAgICAgICAgICAgICAgICBSZWFkTm93ICA9PiAxLA0KKyAgICAgICAgICAgICAgICBGaWxlbmFtZSA9PiAic29tZWZpbGUudGd6Iik7DQorICAgICRtc2ctPmFkZChGcm9tICAgID0+ICJsYXVnaGluZ0BhbGwub2YudXMiKTsNCisgICAgJG1zZy0+YWRkKFRvICAgICAgPT4gInNjYXJsZXR0QGZpZGRsZS5kZWUuZGUiKTsNCisgICAgJG1zZy0+YWRkKFN1YmplY3QgPT4gIkEgZ3ppcHAnZWQgdGFyIGZpbGUiKTsNCisNCis9Y3V0DQorDQorc3ViIGJ1aWxkIHsNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisgICAgbXkgJXBhcmFtcyA9IEBfOw0KKyAgICBteSBAcGFyYW1zID0gQF87DQorICAgIG15ICRrZXk7DQorDQorICAgICMjIyBNaWtvJ3Mgbm90ZTogcmVvcmdhbml6ZWQgdG8gY2hlY2sgZm9yIGV4YWN0bHkgb25lIG9mIERhdGEsIFBhdGgsIG9yIEZIDQorICAgIChkZWZpbmVkKCRwYXJhbXN7RGF0YX0pK2RlZmluZWQoJHBhcmFtc3tQYXRofSkrZGVmaW5lZCgkcGFyYW1ze0ZIfSkgPD0gMSkNCisJb3IgQ2FycDo6Y3JvYWsgInN1cHBseSBleGFjdGx5IHplcm8gb3Igb25lIG9mIChEYXRhfFBhdGh8RkgpLlxuIjsNCisNCisgICAgIyMjIENyZWF0ZSBuZXcgaW5zdGFuY2UsIGlmIG5lY2Vzc2FyeToNCisgICAgcmVmKCRzZWxmKSBvciAkc2VsZiA9ICRzZWxmLT5uZXc7DQorDQorDQorICAgICMjIyBDT05URU5ULVRZUEUuLi4uDQorICAgICMjIw0KKw0KKyAgICAjIyMgR2V0IGNvbnRlbnQtdHlwZSBvciBjb250ZW50LXR5cGUtbWFjcm86DQorICAgIG15ICR0eXBlID0gKCRwYXJhbXN7VHlwZX0gfHwgKCRBVVRPX0NPTlRFTlRfVFlQRSA/ICdBVVRPJyA6ICdURVhUJykpOw0KKw0KKyAgICAjIyMgSW50ZXJwcmV0IGNvbnRlbnQtdHlwZS1tYWNyb3M6DQorICAgIGlmICAgICgkdHlwZSBlcSAnVEVYVCcpICAgeyAkdHlwZSA9ICd0ZXh0L3BsYWluJzsgfQ0KKyAgICBlbHNpZiAoJHR5cGUgZXEgJ0JJTkFSWScpIHsgJHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9DQorICAgIGVsc2lmICgkdHlwZSBlcSAnQVVUTycpICAgeyAkdHlwZSA9ICRzZWxmLT5zdWdnZXN0X3R5cGUoJHBhcmFtc3tQYXRofSk7IH0NCisNCisgICAgIyMjIFdlIG5vdyBoYXZlIGEgY29udGVudC10eXBlOyBzZXQgaXQ6DQorICAgICR0eXBlID0gbGMoJHR5cGUpOw0KKyAgICAkc2VsZi0+YXR0cignY29udGVudC10eXBlJyA9PiAkdHlwZSk7DQorDQorICAgICMjIyBHZXQgc29tZSBiYXNpYyBhdHRyaWJ1dGVzIGZyb20gdGhlIGNvbnRlbnQgdHlwZToNCisgICAgbXkgJGlzX211bHRpcGFydCA9ICgkdHlwZSA9fiBte14obXVsdGlwYXJ0KS99aSk7DQorDQorICAgICMjIyBBZGQgaW4gdGhlIG11bHRpcGFydCBib3VuZGFyeToNCisgICAgaWYgKCRpc19tdWx0aXBhcnQpIHsNCisJbXkgJGJvdW5kYXJ5ID0gZ2VuX2JvdW5kYXJ5KCk7DQorCSRzZWxmLT5hdHRyKCdjb250ZW50LXR5cGUuYm91bmRhcnknID0+ICRib3VuZGFyeSk7DQorICAgIH0NCisNCisNCisgICAgIyMjIENPTlRFTlQtSUQuLi4NCisgICAgIyMjDQorICAgICRzZWxmLT5hdHRyKCdjb250ZW50LWlkJyA9PiAkcGFyYW1ze0lkfSkgaWYgZGVmaW5lZCgkcGFyYW1ze0lkfSk7DQorDQorDQorICAgICMjIyBEQVRBIE9SIFBBVEguLi4NCisgICAgIyMjICAgIE5vdGUgdGhhdCB3ZSBtdXN0IGRvIHRoaXMgKmFmdGVyKiB3ZSBnZXQgdGhlIGNvbnRlbnQgdHlwZSwNCisgICAgIyMjICAgIGluIGNhc2UgcmVhZF9ub3coKSBpcyBpbnZva2VkLCBzaW5jZSBpdCBuZWVkcyB0aGUgYmlubW9kZSgpLg0KKw0KKyAgICAjIyMgR2V0IGRhdGEsIGFzLi4uDQorICAgICMjIyAuLi5laXRoZXIgbGl0ZXJhbCBkYXRhOg0KKyAgICBpZiAoZGVmaW5lZCgkcGFyYW1ze0RhdGF9KSkgew0KKwkkc2VsZi0+ZGF0YSgkcGFyYW1ze0RhdGF9KTsNCisgICAgfQ0KKyAgICAjIyMgLi4ub3IgYSBwYXRoIHRvIGRhdGE6DQorICAgIGVsc2lmIChkZWZpbmVkKCRwYXJhbXN7UGF0aH0pKSB7DQorCSRzZWxmLT5wYXRoKCRwYXJhbXN7UGF0aH0pOyAgICAgICAjIyMgYWxzbyBzZXRzIGZpbGVuYW1lDQorCSRzZWxmLT5yZWFkX25vdyBpZiAkcGFyYW1ze1JlYWROb3d9Ow0KKyAgICB9DQorICAgICMjIyAuLi5vciBhIGZpbGVoYW5kbGUgdG8gZGF0YToNCisgICAgIyMjIE1pa28ncyBub3RlOiB0aGlzIHBhcnQgd29ya3MgbXVjaCBsaWtlIHRoZSBwYXRoIHJvdXRpbmUganVzdCBhYm92ZSwNCisgICAgZWxzaWYgKGRlZmluZWQoJHBhcmFtc3tGSH0pKSB7DQorCSRzZWxmLT5maCgkcGFyYW1ze0ZIfSk7DQorCSRzZWxmLT5yZWFkX25vdyBpZiAkcGFyYW1ze1JlYWROb3d9OyAgIyMjIGltcGxlbWVudCBsYXRlcg0KKyAgICB9DQorDQorDQorICAgICMjIyBGSUxFTkFNRS4uLiAoYWRkZWQgYnkgSWFuIFNtaXRoIDxpYW5Ac2FmZXdheS5kaXJjb24uY28udWs+IG9uIDgvNC85NykNCisgICAgIyMjICAgIE5lZWQgdGhpcyB0byBtYWtlIHN1cmUgdGhlIGZpbGVuYW1lIGlzIGFkZGVkLiAgVGhlIEZpbGVuYW1lDQorICAgICMjIyAgICBhdHRyaWJ1dGUgaXMgaWdub3JlZCwgb3RoZXJ3aXNlLg0KKyAgICBpZiAoZGVmaW5lZCgkcGFyYW1ze0ZpbGVuYW1lfSkpIHsNCisJJHNlbGYtPmZpbGVuYW1lKCRwYXJhbXN7RmlsZW5hbWV9KTsNCisgICAgfQ0KKw0KKw0KKyAgICAjIyMgQ09OVEVOVC1UUkFOU0ZFUi1FTkNPRElORy4uLg0KKyAgICAjIyMNCisNCisgICAgIyMjIEdldCBpdDoNCisgICAgbXkgJGVuYyA9ICgkcGFyYW1ze0VuY29kaW5nfSB8fA0KKwkgICAgICAgKCRBVVRPX0VOQ09ERSBhbmQgJHNlbGYtPnN1Z2dlc3RfZW5jb2RpbmcoJHR5cGUpKSB8fA0KKwkgICAgICAgJ2JpbmFyeScpOw0KKyAgICAkc2VsZi0+YXR0cignY29udGVudC10cmFuc2Zlci1lbmNvZGluZycgPT4gbGMoJGVuYykpOw0KKw0KKyAgICAjIyMgU2FuaXR5IGNoZWNrOg0KKyAgICBpZiAoJHR5cGUgPX4gbXteKG11bHRpcGFydHxtZXNzYWdlKS99KSB7DQorCSgkZW5jID1+IG17Xig3Yml0fDhiaXR8YmluYXJ5KVxafSkgb3INCisJICBDYXJwOjpjcm9haygiaWxsZWdhbCBNSU1FOiAiLg0KKwkJICAgICAgImNhbid0IGhhdmUgZW5jb2RpbmcgJGVuYyB3aXRoIHR5cGUgJHR5cGVcbiIpOw0KKyAgICB9DQorDQorICAgICMjIyBDT05URU5ULURJU1BPU0lUSU9OLi4uDQorICAgICMjIyAgICBEZWZhdWx0IGlzIGlubGluZSBmb3Igc2luZ2xlLCBub25lIGZvciBtdWx0aXM6DQorICAgICMjIw0KKyAgICBteSAkZGlzcCA9ICgkcGFyYW1ze0Rpc3Bvc2l0aW9ufSBvciAoJGlzX211bHRpcGFydCA/IHVuZGVmIDogJ2lubGluZScpKTsNCisgICAgJHNlbGYtPmF0dHIoJ2NvbnRlbnQtZGlzcG9zaXRpb24nID0+ICRkaXNwKTsNCisNCisgICAgIyMjIENPTlRFTlQtTEVOR1RILi4uDQorICAgICMjIw0KKyAgICBteSAkbGVuZ3RoOw0KKyAgICBpZiAoZXhpc3RzKCRwYXJhbXN7TGVuZ3RofSkpIHsgICAjIyMgZ2l2ZW4gYnkgY2FsbGVyOg0KKwkkc2VsZi0+YXR0cignY29udGVudC1sZW5ndGgnID0+ICRwYXJhbXN7TGVuZ3RofSk7DQorICAgIH0NCisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIGNvbXB1dGUgaXQgb3Vyc2VsdmVzDQorCSRzZWxmLT5nZXRfbGVuZ3RoOw0KKyAgICB9DQorDQorICAgICMjIyBJbml0IHRoZSB0b3AtbGV2ZWwgZmllbGRzOg0KKyAgICBteSAkaXNfdG9wID0gZGVmaW5lZCgkcGFyYW1ze1RvcH0pID8gJHBhcmFtc3tUb3B9IDogMTsNCisgICAgJHNlbGYtPnRvcF9sZXZlbCgkaXNfdG9wKTsNCisNCisgICAgIyMjIERhdGVzdGFtcCBpZiBkZXNpcmVkOg0KKyAgICBteSAkZHNfd2FudGVkICAgID0gJHBhcmFtc3tEYXRlc3RhbXB9Ow0KKyAgICBteSAkZHNfZGVmYXVsdGVkID0gKCRpc190b3AgYW5kICFleGlzdHMoJHBhcmFtc3tEYXRlc3RhbXB9KSk7DQorICAgIGlmICgoJGRzX3dhbnRlZCBvciAkZHNfZGVmYXVsdGVkKSBhbmQgIWV4aXN0cygkcGFyYW1ze0RhdGV9KSkgew0KKwlteSAoJHVfd2R5LCAkdV9tb24sICR1X21keSwgJHVfdGltZSwgJHVfeTQpID0NCisJICAgIHNwbGl0IC9ccysvLCBnbXRpbWUoKS4iIjsgICAjIyMgc2hvdWxkIGJlIG5vbi1sb2NhbGUtZGVwZW5kZW50DQorCW15ICRkYXRlID0gIiR1X3dkeSwgJHVfbWR5ICR1X21vbiAkdV95NCAkdV90aW1lIFVUIjsNCisJJHNlbGYtPmFkZCgiZGF0ZSIsICRkYXRlKTsNCisgICAgfQ0KKw0KKyAgICAjIyMgU2V0IG1lc3NhZ2UgaGVhZGVyczoNCisgICAgbXkgQHBhcmFteiA9IEBwYXJhbXM7DQorICAgIG15ICRmaWVsZDsNCisgICAgd2hpbGUgKEBwYXJhbXopIHsNCisJbXkgKCR0YWcsICR2YWx1ZSkgPSAoc2hpZnQoQHBhcmFteiksIHNoaWZ0KEBwYXJhbXopKTsNCisNCisJIyMjIEdldCB0YWcsIGlmIGEgdGFnOg0KKwlpZiAoJHRhZyA9fiAvXi0oLiopLykgeyAgICAgICMjIyBvbGQgc3R5bGUsIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5DQorCSAgICAkZmllbGQgPSBsYygkMSk7DQorCX0NCisJZWxzaWYgKCR0YWcgPX4gL14oLiopOiQvKSB7ICAjIyMgbmV3IHN0eWxlDQorCSAgICAkZmllbGQgPSBsYygkMSk7DQorCX0NCisJZWxzaWYgKGtub3duX2ZpZWxkKCRmaWVsZCA9IGxjKCR0YWcpKSkgeyAgICMjIyBrbm93biBmaWVsZA0KKwkgICAgIyMjIG5vLW9wDQorCX0NCisJZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAjIyMgbm90IGEgZmllbGQ6DQorCSAgICBuZXh0Ow0KKwl9DQorDQorCSMjIyBBZGQgaXQ6DQorCSRzZWxmLT5hZGQoJGZpZWxkLCAkdmFsdWUpOw0KKyAgICB9DQorDQorICAgICMjIyBEb25lIQ0KKyAgICAkc2VsZjsNCit9DQorDQorPWJhY2sNCisNCis9Y3V0DQorDQorDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCis9aGVhZDIgU2V0dGluZy9nZXR0aW5nIGhlYWRlcnMgYW5kIGF0dHJpYnV0ZXMNCisNCis9b3ZlciA0DQorDQorPWN1dA0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjDQorIyB0b3BfbGV2ZWwgT05PRkYNCisjDQorIyBTZXQvdW5zZXQgdGhlIHRvcC1sZXZlbCBhdHRyaWJ1dGVzIGFuZCBoZWFkZXJzLg0KKyMgVGhpcyBhZmZlY3RzICJNSU1FLVZlcnNpb24iIGFuZCAiWC1NYWlsZXIiLg0KKw0KK3N1YiB0b3BfbGV2ZWwgew0KKyAgICBteSAoJHNlbGYsICRvbm9mZikgPSBAXzsNCisgICAgaWYgKCRvbm9mZikgew0KKwkkc2VsZi0+YXR0cignTUlNRS1WZXJzaW9uJyA9PiAnMS4wJyk7DQorCW15ICR1c2VzID0gKEBVc2VzID8gKCIoIiAuIGpvaW4oIjsgIiwgQFVzZXMpIC4gIikiKSA6ICcnKTsNCisJJHNlbGYtPnJlcGxhY2UoJ1gtTWFpbGVyJyA9PiAiTUlNRTo6TGl0ZSAkVkVSU0lPTiAkdXNlcyIpDQorCSAgICB1bmxlc3MgJFZBTklMTEE7DQorICAgIH0NCisgICAgZWxzZSB7DQorCSRzZWxmLT5hdHRyKCdNSU1FLVZlcnNpb24nID0+IHVuZGVmKTsNCisJJHNlbGYtPmRlbGV0ZSgnWC1NYWlsZXInKTsNCisgICAgfQ0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gYWRkIFRBRyxWQUxVRQ0KKw0KK0k8SW5zdGFuY2UgbWV0aG9kLj4NCitBZGQgZmllbGQgVEFHIHdpdGggdGhlIGdpdmVuIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGhlYWRlci4NCitUaGUgVEFHIHdpbGwgYmUgY29udmVydGVkIHRvIGFsbC1sb3dlcmNhc2UsIGFuZCB0aGUgVkFMVUUNCit3aWxsIGJlIG1hZGUgInNhZmUiIChyZXR1cm5zIHdpbGwgYmUgZ2l2ZW4gYSB0cmFpbGluZyBzcGFjZSkuDQorDQorQjxCZXdhcmU6PiBhbnkgTUlNRSBmaWVsZHMgeW91ICJhZGQiIHdpbGwgb3ZlcnJpZGUgYW55IE1JTUUNCithdHRyaWJ1dGVzIEkgaGF2ZSB3aGVuIGl0IGNvbWVzIHRpbWUgdG8gb3V0cHV0IHRob3NlIGZpZWxkcy4NCitOb3JtYWxseSwgeW91IHdpbGwgdXNlIHRoaXMgbWV0aG9kIHRvIGFkZCBJPG5vbi1NSU1FPiBmaWVsZHM6DQorDQorICAgICRtc2ctPmFkZCgiU3ViamVjdCIgPT4gIkhpIHRoZXJlISIpOw0KKw0KK0dpdmluZyBWQUxVRSBhcyBhbiBhcnJheXJlZiB3aWxsIGNhdXNlIGFsbCB0aG9zZSB2YWx1ZXMgdG8gYmUgYWRkZWQuDQorVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3Igc3BlY2lhbCBtdWx0aXBsZS12YWx1ZWQgZmllbGRzIGxpa2UgIlJlY2VpdmVkIjoNCisNCisgICAgJG1zZy0+YWRkKCJSZWNlaXZlZCIgPT4gWyJoZXJlIiwgInRoZXJlIiwgImV2ZXJ5d2hlcmUiXQ0KKw0KK0dpdmluZyBWQUxVRSBhcyB0aGUgZW1wdHkgc3RyaW5nIGFkZHMgYW4gaW52aXNpYmxlIHBsYWNlaG9sZGVyDQordG8gdGhlIGhlYWRlciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgdGhlIG91dHB1dCBvZg0KK3RoZSAiQ29udGVudC0qIiBmaWVsZHMgb3IgdGhlIHNwZWNpYWwgICJNSU1FLVZlcnNpb24iIGZpZWxkLg0KK1doZW4gc3VwcHJlc3NpbmcgZmllbGRzLCB5b3Ugc2hvdWxkIHVzZSByZXBsYWNlKCkgaW5zdGVhZCBvZiBhZGQoKToNCisNCisgICAgJG1zZy0+cmVwbGFjZSgiQ29udGVudC1kaXNwb3NpdGlvbiIgPT4gIiIpOw0KKw0KK0k8Tm90ZTo+IGFkZCgpIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlIG1vcmUgZWZmaWNpZW50IHRoYW4gQzxyZXBsYWNlKCk+LA0KK3NvIHlvdSdyZSBiZXR0ZXIgb2ZmIHVzaW5nIGl0IGZvciBtb3N0IGFwcGxpY2F0aW9ucyBpZiB5b3UgYXJlDQorY2VydGFpbiB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIGRlbGV0ZSgpIHRoZSBmaWVsZCBmaXJzdC4NCisNCitJPE5vdGU6PiB0aGUgbmFtZSBjb21lcyBmcm9tIE1haWw6OkhlYWRlci4NCisNCis9Y3V0DQorDQorc3ViIGFkZCB7DQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgIG15ICR0YWcgPSBsYyhzaGlmdCk7DQorICAgIG15ICR2YWx1ZSA9IHNoaWZ0Ow0KKw0KKyAgICAjIyMgSWYgYSBkYW5nZXJvdXMgb3B0aW9uLCB3YXJuIHRoZW06DQorICAgIENhcnA6OmNhcnAgIkV4cGxpY2l0bHkgc2V0dGluZyBhIE1JTUUgaGVhZGVyIGZpZWxkICgkdGFnKSBpcyBkYW5nZXJvdXM6XG4iLg0KKwkgInVzZSB0aGUgYXR0cigpIG1ldGhvZCBpbnN0ZWFkLlxuIg0KKwlpZiAoaXNfbWltZV9maWVsZCgkdGFnKSAmJiAhJFFVSUVUKTsNCisNCisgICAgIyMjIEdldCBhcnJheSBvZiBjbGVhbiB2YWx1ZXM6DQorICAgIG15IEB2YWxzID0gKChyZWYoJHZhbHVlKSBhbmQgKHJlZigkdmFsdWUpIGVxICdBUlJBWScpKQ0KKwkJPyBAeyR2YWx1ZX0NCisJCTogKCR2YWx1ZS4nJykpOw0KKyAgICBtYXAgeyBzL1xuL1xuIC9nIH0gQHZhbHM7DQorDQorICAgICMjIyBBZGQgdGhlbToNCisgICAgZm9yZWFjaCAoQHZhbHMpIHsNCisJcHVzaCBAeyRzZWxmLT57SGVhZGVyfX0sIFskdGFnLCAkX107DQorICAgIH0NCit9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIGF0dHIgQVRUUixbVkFMVUVdDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK1NldCBNSU1FIGF0dHJpYnV0ZSBBVFRSIHRvIHRoZSBzdHJpbmcgVkFMVUUuDQorQVRUUiBpcyBjb252ZXJ0ZWQgdG8gYWxsLWxvd2VyY2FzZS4NCitUaGlzIG1ldGhvZCBpcyBub3JtYWxseSB1c2VkIHRvIHNldC9nZXQgTUlNRSBhdHRyaWJ1dGVzOg0KKw0KKyAgICAkbXNnLT5hdHRyKCJjb250ZW50LXR5cGUiICAgICAgICAgPT4gInRleHQvaHRtbCIpOw0KKyAgICAkbXNnLT5hdHRyKCJjb250ZW50LXR5cGUuY2hhcnNldCIgPT4gIlVTLUFTQ0lJIik7DQorICAgICRtc2ctPmF0dHIoImNvbnRlbnQtdHlwZS5uYW1lIiAgICA9PiAiaG9tZXBhZ2UuaHRtbCIpOw0KKw0KK1RoaXMgd291bGQgY2F1c2UgdGhlIGZpbmFsIG91dHB1dCB0byBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6DQorDQorICAgIENvbnRlbnQtdHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVTLUFTQ0lJOyBuYW1lPSJob21lcGFnZS5odG1sIg0KKw0KK05vdGUgdGhhdCB0aGUgc3BlY2lhbCBlbXB0eSBzdWItZmllbGQgdGFnIGluZGljYXRlcyB0aGUgYW5vbnltb3VzDQorZmlyc3Qgc3ViLWZpZWxkLg0KKw0KK0dpdmluZyBWQUxVRSBhcyB1bmRlZmluZWQgd2lsbCBjYXVzZSB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkDQorc3ViZmllbGQgdG8gYmUgZGVsZXRlZC4NCisNCitTdXBwbHlpbmcgbm8gVkFMVUUgYXJndW1lbnQganVzdCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZToNCisNCisgICAgJHR5cGUgPSAkbXNnLT5hdHRyKCJjb250ZW50LXR5cGUiKTsgICAgICAgICMjIyByZXR1cm5zICJ0ZXh0L2h0bWwiDQorICAgICRuYW1lID0gJG1zZy0+YXR0cigiY29udGVudC10eXBlLm5hbWUiKTsgICAjIyMgcmV0dXJucyAiaG9tZXBhZ2UuaHRtbCINCisNCis9Y3V0DQorDQorc3ViIGF0dHIgew0KKyAgICBteSAoJHNlbGYsICRhdHRyLCAkdmFsdWUpID0gQF87DQorICAgICRhdHRyID0gbGMoJGF0dHIpOw0KKw0KKyAgICAjIyMgQnJlYWsgYXR0cmlidXRlIG5hbWUgdXA6DQorICAgIG15ICgkdGFnLCAkc3VidGFnKSA9IHNwbGl0IC9cLi8sICRhdHRyOw0KKyAgICBkZWZpbmVkKCRzdWJ0YWcpIG9yICRzdWJ0YWcgPSAnJzsNCisNCisgICAgIyMjIFNldCBvciBnZXQ/DQorICAgIGlmIChAXyA+IDIpIHsgICAjIyMgc2V0Og0KKwkkc2VsZi0+e0F0dHJzfXskdGFnfSB8fD0ge307ICAgICAgICAgICAgIyMjIGZvcmNlIGhhc2gNCisJZGVsZXRlICRzZWxmLT57QXR0cnN9eyR0YWd9eyRzdWJ0YWd9OyAgICMjIyBkZWxldGUgZmlyc3QNCisJaWYgKGRlZmluZWQoJHZhbHVlKSkgeyAgICAgICAgICAgICAgICAgICMjIyBzZXQuLi4NCisJICAgICR2YWx1ZSA9fiBzL1tcclxuXS8vZzsgICAgICAgICAgICAgICAgICAgIyMjIG1ha2UgY2xlYW4NCisJICAgICRzZWxmLT57QXR0cnN9eyR0YWd9eyRzdWJ0YWd9ID0gJHZhbHVlOw0KKwl9DQorICAgIH0NCisNCisgICAgIyMjIFJldHVybiBjdXJyZW50IHZhbHVlOg0KKyAgICAkc2VsZi0+e0F0dHJzfXskdGFnfXskc3VidGFnfTsNCit9DQorDQorc3ViIF9zYWZlX2F0dHIgew0KKyAgICBteSAoJHNlbGYsICRhdHRyKSA9IEBfOw0KKyAgICBteSAkdiA9ICRzZWxmLT5hdHRyKCRhdHRyKTsNCisgICAgZGVmaW5lZCgkdikgPyAkdiA6ICcnOw0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gZGVsZXRlIFRBRw0KKw0KK0k8SW5zdGFuY2UgbWV0aG9kLj4NCitEZWxldGUgZmllbGQgVEFHIHdpdGggdGhlIGdpdmVuIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGhlYWRlci4NCitUaGUgVEFHIHdpbGwgYmUgY29udmVydGVkIHRvIGFsbC1sb3dlcmNhc2UuDQorDQorICAgICRtc2ctPmRlbGV0ZSgiU3ViamVjdCIpOw0KKw0KK0k8Tm90ZTo+IHRoZSBuYW1lIGNvbWVzIGZyb20gTWFpbDo6SGVhZGVyLg0KKw0KKz1jdXQNCisNCitzdWIgZGVsZXRlIHsNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisgICAgbXkgJHRhZyA9IGxjKHNoaWZ0KTsNCisNCisgICAgIyMjIERlbGV0ZSBmcm9tIHRoZSBoZWFkZXI6DQorICAgIG15ICRoZHIgPSBbXTsNCisgICAgbXkgJGZpZWxkOw0KKyAgICBmb3JlYWNoICRmaWVsZCAoQHskc2VsZi0+e0hlYWRlcn19KSB7DQorCXB1c2ggQCRoZHIsICRmaWVsZCBpZiAoJGZpZWxkLT5bMF0gbmUgJHRhZyk7DQorICAgIH0NCisgICAgJHNlbGYtPntIZWFkZXJ9ID0gJGhkcjsNCisgICAgJHNlbGY7DQorfQ0KKw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCis9aXRlbSBmaWVsZF9vcmRlciBGSUVMRCwuLi5GSUVMRA0KKw0KK0k8Q2xhc3MvaW5zdGFuY2UgbWV0aG9kLj4NCitDaGFuZ2UgdGhlIG9yZGVyIGluIHdoaWNoIGhlYWRlciBmaWVsZHMgYXJlIG91dHB1dCBmb3IgdGhpcyBvYmplY3Q6DQorDQorICAgICRtc2ctPmZpZWxkX29yZGVyKCdmcm9tJywgJ3RvJywgJ2NvbnRlbnQtdHlwZScsICdzdWJqZWN0Jyk7DQorDQorV2hlbiB1c2VkIGFzIGEgY2xhc3MgbWV0aG9kLCBjaGFuZ2VzIHRoZSBkZWZhdWx0IHNldHRpbmdzIGZvcg0KK2FsbCBvYmplY3RzOg0KKw0KKyAgICBNSU1FOjpMaXRlLT5maWVsZF9vcmRlcignZnJvbScsICd0bycsICdjb250ZW50LXR5cGUnLCAnc3ViamVjdCcpOw0KKw0KK0Nhc2UgZG9lcyBub3QgbWF0dGVyOiBhbGwgZmllbGQgbmFtZXMgd2lsbCBiZSBjb2VyY2VkIHRvIGxvd2VyY2FzZS4NCitJbiBlaXRoZXIgY2FzZSwgc3VwcGx5IHRoZSBlbXB0eSBhcnJheSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IG9yZGVyaW5nLg0KKw0KKz1jdXQNCisNCitzdWIgZmllbGRfb3JkZXIgew0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKyAgICBpZiAocmVmKCRzZWxmKSkgeyAkc2VsZi0+e0ZpZWxkT3JkZXJ9ID0gWyBtYXAgeyBsYygkXykgfSBAXyBdIH0NCisgICAgZWxzZSAgICAgICAgICAgIHsgQEZpZWxkT3JkZXIgICAgICAgICA9ICAgbWFwIHsgbGMoJF8pIH0gQF8gfQ0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gZmllbGRzDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK1JldHVybiB0aGUgZnVsbCBoZWFkZXIgZm9yIHRoZSBvYmplY3QsIGFzIGEgcmVmIHRvIGFuIGFycmF5DQorb2YgQzxbVEFHLCBWQUxVRV0+IHBhaXJzLCB3aGVyZSBlYWNoIFRBRyBpcyBhbGwtbG93ZXJjYXNlLg0KK05vdGUgdGhhdCBhbnkgZmllbGRzIHRoZSB1c2VyIGhhcyBleHBsaWNpdGx5IHNldCB3aWxsIG92ZXJyaWRlIHRoZQ0KK2NvcnJlc3BvbmRpbmcgTUlNRSBmaWVsZHMgdGhhdCB3ZSB3b3VsZCBvdGhlcndpc2UgZ2VuZXJhdGUuDQorU28sIGRvbid0IHNheS4uLg0KKw0KKyAgICAkbXNnLT5zZXQoIkNvbnRlbnQtdHlwZSIgPT4gInRleHQvaHRtbDsgY2hhcnNldD1VUy1BU0NJSSIpOw0KKw0KK3VubGVzcyB5b3Ugd2FudCB0aGUgYWJvdmUgdmFsdWUgdG8gb3ZlcnJpZGUgdGhlICJDb250ZW50LXR5cGUiDQorTUlNRSBmaWVsZCB0aGF0IHdlIHdvdWxkIG5vcm1hbGx5IGdlbmVyYXRlLg0KKw0KK0k8Tm90ZTo+IEkgY2FsbGVkIHRoaXMgImZpZWxkcyIgYmVjYXVzZSB0aGUgaGVhZGVyKCkgbWV0aG9kIG9mDQorTWFpbDo6SGVhZGVyIHJldHVybnMgc29tZXRoaW5nIGRpZmZlcmVudCwgYnV0IHNpbWlsYXIgZW5vdWdoIHRvDQorYmUgY29uZnVzaW5nLg0KKw0KK1lvdSBjYW4gY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgZmllbGRzOiBzZWUgTDwvZmllbGRfb3JkZXI+Lg0KK1lvdSByZWFsbHkgc2hvdWxkbid0IG5lZWQgdG8gZG8gdGhpcywgYnV0IHNvbWUgcGVvcGxlIGhhdmUgdG8NCitkZWFsIHdpdGggYnJva2VuIG1haWxlcnMuDQorDQorPWN1dA0KKw0KK3N1YiBmaWVsZHMgew0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKyAgICBteSBAZmllbGRzOw0KKw0KKyAgICAjIyMgR2V0IGEgbG9va3VwLWhhc2ggb2YgYWxsICpleHBsaWNpdGx5LWdpdmVuKiBmaWVsZHM6DQorICAgIG15ICVleHBsaWNpdCA9IG1hcCB7ICRfLT5bMF0gPT4gMSB9IEB7JHNlbGYtPntIZWFkZXJ9fTsNCisNCisgICAgIyMjIFN0YXJ0IHdpdGggYW55IE1JTUUgYXR0cmlidXRlcyBub3QgZ2l2ZW4gZXhwbGljaXRseToNCisgICAgbXkgJHRhZzsNCisgICAgZm9yZWFjaCAkdGFnIChzb3J0IGtleXMgJXskc2VsZi0+e0F0dHJzfX0pIHsNCisNCisJIyMjIFNraXAgaWYgZXhwbGljaXQ6DQorCW5leHQgaWYgKCRleHBsaWNpdHskdGFnfSk7DQorDQorCSMjIyBTa2lwIGlmIG5vIHN1YnRhZ3M6DQorCW15IEBzdWJ0YWdzID0ga2V5cyAleyRzZWxmLT57QXR0cnN9eyR0YWd9fTsNCisJQHN1YnRhZ3Mgb3IgbmV4dDsNCisNCisJIyMjIENyZWF0ZSBzdHJpbmc6DQorCW15ICR2YWx1ZTsNCisJZGVmaW5lZCgkdmFsdWUgPSAkc2VsZi0+e0F0dHJzfXskdGFnfXsnJ30pIG9yIG5leHQ7ICAjIyMgbmVlZCBkZWZhdWx0DQorCWZvcmVhY2ggKHNvcnQgQHN1YnRhZ3MpIHsNCisJICAgIG5leHQgaWYgKCRfIGVxICcnKTsNCisJICAgICR2YWx1ZSAuPSBxcXs7ICRfPSIkc2VsZi0+e0F0dHJzfXskdGFnfXskX30ifTsNCisJfQ0KKw0KKwkjIyMgQWRkIHRvIHJ1bm5pbmcgZmllbGRzOw0KKwlwdXNoIEBmaWVsZHMsIFskdGFnLCAkdmFsdWVdOw0KKyAgICB9DQorDQorICAgICMjIyBBZGQgcmVtYWluaW5nIGZpZWxkcyAobm90ZSB0aGF0IHdlIGR1cGxpY2F0ZSB0aGUgYXJyYXkgZm9yIHNhZmV0eSk6DQorICAgIGZvcmVhY2ggKEB7JHNlbGYtPntIZWFkZXJ9fSkgew0KKwlwdXNoIEBmaWVsZHMsIFtAeyRffV07DQorICAgIH0NCisNCisgICAgIyMjIEZpbmFsIHN0ZXA6DQorICAgICMjIyBJZiBhIHN1Z2dlc3RlZCBvcmRlcmluZyB3YXMgZ2l2ZW4sIHdlICJzb3J0IiBieSB0aGF0IG9yZGVyaW5nLg0KKyAgICAjIyMgICAgVGhlIGlkZWEgaXMgdGhhdCB3ZSBnaXZlIGVhY2ggZmllbGQgYSBudW1lcmljIHJhbmssIHdoaWNoIGlzDQorICAgICMjIyAgICAoMTAwMCAqIG9yZGVyKGZpZWxkKSkgKyBvcmlncG9zaXRpb24uDQorICAgIG15IEBvcmRlciA9IEB7JHNlbGYtPntGaWVsZE9yZGVyfSB8fCBbXX07ICAgICAgIyMjIG9iamVjdC1zcGVjaWZpYw0KKyAgICBAb3JkZXIgb3IgQG9yZGVyID0gQEZpZWxkT3JkZXI7ICAgICAgICAgICAgICAgICMjIyBubz8gbWF5YmUgZ2VuZXJpYw0KKyAgICBpZiAoQG9yZGVyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBlaXRoZXI/DQorDQorCSMjIyBDcmVhdGUgaGFzaCBtYXBwaW5nIGZpZWxkIG5hbWVzIHRvIDEtYmFzZWQgcmFuazoNCisJbXkgJXJhbmsgPSBtYXAgeyRvcmRlclskX10gPT4gKDErJF8pfSAoMC4uJCNvcmRlcik7DQorDQorCSMjIyBDcmVhdGUgcGFyYWxsZWwgYXJyYXkgdG8gQGZpZWxkcywgY2FsbGVkIEByYW5rZWQuDQorCSMjIyBJdCBjb250YWlucyBmaWVsZHMgdGFnZ2VkIHdpdGggbnVtYmVycyBsaWtlIDIwMDMsIHdoZXJlIHRoZQ0KKwkjIyMgMyBpcyB0aGUgb3JpZ2luYWwgMC1iYXNlZCBwb3NpdGlvbiwgYW5kIDIwMDAgaW5kaWNhdGVzIHRoYXQNCisJIyMjIHdlIHdhbnRlZCB0aHMgdHlwZSBvZiBmaWVsZCB0byBnbyBzZWNvbmQuDQorCW15IEByYW5rZWQgPSBtYXAgew0KKwkgICAgWw0KKwkgICAgICgkXyArIDEwMDAqKCRyYW5re2xjKCRmaWVsZHNbJF9dWzBdKX0gfHwgKDIrJCNvcmRlcikpKSwNCisJICAgICAkZmllbGRzWyRfXQ0KKwkgICAgIF0NCisJICAgIH0gKDAuLiQjZmllbGRzKTsNCisJIyBmb3JlYWNoIChAcmFua2VkKSB7DQorCSMgICAgIHByaW50IFNUREVSUiAiUkFOS0VEOiAkXy0+WzBdICRfLT5bMV1bMF0gJF8tPlsxXVsxXVxuIjsNCisJIyB9DQorDQorCSMjIyBUaGF0IHdhcyBoYWxmIHRoZSBTY2h3YXJ0emlhbiB0cmFuc2Zvcm0uICBIZXJlJ3MgdGhlIHJlc3Q6DQorCUBmaWVsZHMgPSBtYXAgeyAkXy0+WzFdIH0NCisJICAgICAgICAgIHNvcnQgeyAkYS0+WzBdIDw9PiAkYi0+WzBdIH0NCisJICAgICAgICAgIEByYW5rZWQ7DQorICAgIH0NCisNCisgICAgIyMjIERvbmUhDQorICAgIHJldHVybiBcQGZpZWxkczsNCit9DQorDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIGZpbGVuYW1lIFtGSUxFTkFNRV0NCisNCitJPEluc3RhbmNlIG1ldGhvZC4+DQorU2V0IHRoZSBmaWxlbmFtZSB3aGljaCB0aGlzIGRhdGEgd2lsbCBiZSByZXBvcnRlZCBhcy4NCitUaGlzIGFjdHVhbGx5IHNldHMgYm90aCAic3RhbmRhcmQiIGF0dHJpYnV0ZXMuDQorDQorV2l0aCBubyBhcmd1bWVudCwgcmV0dXJucyB0aGUgZmlsZW5hbWUgYXMgZGljdGF0ZWQgYnkgdGhlDQorY29udGVudC1kaXNwb3NpdGlvbi4NCisNCis9Y3V0DQorDQorc3ViIGZpbGVuYW1lIHsNCisgICAgbXkgKCRzZWxmLCAkZmlsZW5hbWUpID0gQF87DQorICAgIGlmIChAXyA+IDEpIHsNCisJJHNlbGYtPmF0dHIoJ2NvbnRlbnQtdHlwZS5uYW1lJyA9PiAkZmlsZW5hbWUpOw0KKwkkc2VsZi0+YXR0cignY29udGVudC1kaXNwb3NpdGlvbi5maWxlbmFtZScgPT4gJGZpbGVuYW1lKTsNCisgICAgfQ0KKyAgICAkc2VsZi0+YXR0cignY29udGVudC1kaXNwb3NpdGlvbi5maWxlbmFtZScpOw0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gZ2V0IFRBRyxbSU5ERVhdDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK0dldCB0aGUgY29udGVudHMgb2YgZmllbGQgVEFHLCB3aGljaCBtaWdodCBoYXZlIGJlZW4gc2V0DQord2l0aCBzZXQoKSBvciByZXBsYWNlKCkuICBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBmaWVsZC4NCisNCisgICAgJG1sLT5nZXQoJ1N1YmplY3QnLCAwKTsNCisNCitJZiB0aGUgb3B0aW9uYWwgMC1iYXNlZCBJTkRFWCBpcyBnaXZlbiwgdGhlbiB3ZSByZXR1cm4gdGhlIElOREVYJ3RoDQorb2NjdXJlbmNlIG9mIGZpZWxkIFRBRy4gIE90aGVyd2lzZSwgd2UgbG9vayBhdCB0aGUgY29udGV4dDoNCitJbiBhIHNjYWxhciBjb250ZXh0LCBvbmx5IHRoZSBmaXJzdCAoMHRoKSBvY2N1cmVuY2Ugb2YgdGhlDQorZmllbGQgaXMgcmV0dXJuZWQ7IGluIGFuIGFycmF5IGNvbnRleHQsIEk8YWxsPiBvY2N1cmVuY2VzIGFyZSByZXR1cm5lZC4NCisNCitJPFdhcm5pbmc6PiB0aGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBub24tTUlNRSBmaWVsZHMuDQorQmVoYXZpb3Igd2l0aCBNSU1FIGZpZWxkcyBpcyBUQkQsIGFuZCB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBmb3Igbm93Lg0KKw0KKz1jdXQNCisNCitzdWIgZ2V0IHsNCisgICAgbXkgKCRzZWxmLCAkdGFnLCAkaW5kZXgpID0gQF87DQorICAgICR0YWcgPSBsYygkdGFnKTsNCisgICAgQ2FycDo6Y3JvYWsgImdldDogY2FuJ3QgYmUgdXNlZCB3aXRoIE1JTUUgZmllbGRzXG4iIGlmIGlzX21pbWVfZmllbGQoJHRhZyk7DQorDQorICAgIG15IEBhbGwgPSBtYXAgeyAoJF8tPlswXSBlcSAkdGFnKSA/ICRfLT5bMV0gOiAoKX0gQHskc2VsZi0+e0hlYWRlcn19Ow0KKyAgICAoZGVmaW5lZCgkaW5kZXgpID8gJGFsbFskaW5kZXhdIDogKHdhbnRhcnJheSA/IEBhbGwgOiAkYWxsWzBdKSk7DQorfQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCis9aXRlbSBnZXRfbGVuZ3RoDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK1JlY29tcHV0ZSB0aGUgY29udGVudCBsZW5ndGggZm9yIHRoZSBtZXNzYWdlIEk8aWYgdGhlIHByb2Nlc3MgaXMgdHJpdmlhbD4sDQorc2V0dGluZyB0aGUgImNvbnRlbnQtbGVuZ3RoIiBhdHRyaWJ1dGUgYXMgYSBzaWRlLWVmZmVjdDoNCisNCisgICAgJG1zZy0+Z2V0X2xlbmd0aDsNCisNCitSZXR1cm5zIHRoZSBsZW5ndGgsIG9yIHVuZGVmaW5lZCBpZiBub3Qgc2V0Lg0KKw0KK0k8Tm90ZTo+IHRoZSBjb250ZW50IGxlbmd0aCBjYW4gYmUgZGlmZmljdWx0IHRvIGNvbXB1dGUsIHNpbmNlIGl0DQoraW52b2x2ZXMgYXNzZW1ibGluZyB0aGUgZW50aXJlIGVuY29kZWQgYm9keSBhbmQgdGFraW5nIHRoZSBsZW5ndGgNCitvZiBpdCAod2hpY2gsIGluIHRoZSBjYXNlIG9mIG11bHRpcGFydCBtZXNzYWdlcywgbWVhbnMgZnJlZXppbmcNCithbGwgdGhlIHN1Yi1wYXJ0cywgZXRjLikuDQorDQorVGhpcyBtZXRob2Qgb25seSBzZXRzIHRoZSBjb250ZW50IGxlbmd0aCB0byBhIGRlZmluZWQgdmFsdWUgaWYgdGhlDQorbWVzc2FnZSBpcyBhIHNpbmdsZXBhcnQgd2l0aCBDPCJiaW5hcnkiPiBlbmNvZGluZywgSTxhbmQ+IHRoZSBib2R5IGlzDQorYXZhaWxhYmxlIGVpdGhlciBpbi1jb3JlIG9yIGFzIGEgc2ltcGxlIGZpbGUuICBPdGhlcndpc2UsIHRoZSBjb250ZW50DQorbGVuZ3RoIGlzIHNldCB0byB0aGUgdW5kZWZpbmVkIHZhbHVlLg0KKw0KK1NpbmNlIGNvbnRlbnQtbGVuZ3RoIGlzIG5vdCBhIHN0YW5kYXJkIE1JTUUgZmllbGQgYW55d2F5ICh0aGF0J3MgcmlnaHQsIGtpZHM6DQoraXQncyBub3QgaW4gdGhlIE1JTUUgUkZDcywgaXQncyBhbiBIVFRQIHRoaW5nKSwgdGhpcyBzZWVtcyBwcmV0dHkgZmFpci4NCisNCis9Y3V0DQorDQorIy0tLS0NCisjIE1pa28ncyBub3RlOiBJIHdhc24ndCBxdWl0ZSBzdXJlIGhvdyB0byBoYW5kbGUgdGhpcywgc28gSSB3YWl0ZWQgdG8gaGVhcg0KKyMgd2hhdCB5b3UgdGhpbmsuICBHaXZlbiB0aGF0IHRoZSBjb250ZW50LWxlbmd0aCBpc24ndCBhbHdheXMgcmVxdWlyZWQsDQorIyBhbmQgZ2l2ZW4gdGhlIHBlcmZvcm1hbmNlIGNvc3Qgb2YgY2FsY3VsYXRpbmcgaXQgZnJvbSBhIGZpbGUgaGFuZGxlLA0KKyMgSSB0aG91Z2h0IGl0IG1pZ2h0IG1ha2UgbW9yZSBzZW5zZSB0byBhZGQgc29tZSBzb21lIHNvcnQgb2YgY29tcHV0ZWxlbmd0aA0KKyMgcHJvcGVydHkuIElmIGNvbXB1dGVsZW5ndGggaXMgZmFsc2UsIHRoZW4gdGhlIGxlbmd0aCBzaW1wbHkgaXNuJ3QNCisjIGNvbXB1dGVkLiAgV2hhdCBkbyB5b3UgdGhpbms/DQorIw0KKyMgRXJ5cSdzIHJlcGx5OiAgSSBhZ3JlZTsgZm9yIG5vdywgd2UgY2FuIHNpbGVudGx5IGxlYXZlIG91dCB0aGUgY29udGVudC10eXBlLg0KKw0KK3N1YiBnZXRfbGVuZ3RoIHsNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisNCisgICAgbXkgJGlzX211bHRpcGFydCA9ICgkc2VsZi0+YXR0cignY29udGVudC10eXBlJykgPX4gbXtebXVsdGlwYXJ0L31pKTsNCisgICAgbXkgJGVuYyA9IGxjKCRzZWxmLT5hdHRyKCdjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJykgfHwgJ2JpbmFyeScpOw0KKyAgICBteSAkbGVuZ3RoOw0KKyAgICBpZiAoISRpc19tdWx0aXBhcnQgJiYgKCRlbmMgZXEgImJpbmFyeSIpKXsgICMjIyBtaWdodCBmaWd1cmUgaXQgb3V0IGNoZWFwOg0KKwlpZiAgICAoZGVmaW5lZCgkc2VsZi0+e0RhdGF9KSkgeyAgICAgICAgICAgICAgICMjIyBpdCdzIGluIGNvcmUNCisJICAgICRsZW5ndGggPSBsZW5ndGgoJHNlbGYtPntEYXRhfSk7DQorCX0NCisJZWxzaWYgKGRlZmluZWQoJHNlbGYtPntGSH0pKSB7ICAgICAgICAgICAgICAgICAjIyMgaXQncyBpbiBhIGZpbGVoYW5kbGUNCisJICAgICMjIyBuby1vcDogaXQncyBleHBlbnNpdmUsIHNvIGRvbid0IGJvdGhlcg0KKwl9DQorCWVsc2lmIChkZWZpbmVkKCRzZWxmLT57UGF0aH0pKSB7ICAgICAgICAgICAgICAgIyMjIGl0J3MgYSBzaW1wbGUgZmlsZSENCisJICAgICRsZW5ndGggPSAoLXMgJHNlbGYtPntQYXRofSkgICBpZiAoLWUgJHNlbGYtPntQYXRofSk7DQorCX0NCisgICAgfQ0KKyAgICAkc2VsZi0+YXR0cignY29udGVudC1sZW5ndGgnID0+ICRsZW5ndGgpOw0KKyAgICByZXR1cm4gJGxlbmd0aDsNCit9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIHBhcnRzDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK1JldHVybiB0aGUgcGFydHMgb2YgdGhpcyBlbnRpdHksIGFuZCB0aGlzIGVudGl0eSBvbmx5Lg0KK1JldHVybnMgZW1wdHkgYXJyYXkgaWYgdGhpcyBlbnRpdHkgaGFzIG5vIHBhcnRzLg0KKw0KK1RoaXMgaXMgQjxub3Q+IHJlY3Vyc2l2ZSEgIFBhcnRzIGNhbiBoYXZlIHN1Yi1wYXJ0czsgdXNlDQorcGFydHNfREZTKCkgdG8gZ2V0IGV2ZXJ5dGhpbmcuDQorDQorPWN1dA0KKw0KK3N1YiBwYXJ0cyB7DQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgIEB7JHNlbGYtPntQYXJ0c30gfHwgW119Ow0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gcGFydHNfREZTDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK1JldHVybiB0aGUgbGlzdCBvZiBhbGwgTUlNRTo6TGl0ZSBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBlbnRpdHksDQorc3RhcnRpbmcgd2l0aCB0aGUgZW50aXR5IGl0c2VsZiwgaW4gZGVwdGgtZmlyc3Qtc2VhcmNoIG9yZGVyLg0KK0lmIHRoaXMgb2JqZWN0IGhhcyBubyBwYXJ0cywgaXQgYWxvbmUgd2lsbCBiZSByZXR1cm5lZC4NCisNCis9Y3V0DQorDQorc3ViIHBhcnRzX0RGUyB7DQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgIHJldHVybiAoJHNlbGYsIG1hcCB7ICRfLT5wYXJ0c19ERlMgfSAkc2VsZi0+cGFydHMpOw0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gcHJlYW1ibGUgW1RFWFRdDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK0dldC9zZXQgdGhlIHByZWFtYmxlIHN0cmluZywgYXNzdW1pbmcgdGhhdCB0aGlzIG9iamVjdCBoYXMgc3VicGFydHMuDQorU2V0IGl0IHRvIHVuZGVmIGZvciB0aGUgZGVmYXVsdCBzdHJpbmcuDQorDQorPWN1dA0KKw0KK3N1YiBwcmVhbWJsZSB7DQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgICRzZWxmLT57UHJlYW1ibGV9ID0gc2hpZnQgaWYgQF87DQorICAgICRzZWxmLT57UHJlYW1ibGV9Ow0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gcmVwbGFjZSBUQUcsVkFMVUUNCisNCitJPEluc3RhbmNlIG1ldGhvZC4+DQorRGVsZXRlIGFsbCBvY2N1cmVuY2VzIG9mIGZpZWxkcyBuYW1lZCBUQUcsIGFuZCBhZGQgYSBuZXcNCitmaWVsZCB3aXRoIHRoZSBnaXZlbiBWQUxVRS4gIFRBRyBpcyBjb252ZXJ0ZWQgdG8gYWxsLWxvd2VyY2FzZS4NCisNCitCPEJld2FyZT4gdGhlIHNwZWNpYWwgTUlNRSBmaWVsZHMgKE1JTUUtdmVyc2lvbiwgQ29udGVudC0qKToNCitpZiB5b3UgInJlcGxhY2UiIGEgTUlNRSBmaWVsZCwgdGhlIHJlcGxhY2VtZW50IHRleHQgd2lsbCBvdmVycmlkZQ0KK3RoZSBJPGFjdHVhbD4gTUlNRSBhdHRyaWJ1dGVzIHdoZW4gaXQgY29tZXMgdGltZSB0byBvdXRwdXQgdGhhdCBmaWVsZC4NCitTbyBub3JtYWxseSB5b3UgdXNlIGF0dHIoKSB0byBjaGFuZ2UgTUlNRSBmaWVsZHMgYW5kIGFkZCgpL3JlcGxhY2UoKSB0bw0KK2NoYW5nZSBJPG5vbi1NSU1FPiBmaWVsZHM6DQorDQorICAgICRtc2ctPnJlcGxhY2UoIlN1YmplY3QiID0+ICJIaSB0aGVyZSEiKTsNCisNCitHaXZpbmcgVkFMVUUgYXMgdGhlIEk8ZW1wdHkgc3RyaW5nPiB3aWxsIGVmZmVjdGl2ZWx5IEk8cHJldmVudD4gdGhhdA0KK2ZpZWxkIGZyb20gYmVpbmcgb3V0cHV0LiAgVGhpcyBpcyB0aGUgY29ycmVjdCB3YXkgdG8gc3VwcHJlc3MNCit0aGUgc3BlY2lhbCBNSU1FIGZpZWxkczoNCisNCisgICAgJG1zZy0+cmVwbGFjZSgiQ29udGVudC1kaXNwb3NpdGlvbiIgPT4gIiIpOw0KKw0KK0dpdmluZyBWQUxVRSBhcyBJPHVuZGVmaW5lZD4gd2lsbCBqdXN0IGNhdXNlIGFsbCBleHBsaWNpdCB2YWx1ZXMNCitmb3IgVEFHIHRvIGJlIGRlbGV0ZWQsIHdpdGhvdXQgaGF2aW5nIGFueSBuZXcgdmFsdWVzIGFkZGVkLg0KKw0KK0k8Tm90ZTo+IHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kICBjb21lcyBmcm9tIE1haWw6OkhlYWRlci4NCisNCis9Y3V0DQorDQorc3ViIHJlcGxhY2Ugew0KKyAgICBteSAoJHNlbGYsICR0YWcsICR2YWx1ZSkgPSBAXzsNCisgICAgJHNlbGYtPmRlbGV0ZSgkdGFnKTsNCisgICAgJHNlbGYtPmFkZCgkdGFnLCAkdmFsdWUpIGlmIGRlZmluZWQoJHZhbHVlKTsNCit9DQorDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIHNjcnViDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK0I8VGhpcyBpcyBBbHBoYSBjb2RlLiAgSWYgeW91IHVzZSBpdCwgcGxlYXNlIGxldCBtZSBrbm93IGhvdyBpdCBnb2VzLj4NCitSZWN1cnNpdmVseSBnb2VzIHRocm91Z2ggdGhlICJwYXJ0cyIgdHJlZSBvZiB0aGlzIG1lc3NhZ2UgYW5kIHRyaWVzDQordG8gZmluZCBNSU1FIGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgcmVtb3ZlZC4NCitXaXRoIGFuIGFycmF5IGFyZ3VtZW50LCByZW1vdmVzIGV4YWN0bHkgdGhvc2UgYXR0cmlidXRlczsgZS5nLjoNCisNCisgICAgJG1zZy0+c2NydWIoWydjb250ZW50LWRpc3Bvc2l0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJ10pOw0KKw0KK0lzIHRoZSBzYW1lIGFzIHJlY3Vyc2l2ZWx5IGRvaW5nOg0KKw0KKyAgICAkbXNnLT5yZXBsYWNlKCdDb250ZW50LWRpc3Bvc2l0aW9uJyA9PiAnJyk7DQorICAgICRtc2ctPnJlcGxhY2UoJ0NvbnRlbnQtbGVuZ3RoJyAgICAgID0+ICcnKTsNCisNCis9Y3V0DQorDQorc3ViIHNjcnViIHsNCisgICAgbXkgKCRzZWxmLCBAYSkgPSBAXzsNCisgICAgbXkgKCRleHBsKSA9IEBhOw0KKyAgICBsb2NhbCAkUVVJRVQgPSAxOw0KKw0KKyAgICAjIyMgU2NydWIgbWU6DQorICAgIGlmICghQGEpIHsgICAgICAgICAjIyMgZ3Vlc3MNCisNCisJIyMjIFNjcnViIGxlbmd0aCBhbHdheXM6DQorCSRzZWxmLT5yZXBsYWNlKCdjb250ZW50LWxlbmd0aCcsICcnKTsNCisNCisJIyMjIFNjcnViIGRpc3Bvc2l0aW9uIGlmIG5vIGZpbGVuYW1lLCBvciBpZiBjb250ZW50LXR5cGUgaGFzIHNhbWUgaW5mbzoNCisJaWYgKCEkc2VsZi0+X3NhZmVfYXR0cignY29udGVudC1kaXNwb3NpdGlvbi5maWxlbmFtZScpIHx8DQorCSAgICAkc2VsZi0+X3NhZmVfYXR0cignY29udGVudC10eXBlLm5hbWUnKSkgew0KKwkgICAgJHNlbGYtPnJlcGxhY2UoJ2NvbnRlbnQtZGlzcG9zaXRpb24nLCAnJyk7DQorCX0NCisNCisJIyMjIFNjcnViIGVuY29kaW5nIGlmIGVmZmVjdGl2ZWx5IHVuZW5jb2RlZDoNCisJaWYgKCRzZWxmLT5fc2FmZV9hdHRyKCdjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJykgPX4NCisJICAgIC9eKDdiaXR8OGJpdHxiaW5hcnkpJC9pKSB7DQorCSAgICAkc2VsZi0+cmVwbGFjZSgnY29udGVudC10cmFuc2Zlci1lbmNvZGluZycsICcnKTsNCisJfQ0KKw0KKwkjIyMgU2NydWIgY2hhcnNldCBpZiBVUy1BU0NJSToNCisJaWYgKCRzZWxmLT5fc2FmZV9hdHRyKCdjb250ZW50LXR5cGUuY2hhcnNldCcpID1+IC9eKHVzLWFzY2lpKS9pKSB7DQorCSAgICAkc2VsZi0+YXR0cignY29udGVudC10eXBlLmNoYXJzZXQnID0+IHVuZGVmKTsNCisJfQ0KKw0KKwkjIyMgVEJEOiB0aGlzIGlzIG5vdCByZWFsbHkgcmlnaHQgZm9yIG1lc3NhZ2UvZGlnZXN0Og0KKwlpZiAoKGtleXMgJXskc2VsZi0+e0F0dHJzfXsnY29udGVudC10eXBlJ319ID09IDEpIGFuZA0KKwkgICAgKCRzZWxmLT5fc2FmZV9hdHRyKCdjb250ZW50LXR5cGUnKSBlcSAndGV4dC9wbGFpbicpKSB7DQorCSAgICAkc2VsZi0+cmVwbGFjZSgnY29udGVudC10eXBlJywgJycpOw0KKwl9DQorICAgIH0NCisgICAgZWxzaWYgKCRleHBsIGFuZCAocmVmKCRleHBsKSBlcSAnQVJSQVknKSkgew0KKwlmb3JlYWNoIChAeyRleHBsfSkgeyAkc2VsZi0+cmVwbGFjZSgkXywgJycpOyB9DQorICAgIH0NCisNCisgICAgIyMjIFNjcnViIG15IGtpZHM6DQorICAgIGZvcmVhY2ggKEB7JHNlbGYtPntQYXJ0c319KSB7ICRfLT5zY3J1YihAYSk7IH0NCit9DQorDQorPWJhY2sNCisNCis9Y3V0DQorDQorDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCis9aGVhZDIgU2V0dGluZy9nZXR0aW5nIG1lc3NhZ2UgZGF0YQ0KKw0KKz1vdmVyIDQNCisNCis9Y3V0DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIGJpbm1vZGUgW09WRVJSSURFXQ0KKw0KK0k8SW5zdGFuY2UgbWV0aG9kLj4NCitXaXRoIG5vIGFyZ3VtZW50LCByZXR1cm5zIHdoZXRoZXIgb3Igbm90IGl0IHRoaW5rcyB0aGF0IHRoZSBkYXRhDQorKGFzIGdpdmVuIGJ5IHRoZSAiUGF0aCIgYXJndW1lbnQgb2YgQzxidWlsZCgpPikgc2hvdWxkIGJlIHJlYWQgdXNpbmcNCitiaW5tb2RlKCkgKGZvciBleGFtcGxlLCB3aGVuIEM8cmVhZF9ub3coKT4gaXMgaW52b2tlZCkuDQorDQorVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdGhhdCBhbnkgY29udGVudCB0eXBlIG90aGVyIHRoYW4NCitDPHRleHQvKj4gb3IgQzxtZXNzYWdlLyo+IGlzIGJpbm1vZGUnZDsgdGhpcyBzaG91bGQgaW4gZ2VuZXJhbCB3b3JrIGZpbmUuDQorDQorV2l0aCBhIGRlZmluZWQgYXJndW1lbnQsIHRoaXMgbWV0aG9kIHNldHMgYW4gZXhwbGljaXQgIm92ZXJyaWRlIg0KK3ZhbHVlLiAgQW4gdW5kZWZpbmVkIGFyZ3VtZW50IHVuc2V0cyB0aGUgb3ZlcnJpZGUuDQorVGhlIG5ldyBjdXJyZW50IHZhbHVlIGlzIHJldHVybmVkLg0KKw0KKz1jdXQNCisNCitzdWIgYmlubW9kZSB7DQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgICRzZWxmLT57QmlubW9kZX0gPSBzaGlmdCBpZiAoQF8pOyAgICAgICAjIyMgYXJndW1lbnQ/IHNldCBvdmVycmlkZQ0KKyAgICByZXR1cm4gKGRlZmluZWQoJHNlbGYtPntCaW5tb2RlfSkNCisJICAgID8gJHNlbGYtPntCaW5tb2RlfQ0KKwkgICAgOiAoJHNlbGYtPmF0dHIoImNvbnRlbnQtdHlwZSIpICF+IG17Xih0ZXh0fG1lc3NhZ2UpL31pKSk7DQorfQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCis9aXRlbSBkYXRhIFtEQVRBXQ0KKw0KK0k8SW5zdGFuY2UgbWV0aG9kLj4NCitHZXQvc2V0IHRoZSBsaXRlcmFsIERBVEEgb2YgdGhlIG1lc3NhZ2UuICBUaGUgREFUQSBtYXkgYmUNCitlaXRoZXIgYSBzY2FsYXIsIG9yIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5IG9mIHNjYWxhcnMgKHdoaWNoDQord2lsbCBzaW1wbHkgYmUgam9pbmVkKS4NCisNCitJPFdhcm5pbmc6PiBzZXR0aW5nIHRoZSBkYXRhIGNhdXNlcyB0aGUgImNvbnRlbnQtbGVuZ3RoIiBhdHRyaWJ1dGUNCit0byBiZSByZWNvbXB1dGVkIChwb3NzaWJseSB0byBub3RoaW5nKS4NCisNCis9Y3V0DQorDQorc3ViIGRhdGEgew0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKyAgICBpZiAoQF8pIHsNCisJJHNlbGYtPntEYXRhfSA9ICgocmVmKCRfWzBdKSBlcSAnQVJSQVknKSA/IGpvaW4oJycsIEB7JF9bMF19KSA6ICRfWzBdKTsNCisJJHNlbGYtPmdldF9sZW5ndGg7DQorICAgIH0NCisgICAgJHNlbGYtPntEYXRhfTsNCit9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIGZoIFtGSUxFSEFORExFXQ0KKw0KK0k8SW5zdGFuY2UgbWV0aG9kLj4NCitHZXQvc2V0IHRoZSBGSUxFSEFORExFIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlIGRhdGEuDQorDQorVGFrZXMgYSBmaWxlaGFuZGxlIGFzIGFuIGlucHV0IGFuZCBzdG9yZXMgaXQgaW4gdGhlIG9iamVjdC4NCitUaGlzIHJvdXRpbmUgaXMgc2ltaWxhciB0byBwYXRoKCk7IG9uZSBpbXBvcnRhbnQgZGlmZmVyZW5jZSBpcyB0aGF0DQorbm8gYXR0ZW1wdCBpcyBtYWRlIHRvIHNldCB0aGUgY29udGVudCBsZW5ndGguDQorDQorPWN1dA0KKw0KK3N1YiBmaCB7DQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgICRzZWxmLT57Rkh9ID0gc2hpZnQgaWYgQF87DQorICAgICRzZWxmLT57Rkh9Ow0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gcGF0aCBbUEFUSF0NCisNCitJPEluc3RhbmNlIG1ldGhvZC4+DQorR2V0L3NldCB0aGUgUEFUSCB0byB0aGUgbWVzc2FnZSBkYXRhLg0KKw0KK0k8V2FybmluZzo+IHNldHRpbmcgdGhlIHBhdGggcmVjb21wdXRlcyBhbnkgZXhpc3RpbmcgImNvbnRlbnQtbGVuZ3RoIiBmaWVsZCwNCithbmQgcmUtc2V0cyB0aGUgImZpbGVuYW1lIiAodG8gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGF0aCBpZiBpdA0KK2xvb2tzIGxpa2UgYSBzaW1wbGUgcGF0aCwgYW5kIHRvIG5vdGhpbmcgaWYgbm90KS4NCisNCis9Y3V0DQorDQorc3ViIHBhdGggew0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKyAgICBpZiAoQF8pIHsNCisNCisJIyMjIFNldCB0aGUgcGF0aCwgYW5kIGludmFsaWRhdGUgdGhlIGNvbnRlbnQgbGVuZ3RoOg0KKwkkc2VsZi0+e1BhdGh9ID0gc2hpZnQ7DQorDQorCSMjIyBSZS1zZXQgZmlsZW5hbWUsIGV4dHJhY3RpbmcgaXQgZnJvbSBwYXRoIGlmIHBvc3NpYmxlOg0KKwlteSAkZmlsZW5hbWU7DQorCWlmICgkc2VsZi0+e1BhdGh9IGFuZCAoJHNlbGYtPntQYXRofSAhfiAvXHwkLykpIHsgICMjIyBub24tc2hlbGwgcGF0aDoNCisJICAgICgkZmlsZW5hbWUgPSAkc2VsZi0+e1BhdGh9KSA9fiBzL148Ly87DQorDQorCSAgICAjIyMgQ29uc3VsdCBGaWxlOjpCYXNlbmFtZSwgbWF5YmU6DQorCSAgICBpZiAoJEhhdmVGaWxlQmFzZW5hbWUpIHsNCisJCSRmaWxlbmFtZSA9IEZpbGU6OkJhc2VuYW1lOjpiYXNlbmFtZSgkZmlsZW5hbWUpOw0KKwkgICAgfQ0KKwkgICAgZWxzZSB7DQorCQkoJGZpbGVuYW1lKSA9ICgkZmlsZW5hbWUgPX4gbXsoW15cL10rKVxafSk7DQorCSAgICB9DQorCX0NCisJJHNlbGYtPmZpbGVuYW1lKCRmaWxlbmFtZSk7DQorDQorCSMjIyBSZXNldCB0aGUgbGVuZ3RoOg0KKwkkc2VsZi0+Z2V0X2xlbmd0aDsNCisgICAgfQ0KKyAgICAkc2VsZi0+e1BhdGh9Ow0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gcmVzZXRmaCBbRklMRUhBTkRMRV0NCisNCitJPEluc3RhbmNlIG1ldGhvZC4+DQorU2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBmaWxlaGFuZGxlIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4NCitPbmx5IGFwcGxpZXMgaWYgeW91IHVzZWQgIkZIIiBpbiBidWlsZCgpIG9yIGF0dGFjaCgpIGZvciB0aGlzIG1lc3NhZ2UuDQorDQorUmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gcmVzZXQgdGhlIGZpbGVoYW5kbGUgKHNpbmNlIG5vdCBhbGwgZmlsZWhhbmRsZXMNCithcmUgc2Vla2FibGUpLg0KKw0KKz1jdXQNCisNCisjLS0tLQ0KKyMgTWlrbydzIG5vdGU6IFdpdGggdGhlIERhdGEgYW5kIFBhdGgsIHRoZSBzYW1lIGRhdGEgY291bGQgdGhlb3JldGljYWxseQ0KKyMgYmUgcmV1c2VkLiAgSG93ZXZlciwgZmlsZSBoYW5kbGVzIG5lZWQgdG8gYmUgcmVzZXQgdG8gYmUgcmV1c2VkLA0KKyMgc28gSSBhZGRlZCB0aGlzIHJvdXRpbmUuDQorIw0KKyMgRXJ5cSByZXBseTogYmV3YXJlLi4uIG5vdCBhbGwgZmlsZWhhbmRsZXMgYXJlIHNlZWthYmxlICh0aGluayBhYm91dCBTVERJTikhDQorDQorc3ViIHJlc2V0Zmggew0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKyAgICBzZWVrKCRzZWxmLT57Rkh9LDAsMCk7DQorfQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCis9aXRlbSByZWFkX25vdw0KKw0KK0k8SW5zdGFuY2UgbWV0aG9kLj4NCitGb3JjZXMgZGF0YSBmcm9tIHRoZSBwYXRoL2ZpbGVoYW5kbGUgKGFzIHNwZWNpZmllZCBieSBDPGJ1aWxkKCk+KQ0KK3RvIGJlIHJlYWQgaW50byBjb3JlIGltbWVkaWF0ZWx5LCBqdXN0IGFzIHRob3VnaCB5b3UgaGFkIGdpdmVuIGl0DQorbGl0ZXJhbGx5IHdpdGggdGhlIEM8RGF0YT4ga2V5d29yZC4NCisNCitOb3RlIHRoYXQgdGhlIGluLWNvcmUgZGF0YSB3aWxsIGFsd2F5cyBiZSB1c2VkIGlmIGF2YWlsYWJsZS4NCisNCitCZSBhd2FyZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgc2x1cnBlZCBpbnRvIGEgZ2lhbnQgc2NhbGFyOiB5b3UgbWF5IG5vdCB3YW50DQordG8gdXNlIHRoaXMgaWYgc2VuZGluZyB0YXIgZmlsZXMhICBUaGUgYmVuZWZpdCBvZiBJPG5vdD4gcmVhZGluZyBpbiB0aGUgZGF0YQ0KK2lzIHRoYXQgdmVyeSBsYXJnZSBmaWxlcyBjYW4gYmUgaGFuZGxlZCBieSB0aGlzIG1vZHVsZSBpZiBsZWZ0IG9uIGRpc2sNCit1bnRpbCB0aGUgbWVzc2FnZSBpcyBvdXRwdXQgdmlhIEM8cHJpbnQoKT4gb3IgQzxwcmludF9ib2R5KCk+Lg0KKw0KKz1jdXQNCisNCitzdWIgcmVhZF9ub3cgew0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKyAgICBsb2NhbCAkLyA9IHVuZGVmOw0KKw0KKyAgICBpZiAgICAoJHNlbGYtPntGSH0pIHsgICAgICAgIyMjIGRhdGEgZnJvbSBhIGZpbGVoYW5kbGU6DQorCW15ICRjaHVuazsNCisJbXkgQGNodW5rczsNCisJQ09SRTo6YmlubW9kZSgkc2VsZi0+e0ZIfSkgaWYgJHNlbGYtPmJpbm1vZGU7DQorCXdoaWxlIChyZWFkKCRzZWxmLT57Rkh9LCAkY2h1bmssIDEwMjQpKSB7DQorCSAgICBwdXNoIEBjaHVua3MsICRjaHVuazsNCisJfQ0KKwkkc2VsZi0+e0RhdGF9ID0gam9pbiAnJywgQGNodW5rczsNCisgICAgfQ0KKyAgICBlbHNpZiAoJHNlbGYtPntQYXRofSkgeyAgICAgIyMjIGRhdGEgZnJvbSBhIHBhdGg6DQorCW9wZW4gU0xVUlAsICRzZWxmLT57UGF0aH0gb3IgQ2FycDo6Y3JvYWsgIm9wZW4gJHNlbGYtPntQYXRofTogJCFcbiI7DQorCUNPUkU6OmJpbm1vZGUoU0xVUlApIGlmICRzZWxmLT5iaW5tb2RlOw0KKwkkc2VsZi0+e0RhdGF9ID0gPFNMVVJQPjsgICAgICAgICMjIyBzc3Nzc3Nzc3Nzc3Nzc2x1cnAuLi4NCisJY2xvc2UgU0xVUlA7ICAgICAgICAgICAgICAgICAgICAjIyMgLi4uYWFhYWFhYWFhaGhoIQ0KKyAgICB9DQorfQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCis9aXRlbSBzaWduIFBBUkFNSEFTSA0KKw0KK0k8SW5zdGFuY2UgbWV0aG9kLj4NCitTaWduIHRoZSBtZXNzYWdlLiAgVGhpcyBmb3JjZXMgdGhlIG1lc3NhZ2UgdG8gYmUgcmVhZCBpbnRvIGNvcmUsDQorYWZ0ZXIgd2hpY2ggdGhlIHNpZ25hdHVyZSBpcyBhcHBlbmRlZCB0byBpdC4NCisNCis9b3ZlciA0DQorDQorPWl0ZW0gRGF0YQ0KKw0KK0FzIGluIEM8YnVpbGQoKT46IHRoZSBsaXRlcmFsIHNpZ25hdHVyZSBkYXRhLg0KK0NhbiBiZSBlaXRoZXIgYSBzY2FsYXIgb3IgYSByZWYgdG8gYW4gYXJyYXkgb2Ygc2NhbGFycy4NCisNCis9aXRlbSBQYXRoDQorDQorQXMgaW4gQzxidWlsZCgpPjogdGhlIHBhdGggdG8gdGhlIGZpbGUuDQorDQorPWJhY2sNCisNCitJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUgZGVmYXVsdCBpczoNCisNCisgICAgUGF0aCA9PiAiJEVOVntIT01FfS8uc2lnbmF0dXJlIg0KKw0KK1RoZSBjb250ZW50LWxlbmd0aCBpcyByZWNvbXB1dGVkLg0KKw0KKz1jdXQNCisNCitzdWIgc2lnbiB7DQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgIG15ICVwYXJhbXMgPSBAXzsNCisNCisgICAgIyMjIERlZmF1bHQ6DQorICAgIEBfIG9yICRwYXJhbXN7UGF0aH0gPSAiJEVOVntIT01FfS8uc2lnbmF0dXJlIjsNCisNCisgICAgIyMjIEZvcmNlIG1lc3NhZ2UgaW4tY29yZToNCisgICAgZGVmaW5lZCgkc2VsZi0+e0RhdGF9KSBvciAkc2VsZi0+cmVhZF9ub3c7DQorDQorICAgICMjIyBMb2FkIHNpZ25hdHVyZToNCisgICAgbXkgJHNpZzsNCisgICAgaWYgKCFkZWZpbmVkKCRzaWcgPSAkcGFyYW1ze0RhdGF9KSkgeyAgICAgICMjIyBub3QgZ2l2ZW4gZXhwbGljaXRseToNCisJbG9jYWwgJC8gPSB1bmRlZjsNCisJb3BlbiBTSUcsICRwYXJhbXN7UGF0aH0gb3IgQ2FycDo6Y3JvYWsgIm9wZW4gc2lnICRwYXJhbXN7UGF0aH06ICQhXG4iOw0KKwkkc2lnID0gPFNJRz47ICAgICAgICAgICAgICAgICAgIyMjIHNzc3Nzc3Nzc3Nzc3NzbHVycC4uLg0KKwljbG9zZSBTSUc7ICAgICAgICAgICAgICAgICAgICAgIyMjIC4uLmFhYWFhYWFhYWhoaCENCisgICAgfQ0KKyAgICAkc2lnID0gam9pbignJyxAJHNpZykgaWYgKHJlZigkc2lnKSBhbmQgKHJlZigkc2lnKSBlcSAnQVJSQVknKSk7DQorDQorICAgICMjIyBBcHBlbmQsIGZvbGxvd2luZyBJbnRlcm5ldCBjb252ZW50aW9uczoNCisgICAgJHNlbGYtPntEYXRhfSAuPSAiXG4tLSBcbiRzaWciOw0KKw0KKyAgICAjIyMgUmUtY29tcHV0ZSBsZW5ndGg6DQorICAgICRzZWxmLT5nZXRfbGVuZ3RoOw0KKyAgICAxOw0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIw0KKyMgPWl0ZW0gc3VnZ2VzdF9lbmNvZGluZyBDT05URU5UVFlQRQ0KKyMNCisjIEk8Q2xhc3MvaW5zdGFuY2UgbWV0aG9kLj4NCisjIEJhc2VkIG9uIHRoZSBDT05URU5UVFlQRSwgcmV0dXJuIGEgZ29vZCBzdWdnZXN0ZWQgZW5jb2RpbmcuDQorIyBDPHRleHQ+IGFuZCBDPG1lc3NhZ2U+IHR5cGVzIGhhdmUgdGhlaXIgYm9kaWVzIHNjYW5uZWQgbGluZS1ieS1saW5lDQorIyBmb3IgOC1iaXQgY2hhcmFjdGVycyBhbmQgbG9uZyBsaW5lczsgbGFjayBvZiBlaXRoZXIgbWVhbnMgdGhhdCB0aGUNCisjIG1lc3NhZ2UgaXMgN2JpdC1vay4gIE90aGVyIHR5cGVzIGFyZSBjaG9zZW4gaW5kZXBlbmRlbnQgb2YgdGhlaXIgYm9keToNCisjDQorIyAgICBNYWpvciB0eXBlOiAgICAgICA3Yml0IG9rPyAgICBTdWdnZXN0ZWQgZW5jb2Rpbmc6DQorIyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjICAgIHRleHQgICAgICAgICAgICAgIHllcyAgICAgICAgIDdiaXQNCisjICAgICAgICAgICAgICAgICAgICAgIG5vICAgICAgICAgIHF1b3RlZC1wcmludGFibGUNCisjICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gICAgIGJpbmFyeQ0KKyMNCisjICAgIG1lc3NhZ2UgICAgICAgICAgIHllcyAgICAgICAgIDdiaXQNCisjICAgICAgICAgICAgICAgICAgICAgIG5vICAgICAgICAgIGJpbmFyeQ0KKyMgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biAgICAgYmluYXJ5DQorIw0KKyMgICAgbXVsdGlwYXJ0ICAgICAgICAgbi9hICAgICAgICAgYmluYXJ5IChpbiBjYXNlIHNvbWUgcGFydHMgYXJlIG5vdCBvaykNCisjDQorIyAgICAob3RoZXIpICAgICAgICAgICBuL2EgICAgICAgICBiYXNlNjQNCisjDQorIz1jdXQNCisNCitzdWIgc3VnZ2VzdF9lbmNvZGluZyB7DQorICAgIG15ICgkc2VsZiwgJGN0eXBlKSA9IEBfOw0KKyAgICAkY3R5cGUgPSBsYygkY3R5cGUpOw0KKw0KKyAgICAjIyMgQ29uc3VsdCBNSU1FOjpUeXBlcywgbWF5YmU6DQorICAgIGlmICgkSGF2ZU1pbWVUeXBlcykgew0KKw0KKwkjIyMgTWFwcGluZ3MgY29udGFpbiBbc3VmZml4LG1pbWV0eXBlLGVuY29kaW5nXQ0KKwlteSBAbWFwcGluZ3MgPSBNSU1FOjpUeXBlczo6YnlfbWVkaWF0eXBlKCRjdHlwZSk7DQorCWlmIChzY2FsYXIoQG1hcHBpbmdzKSkgew0KKwkgICAgIyMjIEp1c3QgcGljayB0aGUgZmlyc3Qgb25lOg0KKwkgICAgbXkgKCRzdWZmaXgsICRtaW1ldHlwZSwgJGVuY29kaW5nKSA9IEB7JG1hcHBpbmdzWzBdfTsNCisJICAgIGlmICgkZW5jb2RpbmcgJiYNCisJCSRlbmNvZGluZyA9fi9eKGJhc2U2NHxiaW5hcnl8Wzc4XWJpdHxxdW90ZWQtcHJpbnRhYmxlKSQvaSkgew0KKwkJcmV0dXJuIGxjKCRlbmNvZGluZyk7ICAgICMjIyBzYW5pdHkgY2hlY2sNCisJICAgIH0NCisJfQ0KKyAgICB9DQorDQorICAgICMjIyBJZiB3ZSBnb3QgaGVyZSwgdGhlbiBNSU1FOjpUeXBlcyB3YXMgbm8gaGVscC4NCisgICAgIyMjIEV4dHJhY3QgbWFqb3IgdHlwZToNCisgICAgbXkgKCR0eXBlKSA9IHNwbGl0ICcvJywgJGN0eXBlOw0KKyAgICBpZiAoKCR0eXBlIGVxICd0ZXh0JykgfHwgKCR0eXBlIGVxICdtZXNzYWdlJykpIHsgICAgIyMjIHNjYW4gbWVzc2FnZSBib2R5Pw0KKwlyZXR1cm4gJ2JpbmFyeSc7DQorICAgIH0NCisgICAgZWxzZSB7DQorCXJldHVybiAoJHR5cGUgZXEgJ211bHRpcGFydCcpID8gJ2JpbmFyeScgOiAnYmFzZTY0JzsNCisgICAgfQ0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIw0KKyMgPWl0ZW0gc3VnZ2VzdF90eXBlIFBBVEgNCisjDQorIyBJPENsYXNzL2luc3RhbmNlIG1ldGhvZC4+DQorIyBTdWdnZXN0IHRoZSBjb250ZW50LXR5cGUgZm9yIHRoaXMgYXR0YWNoZWQgcGF0aC4NCisjIFdlIGFsd2F5cyBmYWxsIGJhY2sgdG8gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIgaWYgbm8gZ29vZCBndWVzcw0KKyMgY2FuIGJlIG1hZGUsIHNvIGRvbid0IHVzZSB0aGlzIGlmIHlvdSBkb24ndCBtZWFuIGl0IQ0KKyMNCitzdWIgc3VnZ2VzdF90eXBlIHsNCisgICAgbXkgKCRzZWxmLCAkcGF0aCkgPSBAXzsNCisNCisgICAgIyMjIElmIHRoZXJlJ3Mgbm8gcGF0aCwgYmFpbDoNCisgICAgJHBhdGggb3IgcmV0dXJuICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nOw0KKw0KKyAgICAjIyMgQ29uc3VsdCBNSU1FOjpUeXBlcywgbWF5YmU6DQorICAgIGlmICgkSGF2ZU1pbWVUeXBlcykgew0KKwkjIE1hcHBpbmdzIGNvbnRhaW4gW21pbWV0eXBlLGVuY29kaW5nXToNCisJCW15ICgkbWltZXR5cGUsICRlbmNvZGluZykgPSBNSU1FOjpUeXBlczo6Ynlfc3VmZml4KCRwYXRoKTsNCisJCXJldHVybiAkbWltZXR5cGUgaWYgKCRtaW1ldHlwZSAmJiAkbWltZXR5cGUgPX4gL15cUytcL1xTKyQvKTsgICMjIyBzYW5pdHkgY2hlY2sNCisgICAgfQ0KKyAgICAjIyMgSWYgd2UgZ290IGhlcmUsIHRoZW4gTUlNRTo6VHlwZXMgd2FzIG5vIGhlbHAuDQorICAgICMjIyBUaGUgY29ycmVjdCB0aGluZyB0byBmYWxsIGJhY2sgdG8gaXMgdGhlIG1vc3QtZ2VuZXJpYyBjb250ZW50IHR5cGU6DQorICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsNCit9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIHZlcmlmeV9kYXRhDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK1ZlcmlmeSB0aGF0IGFsbCAicGF0aHMiIHRvIGF0dGFjaGVkIGRhdGEgZXhpc3QsIHJlY3Vyc2l2ZWx5Lg0KK0l0IG1pZ2h0IGJlIGEgZ29vZCBpZGVhIGZvciB5b3UgdG8gZG8gdGhpcyBiZWZvcmUgYSBwcmludCgpLCB0bw0KK3ByZXZlbnQgYWNjaWRlbnRhbCBwYXJ0aWFsIG91dHB1dCBpZiBhIGZpbGUgbWlnaHQgYmUgbWlzc2luZy4NCitSYWlzZXMgZXhjZXB0aW9uIGlmIGFueSBwYXRoIGlzIG5vdCByZWFkYWJsZS4NCisNCis9Y3V0DQorDQorc3ViIHZlcmlmeV9kYXRhIHsNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisNCisgICAgIyMjIFZlcmlmeSBzZWxmOg0KKyAgICBteSAkcGF0aCA9ICRzZWxmLT57UGF0aH07DQorICAgIGlmICgkcGF0aCBhbmQgKCRwYXRoICF+IC9cfCQvKSkgeyAgIyMjIG5vbi1zaGVsbCBwYXRoOg0KKwkkcGF0aCA9fiBzL148Ly87DQorCSgtciAkcGF0aCkgb3IgZGllICIkcGF0aDogbm90IHJlYWRhYmxlXG4iOw0KKyAgICB9DQorDQorICAgICMjIyBWZXJpZnkgcGFydHM6DQorICAgIGZvcmVhY2ggbXkgJHBhcnQgKEB7JHNlbGYtPntQYXJ0c319KSB7ICRwYXJ0LT52ZXJpZnlfZGF0YSB9DQorICAgIDE7DQorfQ0KKw0KKz1iYWNrDQorDQorPWN1dA0KKw0KKw0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorPWhlYWQyIE91dHB1dA0KKw0KKz1vdmVyIDQNCisNCis9Y3V0DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIHByaW50IFtPVVRIQU5ETEVdDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK1ByaW50IHRoZSBtZXNzYWdlIHRvIHRoZSBnaXZlbiBvdXRwdXQgaGFuZGxlLCBvciB0byB0aGUgY3VycmVudGx5LXNlbGVjdGVkDQorZmlsZWhhbmRsZSBpZiBub25lIHdhcyBnaXZlbi4NCisNCitBbGwgT1VUSEFORExFIGhhcyB0byBiZSBpcyBhIGZpbGVoYW5kbGUgKHBvc3NpYmx5IGEgZ2xvYiByZWYpLCBvcg0KK2FueSBvYmplY3QgdGhhdCByZXNwb25kcyB0byBhIHByaW50KCkgbWVzc2FnZS4NCisNCis9Y3V0DQorDQorc3ViIHByaW50IHsNCisgICAgbXkgKCRzZWxmLCAkb3V0KSA9IEBfOw0KKw0KKyAgICAjIyMgQ29lcmNlIGludG8gYSBwcmludGFibGUgb3V0cHV0IGhhbmRsZToNCisgICAgJG91dCA9IHdyYXAgTUlNRTo6TGl0ZTo6SU9fSGFuZGxlICRvdXQ7DQorDQorICAgICMjIyBPdXRwdXQgaGVhZCwgc2VwYXJhdG9yLCBhbmQgYm9keToNCisgICAgJHNlbGYtPnZlcmlmeV9kYXRhIGlmICRBVVRPX1ZFUklGWTsgICAgICAgIyMjIHByZXZlbnRzIG1pc3NpbmcgcGFydHMhDQorICAgICRvdXQtPnByaW50KCRzZWxmLT5oZWFkZXJfYXNfc3RyaW5nLCAiXG4iKTsNCisgICAgJHNlbGYtPnByaW50X2JvZHkoJG91dCk7DQorfQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjDQorIyBwcmludF9mb3Jfc210cA0KKyMNCisjIEluc3RhbmNlIG1ldGhvZCwgcHJpdmF0ZS4NCisjIFByaW50LCBidXQgZmlsdGVyIG91dCB0aGUgdG9wbW9zdCAiQmNjIiBmaWVsZC4NCisjIFRoaXMgaXMgYmVjYXVzZSBxbWFpbCBhcHBhcmVudGx5IGRvZXNuJ3QgZG8gdGhpcyBmb3IgdXMhDQorIw0KK3N1YiBwcmludF9mb3Jfc210cCB7DQorICAgIG15ICgkc2VsZiwgJG91dCkgPSBAXzsNCisNCisgICAgIyMjIENvZXJjZSBpbnRvIGEgcHJpbnRhYmxlIG91dHB1dCBoYW5kbGU6DQorICAgICRvdXQgPSB3cmFwIE1JTUU6OkxpdGU6OklPX0hhbmRsZSAkb3V0Ow0KKw0KKyAgICAjIyMgQ3JlYXRlIGEgc2FmZSBoZWFkOg0KKyAgICBteSBAZmllbGRzID0gZ3JlcCB7ICRfLT5bMF0gbmUgJ2JjYycgfSBAeyRzZWxmLT5maWVsZHN9Ow0KKyAgICBteSAkaGVhZGVyID0gJHNlbGYtPmZpZWxkc19hc19zdHJpbmcoXEBmaWVsZHMpOw0KKw0KKyAgICAjIyMgT3V0cHV0IGhlYWQsIHNlcGFyYXRvciwgYW5kIGJvZHk6DQorICAgICRvdXQtPnByaW50KCRoZWFkZXIsICJcbiIpOw0KKyAgICAkc2VsZi0+cHJpbnRfYm9keSgkb3V0KTsNCit9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIHByaW50X2JvZHkgW09VVEhBTkRMRV0NCisNCitJPEluc3RhbmNlIG1ldGhvZC4+DQorUHJpbnQgdGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIHRoZSBnaXZlbiBvdXRwdXQgaGFuZGxlLCBvciB0bw0KK3RoZSBjdXJyZW50bHktc2VsZWN0ZWQgZmlsZWhhbmRsZSBpZiBub25lIHdhcyBnaXZlbi4NCisNCitBbGwgT1VUSEFORExFIGhhcyB0byBiZSBpcyBhIGZpbGVoYW5kbGUgKHBvc3NpYmx5IGEgZ2xvYiByZWYpLCBvcg0KK2FueSBvYmplY3QgdGhhdCByZXNwb25kcyB0byBhIHByaW50KCkgbWVzc2FnZS4NCisNCitCPEZhdGFsIGV4Y2VwdGlvbj4gcmFpc2VkIGlmIHVuYWJsZSB0byBvcGVuIGFueSBvZiB0aGUgaW5wdXQgZmlsZXMsDQorb3IgaWYgYSBwYXJ0IGNvbnRhaW5zIG5vIGRhdGEsIG9yIGlmIGFuIHVuc3VwcG9ydGVkIGVuY29kaW5nIGlzDQorZW5jb3VudGVyZWQuDQorDQorPWN1dA0KKw0KK3N1YiBwcmludF9ib2R5IHsNCisgICAgbXkgKCRzZWxmLCAkb3V0KSA9IEBfOw0KKw0KKyAgICAjIyMgQ29lcmNlIGludG8gYSBwcmludGFibGUgb3V0cHV0IGhhbmRsZToNCisgICAgJG91dCA9IHdyYXAgTUlNRTo6TGl0ZTo6SU9fSGFuZGxlICRvdXQ7DQorDQorICAgICMjIyBPdXRwdXQgZWl0aGVyIHRoZSBib2R5IG9yIHRoZSBwYXJ0cy4NCisgICAgIyMjICAgTm90aWNlIHRoYXQgd2Uga2V5IG9mZiBvZiB0aGUgY29udGVudC10eXBlISAgV2UgZXhwZWN0IGZld2VyDQorICAgICMjIyAgIGFjY2lkZW50cyB0aGF0IHdheSwgc2luY2UgdGhlIHN5bnRheCB3aWxsIGFsd2F5cyBtYXRjaCB0aGUgTUlNRSB0eXBlLg0KKyAgICBteSAkdHlwZSA9ICRzZWxmLT5hdHRyKCdjb250ZW50LXR5cGUnKTsNCisgICAgaWYgKCR0eXBlID1+IG17Xm11bHRpcGFydC99aSkgew0KKwlteSAkYm91bmRhcnkgPSAkc2VsZi0+YXR0cignY29udGVudC10eXBlLmJvdW5kYXJ5Jyk7DQorDQorCSMjIyBQcmVhbWJsZToNCisJJG91dC0+cHJpbnQoZGVmaW5lZCgkc2VsZi0+e1ByZWFtYmxlfSkNCisJCSAgICA/ICRzZWxmLT57UHJlYW1ibGV9DQorCQkgICAgOiAiVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC5cbiIpOw0KKw0KKwkjIyMgUGFydHM6DQorCW15ICRwYXJ0Ow0KKwlmb3JlYWNoICRwYXJ0IChAeyRzZWxmLT57UGFydHN9fSkgew0KKwkgICAgJG91dC0+cHJpbnQoIlxuLS0kYm91bmRhcnlcbiIpOw0KKwkgICAgJHBhcnQtPnByaW50KCRvdXQpOw0KKwl9DQorDQorCSMjIyBFcGlsb2d1ZToNCisJJG91dC0+cHJpbnQoIlxuLS0kYm91bmRhcnktLVxuXG4iKTsNCisgICAgfQ0KKyAgICBlbHNpZiAoJHR5cGUgPX4gbXtebWVzc2FnZS99KSB7DQorCW15IEBwYXJ0cyA9IEB7JHNlbGYtPntQYXJ0c319Ow0KKw0KKwkjIyMgSXQncyBhIHRvc3MtdXA7IHRyeSBib3RoIGRhdGEgYW5kIHBhcnRzOg0KKwlpZiAgICAoQHBhcnRzID09IDApIHsgJHNlbGYtPnByaW50X3NpbXBsZV9ib2R5KCRvdXQpIH0NCisJZWxzaWYgKEBwYXJ0cyA9PSAxKSB7ICRwYXJ0c1swXS0+cHJpbnQoJG91dCkgfQ0KKwllbHNlICAgICAgICAgICAgICAgIHsgQ2FycDo6Y3JvYWsgImNhbid0IGhhbmRsZSBtZXNzYWdlIHdpdGggPjEgcGFydFxuIjsgfQ0KKyAgICB9DQorICAgIGVsc2Ugew0KKwkkc2VsZi0+cHJpbnRfc2ltcGxlX2JvZHkoJG91dCk7DQorICAgIH0NCisgICAgMTsNCit9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMNCisjIHByaW50X3NpbXBsZV9ib2R5IFtPVVRIQU5ETEVdDQorIw0KKyMgSTxJbnN0YW5jZSBtZXRob2QsIHByaXZhdGUuPg0KKyMgUHJpbnQgdGhlIGJvZHkgb2YgYSBzaW1wbGUgc2luZ2xlcGFydCBtZXNzYWdlIHRvIHRoZSBnaXZlbg0KKyMgb3V0cHV0IGhhbmRsZSwgb3IgdG8gdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmaWxlaGFuZGxlIGlmIG5vbmUNCisjIHdhcyBnaXZlbi4NCisjDQorIyBOb3RlIHRoYXQgaWYgeW91IHdhbnQgdG8gcHJpbnQgInRoZSBwb3J0aW9uIGFmdGVyDQorIyB0aGUgaGVhZGVyIiwgeW91IGRvbid0IHdhbnQgdGhpcyBtZXRob2Q6IHlvdSB3YW50DQorIyBMPHByaW50X2JvZHkoKXwvcHJpbnRfYm9keT4uDQorIw0KKyMgQWxsIE9VVEhBTkRMRSBoYXMgdG8gYmUgaXMgYSBmaWxlaGFuZGxlIChwb3NzaWJseSBhIGdsb2IgcmVmKSwgb3INCisjIGFueSBvYmplY3QgdGhhdCByZXNwb25kcyB0byBhIHByaW50KCkgbWVzc2FnZS4NCisjDQorIyBCPEZhdGFsIGV4Y2VwdGlvbj4gcmFpc2VkIGlmIHVuYWJsZSB0byBvcGVuIGFueSBvZiB0aGUgaW5wdXQgZmlsZXMsDQorIyBvciBpZiBhIHBhcnQgY29udGFpbnMgbm8gZGF0YSwgb3IgaWYgYW4gdW5zdXBwb3J0ZWQgZW5jb2RpbmcgaXMNCisjIGVuY291bnRlcmVkLg0KKyMNCitzdWIgcHJpbnRfc2ltcGxlX2JvZHkgew0KKyAgICBteSAoJHNlbGYsICRvdXQpID0gQF87DQorDQorICAgICMjIyBDb2VyY2UgaW50byBhIHByaW50YWJsZSBvdXRwdXQgaGFuZGxlOg0KKyAgICAkb3V0ID0gd3JhcCBNSU1FOjpMaXRlOjpJT19IYW5kbGUgJG91dDsNCisNCisgICAgIyMjIEdldCBjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOg0KKyAgICBteSAkZW5jb2RpbmcgPSB1Yygkc2VsZi0+YXR0cignY29udGVudC10cmFuc2Zlci1lbmNvZGluZycpKTsNCisNCisgICAgIyMjIE5vdGljZSB0aGF0IHdlIGRvbid0IGp1c3QgYXR0ZW1wdCB0byBzbHVycCB0aGUgZGF0YSBpbiBmcm9tIGEgZmlsZToNCisgICAgIyMjIGJ5IHByb2Nlc3NpbmcgZmlsZXMgcGllY2VtZWFsLCB3ZSBzdGlsbCBlbmFibGUgb3Vyc2VsdmVzIHRvIHByZXBhcmUNCisgICAgIyMjIHZlcnkgbGFyZ2UgTUlNRSBtZXNzYWdlcy4uLg0KKw0KKyAgICAjIyMgSXMgdGhlIGRhdGEgaW4tY29yZT8gIElmIHNvLCBibGl0IGl0IG91dC4uLg0KKyAgICBpZiAoZGVmaW5lZCgkc2VsZi0+e0RhdGF9KSkgew0KKyAgICAgIERBVEE6DQorCXsgbG9jYWwgJF8gPSAkZW5jb2Rpbmc7DQorDQorCSAgL15CSU5BUlkkLyBhbmQgZG8gew0KKwkgICAgICAkb3V0LT5wcmludCgkc2VsZi0+e0RhdGF9KTsNCisJICAgICAgbGFzdCBEQVRBOw0KKwkgIH07DQorCSAgL144QklUJC8gYW5kIGRvIHsNCisJICAgICAgJG91dC0+cHJpbnQoZW5jb2RlXzhiaXQoJHNlbGYtPntEYXRhfSkpOw0KKwkgICAgICBsYXN0IERBVEE7DQorCSAgfTsNCisJICAvXjdCSVQkLyBhbmQgZG8gew0KKwkgICAgICAkb3V0LT5wcmludChlbmNvZGVfN2JpdCgkc2VsZi0+e0RhdGF9KSk7DQorCSAgICAgIGxhc3QgREFUQTsNCisJICB9Ow0KKwkgIC9eUVVPVEVELVBSSU5UQUJMRSQvIGFuZCBkbyB7DQorCSAgICAgICMjIyBVTlRBSU5UIHNpbmNlIG0vL21nIG9uIHRhaW50ZWQgZGF0YSBsb29wcyBmb3JldmVyOg0KKwkgICAgICBteSAoJHVudGFpbnRlZCkgPSAoJHNlbGYtPntEYXRhfSA9fiBtL1xBKC4qKVxaL3MpOw0KKw0KKwkgICAgICAjIyMgRW5jb2RlIGl0IGxpbmUgYnkgbGluZToNCisJICAgICAgd2hpbGUgKCR1bnRhaW50ZWQgPX4gbXteKC4qW1xyXG5dKil9bWcpIHsNCisJCSAgJG91dC0+cHJpbnQoZW5jb2RlX3FwKCQxKSk7ICMjIyBoYXZlIHRvIGRvIGl0IGxpbmUgYnkgbGluZS4uLg0KKwkgICAgICB9DQorCSAgICAgIGxhc3QgREFUQTsNCisJICB9Ow0KKwkgIC9eQkFTRTY0LyBhbmQgZG8gew0KKwkgICAgICAkb3V0LT5wcmludChlbmNvZGVfYmFzZTY0KCRzZWxmLT57RGF0YX0pKTsNCisJICAgICAgbGFzdCBEQVRBOw0KKwkgIH07DQorCSAgQ2FycDo6Y3JvYWsgInVuc3VwcG9ydGVkIGVuY29kaW5nOiBgJF8nXG4iOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgICMjIyBFbHNlLCBpcyB0aGUgZGF0YSBpbiBhIGZpbGU/ICBJZiBzbywgb3V0cHV0IHBpZWNlbWVhbC4uLg0KKyAgICAjIyMgICAgTWlrbydzIG5vdGU6IHRoaXMgcm91dGluZSBwcmV0dHkgbXVjaCB3b3JrcyB0aGUgc2FtZSB3aXRoIGEgcGF0aA0KKyAgICAjIyMgICAgb3IgYSBmaWxlaGFuZGxlLiB0aGUgb25seSBkaWZmZXJlbmNlIGluIGJlaGF2aW91ciBpcyB0aGF0IGl0IGRvZXMNCisgICAgIyMjICAgIG5vdCBhdHRlbXB0IHRvIG9wZW4gYW55dGhpbmcgaWYgaXQgYWxyZWFkeSBoYXMgYSBmaWxlaGFuZGxlDQorICAgIGVsc2lmIChkZWZpbmVkKCRzZWxmLT57UGF0aH0pIHx8IGRlZmluZWQoJHNlbGYtPntGSH0pKSB7DQorCW5vIHN0cmljdCAncmVmcyc7ICAgICAgICAgICMjIyBpbiBjYXNlIEZIIGlzIG5vdCBhbiBvYmplY3QNCisJbXkgJERBVEE7DQorDQorCSMjIyBPcGVuIGZpbGUgaWYgbmVjZXNzYXJ5Og0KKwlpZiAoZGVmaW5lZCgkc2VsZi0+e1BhdGh9KSkgew0KKwkgICAgJERBVEEgPSBuZXcgRmlsZUhhbmRsZSB8fCBDYXJwOjpjcm9hayAiY2FuJ3QgZ2V0IG5ldyBmaWxlaGFuZGxlXG4iOw0KKwkgICAgJERBVEEtPm9wZW4oIiRzZWxmLT57UGF0aH0iKSBvcg0KKwkgICAgICBDYXJwOjpjcm9hayAib3BlbiAkc2VsZi0+e1BhdGh9OiAkIVxuIjsNCisJfQ0KKwllbHNlIHsNCisJICAgICREQVRBPSRzZWxmLT57Rkh9Ow0KKwl9DQorCUNPUkU6OmJpbm1vZGUoJERBVEEpIGlmICRzZWxmLT5iaW5tb2RlOw0KKw0KKwkjIyMgRW5jb2RlIHBpZWNlIGJ5IHBpZWNlOg0KKyAgICAgIFBBVEg6DQorCXsgICBsb2NhbCAkXyA9ICRlbmNvZGluZzsNCisNCisJICAgIC9eQklOQVJZJC8gYW5kIGRvIHsNCisJCSRvdXQtPnByaW50KCRfKSAgICAgICAgICAgICAgICB3aGlsZSByZWFkKCREQVRBLCAkXywgMjA0OCk7DQorCQlsYXN0IFBBVEg7DQorCSAgICB9Ow0KKwkgICAgL144QklUJC8gYW5kIGRvIHsNCisJCSRvdXQtPnByaW50KGVuY29kZV84Yml0KCRfKSkgICB3aGlsZSAoPCREQVRBPik7DQorCQlsYXN0IFBBVEg7DQorCSAgICB9Ow0KKwkgICAgL143QklUJC8gYW5kIGRvIHsNCisJCSRvdXQtPnByaW50KGVuY29kZV83Yml0KCRfKSkgICB3aGlsZSAoPCREQVRBPik7DQorCQlsYXN0IFBBVEg7DQorCSAgICB9Ow0KKwkgICAgL15RVU9URUQtUFJJTlRBQkxFJC8gYW5kIGRvIHsNCisJCSRvdXQtPnByaW50KGVuY29kZV9xcCgkXykpICAgICB3aGlsZSAoPCREQVRBPik7DQorCQlsYXN0IFBBVEg7DQorCSAgICB9Ow0KKwkgICAgL15CQVNFNjQkLyBhbmQgZG8gew0KKwkJJG91dC0+cHJpbnQoZW5jb2RlX2Jhc2U2NCgkXykpIHdoaWxlIChyZWFkKCREQVRBLCAkXywgNDUpKTsNCisJCWxhc3QgUEFUSDsNCisJICAgIH07DQorCSAgICBDYXJwOjpjcm9hayAidW5zdXBwb3J0ZWQgZW5jb2Rpbmc6IGAkXydcbiI7DQorCX0NCisNCisJIyMjIENsb3NlIGZpbGU6DQorCWNsb3NlICREQVRBIGlmIGRlZmluZWQoJHNlbGYtPntQYXRofSk7DQorICAgIH0NCisNCisgICAgZWxzZSB7DQorCUNhcnA6OmNyb2FrICJubyBkYXRhIGluIHRoaXMgcGFydFxuIjsNCisgICAgfQ0KKyAgICAxOw0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gcHJpbnRfaGVhZGVyIFtPVVRIQU5ETEVdDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK1ByaW50IHRoZSBoZWFkZXIgb2YgdGhlIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIG91dHB1dCBoYW5kbGUsDQorb3IgdG8gdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmaWxlaGFuZGxlIGlmIG5vbmUgd2FzIGdpdmVuLg0KKw0KK0FsbCBPVVRIQU5ETEUgaGFzIHRvIGJlIGlzIGEgZmlsZWhhbmRsZSAocG9zc2libHkgYSBnbG9iIHJlZiksIG9yDQorYW55IG9iamVjdCB0aGF0IHJlc3BvbmRzIHRvIGEgcHJpbnQoKSBtZXNzYWdlLg0KKw0KKz1jdXQNCisNCitzdWIgcHJpbnRfaGVhZGVyIHsNCisgICAgbXkgKCRzZWxmLCAkb3V0KSA9IEBfOw0KKw0KKyAgICAjIyMgQ29lcmNlIGludG8gYSBwcmludGFibGUgb3V0cHV0IGhhbmRsZToNCisgICAgJG91dCA9IHdyYXAgTUlNRTo6TGl0ZTo6SU9fSGFuZGxlICRvdXQ7DQorDQorICAgICMjIyBPdXRwdXQgdGhlIGhlYWRlcjoNCisgICAgJG91dC0+cHJpbnQoJHNlbGYtPmhlYWRlcl9hc19zdHJpbmcpOw0KKyAgICAxOw0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gYXNfc3RyaW5nDQorDQorSTxJbnN0YW5jZSBtZXRob2QuPg0KK1JldHVybiB0aGUgZW50aXJlIG1lc3NhZ2UgYXMgYSBzdHJpbmcsIHdpdGggYSBoZWFkZXIgYW5kIGFuIGVuY29kZWQgYm9keS4NCisNCis9Y3V0DQorDQorc3ViIGFzX3N0cmluZyB7DQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgIG15ICRidWYgPSBbXTsNCisgICAgbXkgJGlvID0gKHdyYXAgTUlNRTo6TGl0ZTo6SU9fU2NhbGFyQXJyYXkgJGJ1Zik7DQorICAgICRzZWxmLT5wcmludCgkaW8pOw0KKyAgICBqb2luICcnLCBAJGJ1ZjsNCit9DQorKnN0cmluZ2lmeSA9IFwmYXNfc3RyaW5nOyAgICAjIyMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkNCisqc3RyaW5naWZ5ID0gXCZhc19zdHJpbmc7ICAgICMjIyAuLi50d2ljZSB0byBhdm9pZCB3YXJuaW5ncyA6KQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCis9aXRlbSBib2R5X2FzX3N0cmluZw0KKw0KK0k8SW5zdGFuY2UgbWV0aG9kLj4NCitSZXR1cm4gdGhlIGVuY29kZWQgYm9keSBhcyBhIHN0cmluZy4NCitUaGlzIGlzIHRoZSBwb3J0aW9uIGFmdGVyIHRoZSBoZWFkZXIgYW5kIHRoZSBibGFuayBsaW5lLg0KKw0KK0k8Tm90ZTo+IGFjdHVhbGx5IHByZXBhcmVzIHRoZSBib2R5IGJ5ICJwcmludGluZyIgdG8gYSBzY2FsYXIuDQorUHJvb2YgdGhhdCB5b3UgY2FuIGhhbmQgdGhlIEM8cHJpbnQqKCk+IG1ldGhvZHMgYW55IGJsZXNzZWQgb2JqZWN0DQordGhhdCByZXNwb25kcyB0byBhIEM8cHJpbnQoKT4gbWVzc2FnZS4NCisNCis9Y3V0DQorDQorc3ViIGJvZHlfYXNfc3RyaW5nIHsNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisgICAgbXkgJGJ1ZiA9IFtdOw0KKyAgICBteSAkaW8gPSAod3JhcCBNSU1FOjpMaXRlOjpJT19TY2FsYXJBcnJheSAkYnVmKTsNCisgICAgJHNlbGYtPnByaW50X2JvZHkoJGlvKTsNCisgICAgam9pbiAnJywgQCRidWY7DQorfQ0KKypzdHJpbmdpZnlfYm9keSA9IFwmYm9keV9hc19zdHJpbmc7ICAgICMjIyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQ0KKypzdHJpbmdpZnlfYm9keSA9IFwmYm9keV9hc19zdHJpbmc7ICAgICMjIyAuLi50d2ljZSB0byBhdm9pZCB3YXJuaW5ncyA6KQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjDQorIyBmaWVsZHNfYXNfc3RyaW5nIEZJRUxEUw0KKyMNCisjIFBSSVZBVEUhICBSZXR1cm4gYSBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBoZWFkZXINCisjIGZpZWxkcywgd2hlcmUgRklFTERTIGlzIGFuIGFycmF5cmVmIGxpa2UgdGhhdCByZXR1cm5lZCBieSBmaWVsZHMoKS4NCisjDQorc3ViIGZpZWxkc19hc19zdHJpbmcgew0KKyAgICBteSAoJHNlbGYsICRmaWVsZHMpID0gQF87DQorICAgIG15IEBsaW5lczsNCisgICAgZm9yZWFjaCAoQCRmaWVsZHMpIHsNCisJbXkgKCR0YWcsICR2YWx1ZSkgPSBAJF87DQorCW5leHQgaWYgKCR2YWx1ZSBlcSAnJyk7ICAgICAgICAgICMjIyBza2lwIGVtcHRpZXMNCisJJHRhZyA9fiBzL1xiKFthLXpdKS91YygkMSkvZ2U7ICAgIyMjIG1ha2UgcHJldHR5DQorCSR0YWcgPX4gcy9ebWltZS0vTUlNRS0vaWc7ICAgICAgICMjIyBldmVuIHByZXR0aWVyDQorCXB1c2ggQGxpbmVzLCAiJHRhZzogJHZhbHVlXG4iOw0KKyAgICB9DQorICAgIGpvaW4gJycsIEBsaW5lczsNCit9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIGhlYWRlcl9hc19zdHJpbmcNCisNCitJPEluc3RhbmNlIG1ldGhvZC4+DQorUmV0dXJuIHRoZSBoZWFkZXIgYXMgYSBzdHJpbmcuDQorDQorPWN1dA0KKw0KK3N1YiBoZWFkZXJfYXNfc3RyaW5nIHsNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisgICAgJHNlbGYtPmZpZWxkc19hc19zdHJpbmcoJHNlbGYtPmZpZWxkcyk7DQorfQ0KKypzdHJpbmdpZnlfaGVhZGVyID0gXCZoZWFkZXJfYXNfc3RyaW5nOyAgICAjIyMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkNCisqc3RyaW5naWZ5X2hlYWRlciA9IFwmaGVhZGVyX2FzX3N0cmluZzsgICAgIyMjIC4uLnR3aWNlIHRvIGF2b2lkIHdhcm5pbmdzIDopDQorDQorPWJhY2sNCisNCis9Y3V0DQorDQorDQorDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCis9aGVhZDIgU2VuZGluZw0KKw0KKz1vdmVyIDQNCisNCis9Y3V0DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKz1pdGVtIHNlbmQNCisNCis9aXRlbSBzZW5kIEhPVywgSE9XQVJHUy4uLg0KKw0KK0k8Q2xhc3MvaW5zdGFuY2UgbWV0aG9kLj4NCitUaGlzIGlzIHRoZSBwcmluY2lwYWwgbWV0aG9kIGZvciBzZW5kaW5nIG1haWwsIGFuZCBmb3IgY29uZmlndXJpbmcNCitob3cgbWFpbCB3aWxsIGJlIHNlbnQuDQorDQorSTxBcyBhIGNsYXNzIG1ldGhvZD4gd2l0aCBhIEhPVyBhcmd1bWVudCBhbmQgb3B0aW9uYWwgSE9XQVJHUywgaXQgc2V0cw0KK3RoZSBkZWZhdWx0IHNlbmRpbmcgbWVjaGFuaXNtIHRoYXQgdGhlIG5vLWFyZ3VtZW50IGluc3RhbmNlIG1ldGhvZA0KK3dpbGwgdXNlLiAgVGhlIEhPVyBpcyBhIGZhY2lsaXR5IG5hbWUgKEI8c2VlIGJlbG93PiksDQorYW5kIHRoZSBIT1dBUkdTIGlzIGludGVycHJldGVkIGJ5IHRoZSBmYWNpbHR5Lg0KK1RoZSBjbGFzcyBtZXRob2QgcmV0dXJucyB0aGUgcHJldmlvdXMgSE9XIGFuZCBIT1dBUkdTIGFzIGFuIGFycmF5Lg0KKw0KKyAgICBNSU1FOjpMaXRlLT5zZW5kKCdzZW5kbWFpbCcsICJkOlxccHJvZ3JhbXNcXHNlbmRtYWlsLmV4ZSIpOw0KKyAgICAuLi4NCisgICAgJG1zZyA9IE1JTUU6OkxpdGUtPm5ldyguLi4pOw0KKyAgICAkbXNnLT5zZW5kOw0KKw0KK0k8QXMgYW4gaW5zdGFuY2UgbWV0aG9kIHdpdGggYXJndW1lbnRzPg0KKyhhIEhPVyBhcmd1bWVudCBhbmQgb3B0aW9uYWwgSE9XQVJHUyksIHNlbmRzIHRoZSBtZXNzYWdlIGluIHRoZQ0KK3JlcXVlc3RlZCBtYW5uZXI7IGUuZy46DQorDQorICAgICRtc2ctPnNlbmQoJ3NlbmRtYWlsJywgImQ6XFxwcm9ncmFtc1xcc2VuZG1haWwuZXhlIik7DQorDQorSTxBcyBhbiBpbnN0YW5jZSBtZXRob2Qgd2l0aCBubyBhcmd1bWVudHMsPiBzZW5kcyB0aGUgbWVzc2FnZSBieQ0KK3RoZSBkZWZhdWx0IG1lY2hhbmlzbSBzZXQgdXAgYnkgdGhlIGNsYXNzIG1ldGhvZC4NCitSZXR1cm5zIHdoYXRldmVyIHRoZSBtYWlsLWhhbmRsaW5nIHJvdXRpbmUgcmV0dXJuczogdGhpcyBzaG91bGQgYmUgdHJ1ZQ0KK29uIHN1Y2Nlc3MsIGZhbHNlL2V4Y2VwdGlvbiBvbiBlcnJvcjoNCisNCisgICAgJG1zZyA9IE1JTUU6OkxpdGUtPm5ldyhGcm9tPT4uLi4pOw0KKyAgICAkbXNnLT5zZW5kIHx8IGRpZSAieW91IERPTidUIGhhdmUgbWFpbCEiOw0KKw0KK09uIFVuaXggc3lzdGVtcyAoYXQgbGVhc3QpLCB0aGUgZGVmYXVsdCBzZXR0aW5nIGlzIGVxdWl2YWxlbnQgdG86DQorDQorICAgIE1JTUU6OkxpdGUtPnNlbmQoInNlbmRtYWlsIiwgIi91c3IvbGliL3NlbmRtYWlsIC10IC1vaSAtb2VtIik7DQorDQorVGhlcmUgYXJlIHRocmVlIGZhY2lsaXRpZXM6DQorDQorPW92ZXIgNA0KKw0KKz1pdGVtICJzZW5kbWFpbCIsIEFSR1MuLi4NCisNCitTZW5kIGEgbWVzc2FnZSBieSBwaXBpbmcgaXQgaW50byB0aGUgInNlbmRtYWlsIiBjb21tYW5kLg0KK1VzZXMgdGhlIEw8c2VuZF9ieV9zZW5kbWFpbCgpfC9zZW5kX2J5X3NlbmRtYWlsPiBtZXRob2QsIGdpdmluZyBpdCB0aGUgQVJHUy4NCitUaGlzIHVzYWdlIGltcGxlbWVudHMgKGFuZCBkZXByZWNhdGVzKSB0aGUgQzxzZW5kbWFpbCgpPiBtZXRob2QuDQorDQorPWl0ZW0gInNtdHAiLCBbSE9TVE5BTUVdDQorDQorU2VuZCBhIG1lc3NhZ2UgYnkgU01UUCwgdXNpbmcgb3B0aW9uYWwgSE9TVE5BTUUgYXMgU01UUC1zZW5kaW5nIGhvc3QuDQorVXNlcyB0aGUgTDxzZW5kX2J5X3NtdHAoKXwvc2VuZF9ieV9zbXRwPiBtZXRob2QuDQorDQorPWl0ZW0gInN1YiIsIFwmU1VCUkVGLCBBUkdTLi4uDQorDQorU2VuZHMgYSBtZXNzYWdlIE1TRyBieSBpbnZva2luZyB0aGUgc3Vicm91dGluZSBTVUJSRUYgb2YgeW91ciBjaG9vc2luZywNCit3aXRoIE1TRyBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIGFuZCBBUkdTIGZvbGxvd2luZy4NCisNCis9YmFjaw0KKw0KK0k8Rm9yIGV4YW1wbGU6PiBsZXQncyBzYXkgeW91J3JlIG9uIGFuIE9TIHdoaWNoIGxhY2tzIHRoZSB1c3VhbCBVbml4DQorInNlbmRtYWlsIiBmYWNpbGl0eSwgYnV0IHlvdSd2ZSBpbnN0YWxsZWQgc29tZXRoaW5nIGEgbG90IGxpa2UgaXQsIGFuZA0KK3lvdSBuZWVkIHRvIGNvbmZpZ3VyZSB5b3VyIFBlcmwgc2NyaXB0IHRvIHVzZSB0aGlzICJzZW5kbWFpbC5leGUiIHByb2dyYW0uDQorRG8gdGhpcyBmb2xsb3dpbmcgaW4geW91ciBzY3JpcHQncyBzZXR1cDoNCisNCisgICAgTUlNRTo6TGl0ZS0+c2VuZCgnc2VuZG1haWwnLCAiZDpcXHByb2dyYW1zXFxzZW5kbWFpbC5leGUiKTsNCisNCitUaGVuLCB3aGVuZXZlciB5b3UgbmVlZCB0byBzZW5kIGEgbWVzc2FnZSAkbXNnLCBqdXN0IHNheToNCisNCisgICAgJG1zZy0+c2VuZDsNCisNCitUaGF0J3MgaXQuICBOb3csIGlmIHlvdSBldmVyIG1vdmUgeW91ciBzY3JpcHQgdG8gYSBVbml4IGJveCwgYWxsIHlvdQ0KK25lZWQgdG8gZG8gaXMgY2hhbmdlIHRoYXQgbGluZSBpbiB0aGUgc2V0dXAgYW5kIHlvdSdyZSBkb25lLg0KK0FsbCBvZiB5b3VyICRtc2ctRTxndD5zZW5kIGludm9jYXRpb25zIHdpbGwgd29yayBhcyBleHBlY3RlZC4NCisNCis9Y3V0DQorDQorc3ViIHNlbmQgew0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKw0KKyAgICBpZiAocmVmKCRzZWxmKSkgeyAgICAgICAgICAgICAgIyMjIGluc3RhbmNlIG1ldGhvZDoNCisJbXkgKCRtZXRob2QsIEBhcmdzKTsNCisJaWYgKEBfKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBhcmdzOyB1c2UgdGhlbSBqdXN0IHRoaXMgb25jZQ0KKwkgICAgJG1ldGhvZCA9ICdzZW5kX2J5XycgLiBzaGlmdDsNCisJICAgIEBhcmdzICAgPSBAXzsNCisJfQ0KKwllbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIG5vIGFyZ3M7IHVzZSBkZWZhdWx0cw0KKwkgICAgJG1ldGhvZCA9ICJzZW5kX2J5XyRTZW5kZXIiOw0KKwkgICAgQGFyZ3MgICA9IEB7JFNlbmRlckFyZ3N7JFNlbmRlcn0gfHwgW119Ow0KKwl9DQorCSRzZWxmLT52ZXJpZnlfZGF0YSBpZiAkQVVUT19WRVJJRlk7ICAjIyMgcHJldmVudHMgbWlzc2luZyBwYXJ0cyENCisJcmV0dXJuICRzZWxmLT4kbWV0aG9kKEBhcmdzKTsNCisgICAgfQ0KKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIGNsYXNzIG1ldGhvZDoNCisJaWYgKEBfKSB7DQorCSAgICBteSBAb2xkID0gKCRTZW5kZXIsIEB7JFNlbmRlckFyZ3N7JFNlbmRlcn19KTsNCisJICAgICRTZW5kZXIgPSBzaGlmdDsNCisJICAgICRTZW5kZXJBcmdzeyRTZW5kZXJ9ID0gW0BfXTsgICAgIyMjIHJlbWFpbmluZyBhcmdzDQorCSAgICByZXR1cm4gQG9sZDsNCisJfQ0KKwllbHNlIHsNCisJICBDYXJwOjpjcm9hayAiY2xhc3MgbWV0aG9kIHNlbmQgbXVzdCBoYXZlIEhPVy4uLiBhcmd1bWVudHNcbiI7DQorCX0NCisgICAgfQ0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gc2VuZF9ieV9zZW5kbWFpbCBTRU5ETUFJTENNRA0KKw0KKz1pdGVtIHNlbmRfYnlfc2VuZG1haWwgUEFSQU09PlZBTFVFLCAuLi4NCisNCitJPEluc3RhbmNlIG1ldGhvZC4+DQorU2VuZCBtZXNzYWdlIHZpYSBhbiBleHRlcm5hbCAic2VuZG1haWwiIHByb2dyYW0NCisodGhpcyB3aWxsIHByb2JhYmx5IG9ubHkgd29yayBvdXQtb2YtdGhlLWJveCBvbiBVbml4IHN5c3RlbXMpLg0KKw0KK1JldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvciBleGNlcHRpb24gb24gZXJyb3IuDQorDQorWW91IGNhbiBzcGVjaWZ5IHRoZSBwcm9ncmFtIGFuZCBhbGwgaXRzIGFyZ3VtZW50cyBieSBnaXZpbmcgYSBzaW5nbGUNCitzdHJpbmcsIFNFTkRNQUlMQ01ELiAgTm90aGluZyBmYW5jeSBpcyBkb25lOyB0aGUgbWVzc2FnZSBpcyBzaW1wbHkNCitwaXBlZCBpbi4NCisNCitIb3dldmVyLCBpZiB5b3VyIG5lZWRzIGFyZSBhIGxpdHRsZSBtb3JlIGFkdmFuY2VkLCB5b3UgY2FuIHNwZWNpZnkNCit6ZXJvIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBQQVJBTS9WQUxVRSBwYWlyczsgYSBVbml4LXN0eWxlLA0KK3RhaW50LXNhZmUgInNlbmRtYWlsIiBjb21tYW5kIHdpbGwgYmUgY29uc3RydWN0ZWQgZm9yIHlvdToNCisNCis9b3ZlciA0DQorDQorPWl0ZW0gU2VuZG1haWwNCisNCitGdWxsIHBhdGggdG8gdGhlIHByb2dyYW0gdG8gdXNlLg0KK0RlZmF1bHQgaXMgIi91c3IvbGliL3NlbmRtYWlsIi4NCisNCis9aXRlbSBCYXNlQXJncw0KKw0KK1JlZiB0byB0aGUgYmFzaWMgYXJyYXkgb2YgYXJndW1lbnRzIHdlIHN0YXJ0IHdpdGguDQorRGVmYXVsdCBpcyBDPFsiLXQiLCAiLW9pIiwgIi1vZW0iXT4uDQorDQorPWl0ZW0gU2V0U2VuZGVyDQorDQorVW5sZXNzIHRoaXMgaXMgSTxleHBsaWNpdGx5PiBnaXZlbiBhcyBmYWxzZSwgd2UgYXR0ZW1wdCB0byBhdXRvbWF0aWNhbGx5DQorc2V0IHRoZSBDPC1mPiBhcmd1bWVudCB0byB0aGUgZmlyc3QgYWRkcmVzcyB0aGF0IGNhbiBiZSBleHRyYWN0ZWQgZnJvbQ0KK3RoZSAiRnJvbToiIGZpZWxkIG9mIHRoZSBtZXNzYWdlIChpZiB0aGVyZSBpcyBvbmUpLg0KKw0KK0k8V2hhdCBpcyB0aGUgLWYsIGFuZCB3aHkgZG8gd2UgdXNlIGl0Pz4NCitTdXBwb3NlIHdlIGRpZCBJPG5vdD4gdXNlIEM8LWY+LCBhbmQgeW91IGdhdmUgYW4gZXhwbGljaXQgIkZyb206Ig0KK2ZpZWxkIGluIHlvdXIgbWVzc2FnZTogaW4gdGhpcyBjYXNlLCB0aGUgc2VuZG1haWwgImVudmVsb3BlIiB3b3VsZA0KK2luZGljYXRlIHRoZSBJPHJlYWw+IHVzZXIgeW91ciBwcm9jZXNzIHdhcyBydW5uaW5nIHVuZGVyLCBhcyBhIHdheQ0KK29mIHByZXZlbnRpbmcgbWFpbCBmb3JnZXJ5LiAgVXNpbmcgdGhlIEM8LWY+IHN3aXRjaCBjYXVzZXMgdGhlIHNlbmRlcg0KK3RvIGJlIHNldCBpbiB0aGUgZW52ZWxvcGUgYXMgd2VsbC4NCisNCitJPFNvIHdoZW4gd291bGQgSSBOT1Qgd2FudCB0byB1c2UgaXQ/Pg0KK0lmIHNlbmRtYWlsIGRvZXNuJ3QgcmVnYXJkIHlvdSBhcyBhICJ0cnVzdGVkIiB1c2VyLCBpdCB3aWxsIHBlcm1pdA0KK3RoZSBDPC1mPiBidXQgYWxzbyBhZGQgYW4gIlgtQXV0aGVudGljYXRpb24tV2FybmluZyIgaGVhZGVyIHRvIHRoZSBtZXNzYWdlDQordG8gaW5kaWNhdGUgYSBmb3JnZWQgZW52ZWxvcGUuICBUbyBhdm9pZCB0aGlzLCB5b3UgY2FuIGVpdGhlcg0KKygxKSBoYXZlIFNldFNlbmRlciBiZSBmYWxzZSwgb3INCisoMikgbWFrZSB5b3Vyc2VsZiBhIHRydXN0ZWQgdXNlciBieSBhZGRpbmcgYSBDPFQ+IGNvbmZpZ3VyYXRpb24NCisgICAgY29tbWFuZCB0byB5b3VyIEk8c2VuZG1haWwuY2Y+IGZpbGUNCisgICAgKGUuZy46IEM8VGVyeXE+IGlmIHRoZSBzY3JpcHQgaXMgcnVubmluZyBhcyB1c2VyICJlcnlxIikuDQorDQorPWl0ZW0gRnJvbVNlbmRlcg0KKw0KK0lmIGRlZmluZWQsIHRoaXMgaXMgaWRlbnRpY2FsIHRvIHNldHRpbmcgU2V0U2VuZGVyIHRvIHRydWUsDQorZXhjZXB0IHRoYXQgaW5zdGVhZCBvZiBsb29raW5nIGF0IHRoZSAiRnJvbToiIGZpZWxkIHdlIHVzZQ0KK3RoZSBhZGRyZXNzIGdpdmVuIGJ5IHRoaXMgb3B0aW9uLg0KK1RodXM6DQorDQorICAgIEZyb21TZW5kZXIgPT4gJ21lQG15aG9zdC5jb20nDQorDQorPWJhY2sNCisNCis9Y3V0DQorDQorc3ViIHNlbmRfYnlfc2VuZG1haWwgew0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKw0KKyAgICBpZiAoQF8gPT0gMSkgeyAgICAgICAgICAgICAgICAgICAgIyMjIFVzZSB0aGUgZ2l2ZW4gY29tbWFuZC4uLg0KKwlteSAkc2VuZG1haWxjbWQgPSBzaGlmdCBAXzsNCisNCisJIyMjIERvIGl0Og0KKwlvcGVuIFNFTkRNQUlMLCAifCRzZW5kbWFpbGNtZCIgb3IgQ2FycDo6Y3JvYWsgIm9wZW4gfCRzZW5kbWFpbGNtZDogJCFcbiI7DQorCSRzZWxmLT5wcmludChcKlNFTkRNQUlMKTsNCisJY2xvc2UgU0VORE1BSUw7DQorCXJldHVybiAoKCQ/ID4+IDgpID8gdW5kZWYgOiAxKTsNCisgICAgfQ0KKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIEJ1aWxkIHRoZSBjb21tYW5kLi4uDQorCW15ICVwID0gQF87DQorCSRwe1NlbmRtYWlsfSB8fD0gIi91c3IvbGliL3NlbmRtYWlsIjsNCisNCisJIyMjIFN0YXJ0IHdpdGggdGhlIGNvbW1hbmQgYW5kIGJhc2ljIGFyZ3M6DQorCW15IEBjbWQgPSAoJHB7U2VuZG1haWx9LCBAeyRwe0Jhc2VBcmdzfSB8fCBbJy10JywgJy1vaScsICctb2VtJ119KTsNCisNCisJIyMjIFNlZSBpZiB3ZSBhcmUgZm9yY2libHkgc2V0dGluZyB0aGUgc2VuZGVyOg0KKwkkcHtTZXRTZW5kZXJ9ID0gMSBpZiBkZWZpbmVkKCRwe0Zyb21TZW5kZXJ9KTsNCisNCisJIyMjIEFkZCB0aGUgLWYgYXJndW1lbnQsIHVubGVzcyB3ZSdyZSBleHBsaWNpdGx5IHRvbGQgTk9UIHRvOg0KKwl1bmxlc3MgKGV4aXN0cygkcHtTZXRTZW5kZXJ9KSBhbmQgISRwe1NldFNlbmRlcn0pIHsNCisJICAgIG15ICRmcm9tID0gJHB7RnJvbVNlbmRlcn0gfHwgKCRzZWxmLT5nZXQoJ0Zyb20nKSlbMF07DQorCSAgICBpZiAoJGZyb20pIHsNCisJCW15ICgkZnJvbV9hZGRyKSA9IGV4dHJhY3RfYWRkcnMoJGZyb20pOw0KKwkJcHVzaCBAY21kLCAiLWYkZnJvbV9hZGRyIiAgICAgICBpZiAkZnJvbV9hZGRyOw0KKwkgICAgfQ0KKwl9DQorDQorCSMjIyBPcGVuIHRoZSBjb21tYW5kIGluIGEgdGFpbnQtc2FmZSBmYXNoaW9uOg0KKwlteSAkcGlkID0gb3BlbiBTRU5ETUFJTCwgInwtIjsNCisJZGVmaW5lZCgkcGlkKSBvciBkaWUgIm9wZW4gb2YgcGlwZSBmYWlsZWQ6ICQhXG4iOw0KKwlpZiAoISRwaWQpIHsgICAgIyMjIGNoaWxkDQorCSAgICBleGVjKEBjbWQpIG9yIGRpZSAiY2FuJ3QgZXhlYyAkcHtTZW5kbWFpbH06ICQhXG4iOw0KKwkgICAgIyMjIE5PVFJFQUNIRUQNCisJfQ0KKwllbHNlIHsgICAgICAgICAgIyMjIHBhcmVudA0KKwkgICAgJHNlbGYtPnByaW50KFwqU0VORE1BSUwpOw0KKwkgICAgY2xvc2UgU0VORE1BSUwgfHwgZGllICJlcnJvciBjbG9zaW5nICRwe1NlbmRtYWlsfTogJCEgKGV4aXQgJD8pXG4iOw0KKwkgICAgcmV0dXJuIDE7DQorCX0NCisgICAgfQ0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gc2VuZF9ieV9zbXRwIEFSR1MuLi4NCisNCitJPEluc3RhbmNlIG1ldGhvZC4+DQorU2VuZCBtZXNzYWdlIHZpYSBTTVRQLCB1c2luZyBOZXQ6OlNNVFAuDQorVGhlIG9wdGlvbmFsIEFSR1MgYXJlIHNlbnQgaW50byBOZXQ6OlNNVFA6Om5ldygpOiB1c3VhbGx5LCB0aGVzZSBhcmUNCisNCisgICAgTUFJTEhPU1QsIE9QVElPTj0+VkFMVUUsIC4uLg0KKw0KK05vdGUgdGhhdCB0aGUgbGlzdCBvZiByZWNpcGllbnRzIGlzIHRha2VuIGZyb20gdGhlDQorIlRvIiwgIkNjIiBhbmQgIkJjYyIgZmllbGRzLg0KKw0KK1JldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvciBleGNlcHRpb24gb24gZXJyb3IuDQorDQorPWN1dA0KKw0KKyMjIyBQcm92aWRlZCBieSBBbmRyZXcgTWNSYWUuIFZlcnNpb24gMC4yICBhbm0gIDA5U2VwOTcNCisjIyMgQ29weXJpZ2h0IDE5OTcgT3B0aW1hdGlvbiBOZXcgWmVhbGFuZCBMdGQuDQorIyMjIE1heSBiZSBtb2RpZmllZC9yZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwuDQorIw0KK3N1YiBzZW5kX2J5X3NtdHAgew0KKyAgICBteSAoJHNlbGYsIEBhcmdzKSA9IEBfOw0KKw0KKyAgICAjIyMgV2UgbmVlZCB0aGUgIkZyb206IiBhbmQgIlRvOiIgaGVhZGVycyB0byBwYXNzIHRvIHRoZSBTTVRQIG1haWxlcjoNCisgICAgbXkgJGhkciAgPSAkc2VsZi0+ZmllbGRzKCk7DQorICAgIG15ICRmcm9tID0gJHNlbGYtPmdldCgnRnJvbScpOw0KKyAgICBteSAkdG8gICA9ICRzZWxmLT5nZXQoJ1RvJyk7DQorDQorICAgICMjIyBTYW5pdHkgY2hlY2s6DQorICAgIGRlZmluZWQoJHRvKSBvciBDYXJwOjpjcm9hayAic2VuZF9ieV9zbXRwOiBtaXNzaW5nICdUbzonIGFkZHJlc3NcbiI7DQorDQorICAgICMjIyBHZXQgdGhlIGRlc3RpbmF0aW9ucyBhcyBhIHNpbXBsZSBhcnJheSBvZiBhZGRyZXNzZXM6DQorICAgIG15IEB0b19hbGwgPSBleHRyYWN0X2FkZHJzKCR0byk7DQorICAgIGlmICgkQVVUT19DQykgew0KKwlmb3JlYWNoIG15ICRmaWVsZCAocXcoQ2MgQmNjKSkgew0KKwkgICAgbXkgJHZhbHVlID0gJHNlbGYtPmdldCgkZmllbGQpOw0KKwkgICAgcHVzaCBAdG9fYWxsLCBleHRyYWN0X2FkZHJzKCR2YWx1ZSkgaWYgZGVmaW5lZCgkdmFsdWUpOw0KKwl9DQorICAgIH0NCisNCisgICAgIyMjIENyZWF0ZSBTTVRQIGNsaWVudDoNCisgICAgcmVxdWlyZSBOZXQ6OlNNVFA7DQorICAgIG15ICRzbXRwID0gTUlNRTo6TGl0ZTo6U01UUC0+bmV3KEBhcmdzKQ0KKyAgICAgICAgb3IgQ2FycDo6Y3JvYWsoIkZhaWxlZCB0byBjb25uZWN0IHRvIG1haWwgc2VydmVyOiAkIVxuIik7DQorICAgICRzbXRwLT5tYWlsKCRmcm9tKQ0KKyAgICAgICAgb3IgQ2FycDo6Y3JvYWsoIlNNVFAgTUFJTCBjb21tYW5kIGZhaWxlZDogJCFcbiIuJHNtdHAtPm1lc3NhZ2UuIlxuIik7DQorICAgICRzbXRwLT50byhAdG9fYWxsKQ0KKyAgICAgICAgb3IgQ2FycDo6Y3JvYWsoIlNNVFAgUkNQVCBjb21tYW5kIGZhaWxlZDogJCFcbiIuJHNtdHAtPm1lc3NhZ2UuIlxuIik7DQorICAgICRzbXRwLT5kYXRhKCkNCisgICAgICAgIG9yIENhcnA6OmNyb2FrKCJTTVRQIERBVEEgY29tbWFuZCBmYWlsZWQ6ICQhXG4iLiRzbXRwLT5tZXNzYWdlLiJcbiIpOw0KKw0KKyAgICAjIyMgTUlNRTo6TGl0ZSBjYW4gcHJpbnQoKSB0byBhbnl0aGluZyB3aXRoIGEgcHJpbnQoKSBtZXRob2Q6DQorICAgICRzZWxmLT5wcmludF9mb3Jfc210cCgkc210cCk7DQorICAgICRzbXRwLT5kYXRhZW5kKCk7DQorICAgICRzbXRwLT5xdWl0Ow0KKyAgICAxOw0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIw0KKyMgc2VuZF9ieV9zdWIgW1wmU1VCUkVGLCBbQVJHUy4uLl1dDQorIw0KKyMgSTxJbnN0YW5jZSBtZXRob2QsIHByaXZhdGUuPg0KKyMgU2VuZCB0aGUgbWVzc2FnZSB2aWEgYW4gYW5vbnltb3VzIHN1YnJvdXRpbmUuDQorIw0KK3N1YiBzZW5kX2J5X3N1YiB7DQorICAgIG15ICgkc2VsZiwgJHN1YnJlZiwgQGFyZ3MpID0gQF87DQorICAgICYkc3VicmVmKCRzZWxmLCBAYXJncyk7DQorfQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCis9aXRlbSBzZW5kbWFpbCBDT01NQU5ELi4uDQorDQorSTxDbGFzcyBtZXRob2QsIERFUFJFQ0FURUQuPg0KK0RlY2xhcmUgdGhlIHNlbmRlciB0byBiZSAic2VuZG1haWwiLCBhbmQgc2V0IHVwIHRoZSAic2VuZG1haWwiIGNvbW1hbmQuDQorSTxZb3Ugc2hvdWxkIHVzZSBzZW5kKCkgaW5zdGVhZC4+DQorDQorPWN1dA0KKw0KK3N1YiBzZW5kbWFpbCB7DQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgICRzZWxmLT5zZW5kKCdzZW5kbWFpbCcsIGpvaW4oJyAnLCBAXykpOw0KK30NCisNCis9YmFjaw0KKw0KKz1jdXQNCisNCisNCisNCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKz1oZWFkMiBNaXNjZWxsYW5lb3VzDQorDQorPW92ZXIgNA0KKw0KKz1jdXQNCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorPWl0ZW0gcXVpZXQgT05PRkYNCisNCitJPENsYXNzIG1ldGhvZC4+DQorU3VwcHJlc3MvdW5zdXBwcmVzcyBhbGwgd2FybmluZ3MgY29taW5nIGZyb20gdGhpcyBtb2R1bGUuDQorDQorICAgIE1JTUU6OkxpdGUtPnF1aWV0KDEpOyAgICAgICAjIyMgSSBrbm93IHdoYXQgSSdtIGRvaW5nDQorDQorSSByZWNvbW1lbmQgdGhhdCB5b3UgaW5jbHVkZSB0aGF0IGNvbW1lbnQgYXMgd2VsbC4gIEFuZCB3aGlsZQ0KK3lvdSB0eXBlIGl0LCBzYXkgaXQgb3V0IGxvdWQ6IGlmIGl0IGRvZXNuJ3QgZmVlbCByaWdodCwgdGhlbiBtYXliZQ0KK3lvdSBzaG91bGQgcmVjb25zaWRlciB0aGUgd2hvbGUgbGluZS4gIEM8Oy0pPg0KKw0KKz1jdXQNCisNCitzdWIgcXVpZXQgew0KKyAgICBteSAkY2xhc3MgPSBzaGlmdDsNCisgICAgJFFVSUVUID0gc2hpZnQgaWYgQF87DQorICAgICRRVUlFVDsNCit9DQorDQorPWJhY2sNCisNCis9Y3V0DQorDQorDQorDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK3BhY2thZ2UgTUlNRTo6TGl0ZTo6U01UUDsNCisNCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyBUaGlzIGNsYXNzIGp1c3QgYWRkcyBhIHByaW50KCkgbWV0aG9kIHRvIE5ldDo6U01UUC4NCisjIE5vdGljZSB0aGF0IHdlIGRvbid0IHVzZS9yZXF1aXJlIGl0IHVudGlsIGl0J3MgbmVlZGVkIQ0KKw0KK3VzZSBzdHJpY3Q7DQordXNlIHZhcnMgcXcoIEBJU0EgKTsNCitASVNBID0gcXcoTmV0OjpTTVRQKTsNCisNCitzdWIgcHJpbnQgeyBzaGlmdC0+ZGF0YXNlbmQoQF8pIH0NCisNCisNCisNCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorcGFja2FnZSBNSU1FOjpMaXRlOjpJT19IYW5kbGU7DQorDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyMjIyBXcmFwIGEgbm9uLW9iamVjdCBmaWxlaGFuZGxlIGluc2lkZSBhIGJsZXNzZWQsIHByaW50YWJsZSBpbnRlcmZhY2U6DQorIyMjIERvZXMgbm90aGluZyBpZiB0aGUgZ2l2ZW4gJGZoIGlzIGFscmVhZHkgYSBibGVzc2VkIG9iamVjdC4NCitzdWIgd3JhcCB7DQorICAgIG15ICgkY2xhc3MsICRmaCkgPSBAXzsNCisgICAgbm8gc3RyaWN0ICdyZWZzJzsNCisNCisgICAgIyMjIEdldCBkZWZhdWx0LCBpZiBuZWNlc3Nhcnk6DQorICAgICRmaCBvciAkZmggPSBzZWxlY3Q7ICAgICAgICAjIyMgbm8gZmlsZWhhbmRsZSBtZWFucyBzZWxlY3RlZCBvbmUNCisgICAgcmVmKCRmaCkgb3IgJGZoID0gXCokZmg7ICAgICMjIyBzY2FsYXIgYmVjb21lcyBhIGdsb2JyZWYNCisNCisgICAgIyMjIFN0b3AgcmlnaHQgYXdheSBpZiBhbHJlYWR5IGEgcHJpbnRhYmxlIG9iamVjdDoNCisgICAgcmV0dXJuICRmaCBpZiAocmVmKCRmaCkgYW5kIChyZWYoJGZoKSBuZSAnR0xPQicpKTsNCisNCisgICAgIyMjIEdldCBhbmQgcmV0dXJuIGEgcHJpbnRhYmxlIGludGVyZmFjZToNCisgICAgYmxlc3MgXCRmaCwgJGNsYXNzOyAgICAgICAgICMjIyB3cmFwIGl0IGluIGEgcHJpbnRhYmxlIGludGVyZmFjZQ0KK30NCisNCisjIyMgUHJpbnQ6DQorc3ViIHByaW50IHsNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisgICAgcHJpbnQgeyQkc2VsZn0gQF87DQorfQ0KKw0KKw0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCitwYWNrYWdlIE1JTUU6OkxpdGU6OklPX1NjYWxhcjsNCisNCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorIyMjIFdyYXAgYSBzY2FsYXIgaW5zaWRlIGEgYmxlc3NlZCwgcHJpbnRhYmxlIGludGVyZmFjZToNCitzdWIgd3JhcCB7DQorICAgIG15ICgkY2xhc3MsICRzY2FsYXJyZWYpID0gQF87DQorICAgIGRlZmluZWQoJHNjYWxhcnJlZikgb3IgJHNjYWxhcnJlZiA9IFwiIjsNCisgICAgYmxlc3MgJHNjYWxhcnJlZiwgJGNsYXNzOw0KK30NCisNCisjIyMgUHJpbnQ6DQorc3ViIHByaW50IHsNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisgICAgJCRzZWxmIC49IGpvaW4oJycsIEBfKTsNCisgICAgMTsNCit9DQorDQorDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK3BhY2thZ2UgTUlNRTo6TGl0ZTo6SU9fU2NhbGFyQXJyYXk7DQorDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyMjIyBXcmFwIGFuIGFycmF5IGluc2lkZSBhIGJsZXNzZWQsIHByaW50YWJsZSBpbnRlcmZhY2U6DQorc3ViIHdyYXAgew0KKyAgICBteSAoJGNsYXNzLCAkYXJyYXlyZWYpID0gQF87DQorICAgIGRlZmluZWQoJGFycmF5cmVmKSBvciAkYXJyYXlyZWYgPSBbXTsNCisgICAgYmxlc3MgJGFycmF5cmVmLCAkY2xhc3M7DQorfQ0KKw0KKyMjIyBQcmludDoNCitzdWIgcHJpbnQgew0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKyAgICBwdXNoIEAkc2VsZiwgQF87DQorICAgIDE7DQorfQ0KKw0KKzE7DQorX19FTkRfXw0KKw0KKw0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCis9aGVhZDEgTk9URVMNCisNCisNCis9aGVhZDIgSG93IGRvIEkgcHJldmVudCAiQ29udGVudCIgaGVhZGVycyBmcm9tIHNob3dpbmcgdXAgaW4gbXkgbWFpbCByZWFkZXI/DQorDQorQXBwYXJlbnRseSwgc29tZSBwZW9wbGUgYXJlIHVzaW5nIG1haWwgcmVhZGVycyB3aGljaCBkaXNwbGF5IHRoZSBNSU1FDQoraGVhZGVycyBsaWtlICJDb250ZW50LWRpc3Bvc2l0aW9uIiwgYW5kIHRoZXkgd2FudCBNSU1FOjpMaXRlIG5vdA0KK3RvIGdlbmVyYXRlIHRoZW0gImJlY2F1c2UgdGhleSBsb29rIHVnbHkiLg0KKw0KK1NpZ2guDQorDQorWSdrbm93LCBraWRzLCB0aG9zZSBoZWFkZXJzIGFyZW4ndCBqdXN0IHRoZXJlIGZvciBjb3NtZXRpYyBwdXJwb3Nlcy4NCitUaGV5IGhlbHAgZW5zdXJlIHRoYXQgdGhlIG1lc3NhZ2UgaXMgSTx1bmRlcnN0b29kPiBjb3JyZWN0bHkgYnkgbWFpbA0KK3JlYWRlcnMuICBCdXQgb2theSwgeW91IGFza2VkIGZvciBpdCwgeW91IGdvdCBpdC4uLg0KK2hlcmUncyBob3cgeW91IGNhbiBzdXBwcmVzcyB0aGUgc3RhbmRhcmQgTUlNRSBoZWFkZXJzLg0KK0JlZm9yZSB5b3Ugc2VuZCB0aGUgbWVzc2FnZSwgZG8gdGhpczoNCisNCisJJG1zZy0+c2NydWI7DQorDQorWW91IGNhbiBzY3J1YigpIGFueSBwYXJ0IG9mIGEgbXVsdGlwYXJ0IG1lc3NhZ2UgaW5kZXBlbmRlbnRseTsNCitqdXN0IGJlIGF3YXJlIHRoYXQgaXQgd29ya3MgcmVjdXJzaXZlbHkuICBCZWZvcmUgeW91IHNjcnViLA0KK25vdGUgdGhlIHJ1bGVzIHRoYXQgSSBmb2xsb3c6DQorDQorPW92ZXIgNA0KKw0KKz1pdGVtIENvbnRlbnQtdHlwZQ0KKw0KK1lvdSBjYW4gc2FmZWx5IHNjcnViIHRoZSAiY29udGVudC10eXBlIiBhdHRyaWJ1dGUgaWYsIGFuZCBvbmx5IGlmLA0KK3RoZSBwYXJ0IGlzIG9mIHR5cGUgInRleHQvcGxhaW4iIHdpdGggY2hhcnNldCAidXMtYXNjaWkiLg0KKw0KKz1pdGVtIENvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcNCisNCitZb3UgY2FuIHNhZmVseSBzY3J1YiB0aGUgImNvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmciIGF0dHJpYnV0ZQ0KK2lmLCBhbmQgb25seSBpZiwgdGhlIHBhcnQgdXNlcyAiN2JpdCIsICI4Yml0Iiwgb3IgImJpbmFyeSIgZW5jb2RpbmcuDQorWW91IGFyZSBmYXIgYmV0dGVyIG9mZiBkb2luZyB0aGlzIGlmIHlvdXIgbGluZXMgYXJlIHVuZGVyIDEwMDANCitjaGFyYWN0ZXJzLiAgR2VuZXJhbGx5LCB0aGF0IG1lYW5zIHlvdSBJPGNhbj4gc2NydWIgaXQgZm9yIHBsYWluDQordGV4dCwgYW5kIHlvdSBjYW4gSTxub3Q+IHNjcnViIHRoaXMgZm9yIGltYWdlcywgZXRjLg0KKw0KKz1pdGVtIENvbnRlbnQtZGlzcG9zaXRpb24NCisNCitZb3UgY2FuIHNhZmVseSBzY3J1YiB0aGUgImNvbnRlbnQtZGlzcG9zaXRpb24iIGF0dHJpYnV0ZQ0KK2lmIHlvdSB0cnVzdCB0aGUgbWFpbCByZWFkZXIgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIHdoZW4gaXQgZGVjaWRlcw0KK3doZXRoZXIgdG8gc2hvdyBhbiBhdHRhY2htZW50IGlubGluZSBvciBhcyBhIGxpbmsuICBCZSBhd2FyZQ0KK3RoYXQgc2NydWJiaW5nIGJvdGggdGhlIGNvbnRlbnQtZGlzcG9zaXRpb24gYW5kIHRoZSBjb250ZW50LXR5cGUNCittZWFucyB0aGF0IHRoZXJlIGlzIG5vIHdheSB0byAicmVjb21tZW5kIiBhIGZpbGVuYW1lIGZvciB0aGUgYXR0YWNobWVudCENCisNCitCPE5vdGU6PiB0aGVyZSBhcmUgcmVwb3J0cyBvZiBicmFpbi1kZWFkIE1VQXMgb3V0IHRoZXJlIHRoYXQNCitkbyB0aGUgd3JvbmcgdGhpbmcgaWYgeW91IEk8cHJvdmlkZT4gdGhlIGNvbnRlbnQtZGlzcG9zaXRpb24uDQorSWYgeW91ciBhdHRhY2htZW50cyBrZWVwIHNob3dpbmcgdXAgaW5saW5lIG9yIHZpY2UtdmVyc2EsDQordHJ5IHNjcnViYmluZyB0aGlzIGF0dHJpYnV0ZS4NCisNCis9aXRlbSBDb250ZW50LWxlbmd0aA0KKw0KK1lvdSBjYW4gYWx3YXlzIHNjcnViICJjb250ZW50LWxlbmd0aCIgc2FmZWx5Lg0KKw0KKz1iYWNrDQorDQorPWhlYWQyIEhvdyBkbyBJIGdpdmUgbXkgYXR0YWNobWVudCBhIFtkaWZmZXJlbnRdIHJlY29tbWVuZGVkIGZpbGVuYW1lPw0KKw0KK0J5IHVzaW5nIHRoZSBGaWxlbmFtZSBvcHRpb24gKHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFBhdGghKToNCisNCisJJG1zZy0+YXR0YWNoKFR5cGUgPT4gImltYWdlL2dpZiIsDQorCSAgICAgICAgICAgICBQYXRoID0+ICIvaGVyZS9pcy90aGUvcmVhbC9maWxlLkdJRiIsDQorCSAgICAgICAgICAgICBGaWxlbmFtZSA9PiAibG9nby5naWYiKTsNCisNCitZb3Ugc2hvdWxkIEk8bm90PiBwdXQgcGF0aCBpbmZvcm1hdGlvbiBpbiB0aGUgRmlsZW5hbWUuDQorDQorPWhlYWQyIEJlbmlnbiBsaW1pdGF0aW9ucw0KKw0KK1RoaXMgaXMgImxpdGUiLCBhZnRlciBhbGwuLi4NCisNCis9b3ZlciA0DQorDQorPWl0ZW0gKg0KKw0KK1RoZXJlJ3Mgbm8gcGFyc2luZy4gIEdldCBNSU1FLXRvb2xzIGlmIHlvdSBuZWVkIHRvIHBhcnNlIE1JTUUgbWVzc2FnZXMuDQorDQorPWl0ZW0gKg0KKw0KK01JTUU6OkxpdGUgbWVzc2FnZXMgYXJlIGN1cnJlbnRseSBJPG5vdD4gaW50ZXJjaGFuZ2VhYmxlIHdpdGgNCitlaXRoZXIgTWFpbDo6SW50ZXJuZXQgb3IgTUlNRTo6RW50aXR5IG9iamVjdHMuICBUaGlzIGlzIGEgY29tcGxldGVseQ0KK3NlcGFyYXRlIG1vZHVsZS4NCisNCis9aXRlbSAqDQorDQorQSBjb250ZW50LWxlbmd0aCBmaWVsZCBpcyBvbmx5IGluc2VydGVkIGlmIHRoZSBlbmNvZGluZyBpcyBiaW5hcnksDQordGhlIG1lc3NhZ2UgaXMgYSBzaW5nbGVwYXJ0LCBhbmQgYWxsIHRoZSBkb2N1bWVudCBkYXRhIGlzIGF2YWlsYWJsZQ0KK2F0IEM8YnVpbGQoKT4gdGltZSBieSB2aXJ0dWUgb2YgcmVzaWRpbmcgaW4gYSBzaW1wbGUgcGF0aCwgb3IgaW4tY29yZS4NCitTaW5jZSBjb250ZW50LWxlbmd0aCBpcyBub3QgYSBzdGFuZGFyZCBNSU1FIGZpZWxkIGFueXdheSAodGhhdCdzIHJpZ2h0LCBraWRzOg0KK2l0J3Mgbm90IGluIHRoZSBNSU1FIFJGQ3MsIGl0J3MgYW4gSFRUUCB0aGluZyksIHRoaXMgc2VlbXMgcHJldHR5IGZhaXIuDQorDQorPWl0ZW0gKg0KKw0KK01JTUU6OkxpdGUgYWxvbmUgY2Fubm90IGhlbHAgeW91IGxvc2Ugd2VpZ2h0LiAgWW91IG11c3Qgc3VwcGxlbWVudA0KK3lvdXIgdXNlIG9mIE1JTUU6OkxpdGUgd2l0aCBhIGhlYWx0aHkgZGlldCBhbmQgZXhlcmNpc2UuDQorDQorPWJhY2sNCisNCisNCis9aGVhZDIgQ2hlYXAgYW5kIGVhc3kgbWFpbGluZw0KKw0KK0kgdGhvdWdodCBwdXR0aW5nIGluIGEgZGVmYXVsdCAic2VuZG1haWwiIGludm9jYXRpb24gd2Fzbid0IHRvbyBiYWQgYW4NCitpZGVhLCBzaW5jZSBhIGxvdCBvZiBQZXJsZXJzIGFyZSBvbiBVTklYIHN5c3RlbXMuDQorVGhlIG91dC1vZi10aGUtYm94IGNvbmZpZ3VyYXRpb24gaXM6DQorDQorICAgICBNSU1FOjpMaXRlLT5zZW5kKCdzZW5kbWFpbCcsICIvdXNyL2xpYi9zZW5kbWFpbCAtdCAtb2kgLW9lbSIpOw0KKw0KK0J5IHRoZSB3YXksIHRoZXNlIGFyZ3VtZW50cyB0byBzZW5kbWFpbCBhcmU6DQorDQorICAgICAtdCAgICAgIFNjYW4gbWVzc2FnZSBmb3IgVG86LCBDYzosIEJjYzosIGV0Yy4NCisNCisgICAgIC1vaSAgICAgRG8gTk9UIHRyZWF0IGEgc2luZ2xlICIuIiBvbiBhIGxpbmUgYXMgYSBtZXNzYWdlIHRlcm1pbmF0b3IuDQorICAgICAgICAgICAgIEFzIGluLCAiLW9pIHZleSwgaXQgdHJ1bmNhdGVkIG15IG1lc3NhZ2UuLi4gd2h5PyEiDQorDQorICAgICAtb2VtICAgIE9uIGVycm9yLCBtYWlsIGJhY2sgdGhlIG1lc3NhZ2UgKEkgYXNzdW1lIHRvIHRoZQ0KKyAgICAgICAgICAgICBhcHByb3ByaWF0ZSBhZGRyZXNzLCBnaXZlbiBpbiB0aGUgaGVhZGVyKS4NCisgICAgICAgICAgICAgV2hlbiBtYWlsIHJldHVybnMsIGNpcmNsZSBpcyBjb21wbGV0ZS4gIEphaSBHdXJ1IERldmEgLW9lbS4NCisNCitOb3RlIHRoYXQgdGhlc2UgYXJlIHRoZSBzYW1lIGFyZ3VtZW50cyB5b3UgZ2V0IGlmIHlvdSBjb25maWd1cmUgdG8gdXNlDQordGhlIHNtYXJ0ZXIsIHRhaW50LXNhZmUgbWFpbGluZzoNCisNCisgICAgIE1JTUU6OkxpdGUtPnNlbmQoJ3NlbmRtYWlsJyk7DQorDQorSWYgeW91IGdldCAiWC1BdXRoZW50aWNhdGlvbi1XYXJuaW5nIiBoZWFkZXJzIGZyb20gdGhpcywgeW91IGNhbiBmb3Jnbw0KK2RpZGRsaW5nIHdpdGggdGhlIGVudmVsb3BlIGJ5IGluc3RlYWQgc3BlY2lmeWluZzoNCisNCisgICAgIE1JTUU6OkxpdGUtPnNlbmQoJ3NlbmRtYWlsJywgU2V0U2VuZGVyPT4wKTsNCisNCitBbmQsIGlmIHlvdSdyZSBub3Qgb24gYSBVbml4IHN5c3RlbSwgb3IgaWYgeW91J2QganVzdCByYXRoZXIgc2VuZCBtYWlsDQorc29tZSBvdGhlciB3YXksIHRoZXJlJ3MgYWx3YXlzOg0KKw0KKyAgICAgTUlNRTo6TGl0ZS0+c2VuZCgnc210cCcsICJzbXRwLm15aXNwLm5ldCIpOw0KKw0KK09yIHlvdSBjYW4gc2V0IHVwIHlvdXIgb3duIHN1YnJvdXRpbmUgdG8gY2FsbC4NCitJbiBhbnkgY2FzZSwgY2hlY2sgb3V0IHRoZSBMPHNlbmQoKXwvc2VuZD4gbWV0aG9kLg0KKw0KKw0KKw0KKz1oZWFkMSBXQVJOSU5HUw0KKw0KKz1oZWFkMiBHb29kLXZzLWJhZCBlbWFpbCBhZGRyZXNzZXMgd2l0aCBzZW5kX2J5X3NtdHAoKQ0KKw0KK0lmIHVzaW5nIEw8c2VuZF9ieV9zbXRwKCl8L3NlbmRfYnlfc210cD4sIGJlIGF3YXJlIHRoYXQgeW91IGFyZQ0KK2ZvcmNpbmcgTUlNRTo6TGl0ZSB0byBleHRyYWN0IGVtYWlsIGFkZHJlc3NlcyBvdXQgb2YgYSBwb3NzaWJsZSBsaXN0DQorcHJvdmlkZWQgaW4gdGhlIEM8VG86PiwgQzxDYzo+LCBhbmQgQzxCY2M6PiBmaWVsZHMuICBUaGlzIGlzIHRyaWNreQ0KK3N0dWZmLCBhbmQgYXMgc3VjaCBvbmx5IHRoZSBmb2xsb3dpbmcgc29ydHMgb2YgYWRkcmVzc2VzIHdpbGwgd29yaw0KK3JlbGlhYmx5Og0KKw0KKyAgICB1c2VybmFtZQ0KKyAgICBmdWxsLm5hbWVAc29tZS5ob3N0LmNvbQ0KKyAgICAiTmFtZSwgRnVsbCIgPGZ1bGwubmFtZUBzb21lLmhvc3QuY29tPg0KKw0KK1RoaXMgbGFzdCBmb3JtIGlzIGRpc2NvdXJhZ2VkIGJlY2F1c2UgU01UUCBtdXN0IGJlIGFibGUgdG8gZ2V0DQorYXQgdGhlIEk8bmFtZT4gb3IgSTxuYW1lQGRvbWFpbj4gcG9ydGlvbi4NCisNCitCPERpc2NsYWltZXI6Pg0KK01JTUU6OkxpdGUgd2FzIG5ldmVyIGludGVuZGVkIHRvIGJlIGEgTWFpbCBVc2VyIEFnZW50LCBzbyBwbGVhc2UNCitkb24ndCBleHBlY3QgYSBmdWxsIGltcGxlbWVudGF0aW9uIG9mIFJGQy04MjIuICBSZXN0cmljdCB5b3Vyc2VsZiB0bw0KK3RoZSBjb21tb24gZm9ybXMgb2YgSW50ZXJuZXQgYWRkcmVzc2VzIGRlc2NyaWJlZCBoZXJlaW4sIGFuZCB5b3Ugc2hvdWxkDQorYmUgZmluZS4gIElmIHRoaXMgaXMgbm90IGZlYXNpYmxlLCB0aGVuIGNvbnNpZGVyIHVzaW5nIE1JTUU6OkxpdGUNCit0byBJPHByZXBhcmU+IHlvdXIgbWVzc2FnZSBvbmx5LCBhbmQgdXNpbmcgTmV0OjpTTVRQIGV4cGxpY2l0bHkgdG8NCitJPHNlbmQ+IHlvdXIgbWVzc2FnZS4NCisNCisNCis9aGVhZDIgRm9ybWF0dGluZyBvZiBoZWFkZXJzIGRlbGF5ZWQgdW50aWwgcHJpbnQoKQ0KKw0KK1RoaXMgY2xhc3MgdHJlYXRzIGEgTUlNRSBoZWFkZXIgaW4gdGhlIG1vc3QgYWJzdHJhY3Qgc2Vuc2UsDQorYXMgYmVpbmcgYSBjb2xsZWN0aW9uIG9mIGhpZ2gtbGV2ZWwgYXR0cmlidXRlcy4gIFRoZSBhY3R1YWwNCitSRkMtODIyLXN0eWxlIGhlYWRlciBmaWVsZHMgYXJlIG5vdCBjb25zdHJ1Y3RlZCB1bnRpbCBpdCdzIHRpbWUNCit0byBhY3R1YWxseSBwcmludCB0aGUgZGFybiB0aGluZy4NCisNCisNCis9aGVhZDIgRW5jb2Rpbmcgb2YgZGF0YSBkZWxheWVkIHVudGlsIHByaW50KCkNCisNCitXaGVuIHlvdSBzcGVjaWZ5IG1lc3NhZ2UgYm9kaWVzDQorKGluIEw8YnVpbGQoKXwvYnVpbGQ+IG9yIEw8YXR0YWNoKCl8L2F0dGFjaD4pIC0tDQord2hldGhlciBieSBCPEZIPiwgQjxEYXRhPiwgb3IgQjxQYXRoPiAtLSBiZSB3YXJuZWQgdGhhdCB3ZSBkb24ndA0KK2F0dGVtcHQgdG8gb3BlbiBmaWxlcywgcmVhZCBmaWxlaGFuZGxlcywgb3IgZW5jb2RlIHRoZSBkYXRhIHVudGlsDQorTDxwcmludCgpfC9wcmludD4gaXMgaW52b2tlZC4NCisNCitJbiB0aGUgcGFzdCwgdGhpcyBjcmVhdGVkIHNvbWUgY29uZnVzaW9uIGZvciB1c2VycyBvZiBzZW5kbWFpbA0KK3dobyBnYXZlIHRoZSB3cm9uZyBwYXRoIHRvIGFuIGF0dGFjaG1lbnQgYm9keSwgc2luY2UgZW5vdWdoIG9mDQordGhlIHByaW50KCkgd291bGQgc3VjY2VlZCB0byBnZXQgdGhlIGluaXRpYWwgcGFydCBvZiB0aGUgbWVzc2FnZSBvdXQuDQorTm93YWRheXMsICRBVVRPX1ZFUklGWSBpcyB1c2VkIHRvIHNwb3QtY2hlY2sgdGhlIFBhdGhzIGdpdmVuIGJlZm9yZQ0KK3RoZSBtYWlsIGZhY2lsaXR5IGlzIGVtcGxveWVkLiAgQSB3aGlza2VyIHNsb3dlciwgYnV0IHRvbnMgc2FmZXIuDQorDQorTm90ZSB0aGF0IGlmIHlvdSBnaXZlIGEgbWVzc2FnZSBib2R5IHZpYSBGSCwgYW5kIHRyeSB0byBwcmludCgpDQorYSBtZXNzYWdlIHR3aWNlLCB0aGUgc2Vjb25kIHByaW50KCkgd2lsbCBub3QgZG8gdGhlIHJpZ2h0IHRoaW5nDQordW5sZXNzIHlvdSAgZXhwbGljaXRseSByZXdpbmQgdGhlIGZpbGVoYW5kbGUuDQorDQorWW91IGNhbiBnZXQgcGFzdCB0aGVzZSBkaWZmaWN1bHRpZXMgYnkgdXNpbmcgdGhlIEI8UmVhZE5vdz4gb3B0aW9uLA0KK3Byb3ZpZGVkIHRoYXQgeW91IGhhdmUgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgeW91ciBtZXNzYWdlcy4NCisNCisNCis9aGVhZDIgTUlNRSBhdHRyaWJ1dGVzIGFyZSBzZXBhcmF0ZSBmcm9tIGhlYWRlciBmaWVsZHMhDQorDQorQjxJbXBvcnRhbnQ6PiB0aGUgTUlNRSBhdHRyaWJ1dGVzIGFyZSBzdG9yZWQgYW5kIG1hbmlwdWxhdGVkIHNlcGFyYXRlbHkNCitmcm9tIHRoZSBtZXNzYWdlIGhlYWRlciBmaWVsZHM7IHdoZW4gaXQgY29tZXMgdGltZSB0byBwcmludCB0aGUNCitoZWFkZXIgb3V0LCBJPGFueSBleHBsaWNpdGx5LWdpdmVuIGhlYWRlciBmaWVsZHMgb3ZlcnJpZGUgdGhlIG9uZXMgdGhhdA0KK3dvdWxkIGJlIGNyZWF0ZWQgZnJvbSB0aGUgTUlNRSBhdHRyaWJ1dGVzLj4gIFRoYXQgbWVhbnMgdGhhdCB0aGlzOg0KKw0KKyAgICAjIyMgREFOR0VSICMjIyBEQU5HRVIgIyMjIERBTkdFUiAjIyMgREFOR0VSICMjIyBEQU5HRVIgIyMjDQorICAgICRtc2ctPmFkZCgiQ29udGVudC10eXBlIiwgInRleHQvaHRtbDsgY2hhcnNldD1VUy1BU0NJSSIpOw0KKw0KK3dpbGwgc2V0IHRoZSBleGFjdCBDPCJDb250ZW50LXR5cGUiPiBmaWVsZCBpbiB0aGUgaGVhZGVyIEkgd3JpdGUsDQorSTxyZWdhcmRsZXNzIG9mIHdoYXQgdGhlIGFjdHVhbCBNSU1FIGF0dHJpYnV0ZXMgYXJlLj4NCisNCitJPFRoaXMgZmVhdHVyZSBpcyBmb3IgZXhwZXJpZW5jZWQgdXNlcnMgb25seSw+IGFzIGFuIGVzY2FwZSBoYXRjaCBpbiBjYXNlDQordGhlIGNvZGUgdGhhdCBub3JtYWxseSBmb3JtYXRzIE1JTUUgaGVhZGVyIGZpZWxkcyBpc24ndCBkb2luZyB3aGF0DQoreW91IG5lZWQuICBBbmQsIGxpa2UgYW55IGVzY2FwZSBoYXRjaCwgaXQncyBnb3QgYW4gYWxhcm0gb24gaXQ6DQorTUlNRTo6TGl0ZSB3aWxsIHdhcm4geW91IGlmIHlvdSBhdHRlbXB0IHRvIEM8c2V0KCk+IG9yIEM8cmVwbGFjZSgpPg0KK2FueSBNSU1FIGhlYWRlciBmaWVsZC4gIFVzZSBDPGF0dHIoKT4gaW5zdGVhZC4NCisNCisNCis9aGVhZDIgQmV3YXJlIG9mIGxpbmVzIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgZG90DQorDQorSnVsaWFuIEhhaWdodCBub3RlZCB0aGF0IE1JTUU6OkxpdGUgYWxsb3dzIHlvdSB0byBjb21wb3NlIG1lc3NhZ2VzDQord2l0aCBsaW5lcyBpbiB0aGUgYm9keSBjb25zaXN0aW5nIG9mIGEgc2luZ2xlICIuIi4NCitUaGlzIGlzIHRydWU6IGl0IHNob3VsZCBiZSBjb21wbGV0ZWx5IGhhcm1sZXNzIHNvIGxvbmcgYXMgInNlbmRtYWlsIg0KK2lzIHVzZWQgd2l0aCB0aGUgLW9pIG9wdGlvbiAoc2VlIEw8IkNoZWFwIGFuZCBlYXN5IG1haWxpbmciPikuDQorDQorSG93ZXZlciwgSSBkb24ndCBrbm93IGlmIHVzaW5nIE5ldDo6U01UUCB0byB0cmFuc2ZlciBzdWNoIGEgbWVzc2FnZQ0KK2lzIGVxdWFsbHkgc2FmZS4gIEZlZWRiYWNrIGlzIHdlbGNvbWVkLg0KKw0KK015IHBlcnNwZWN0aXZlOiBJIGRvbid0IHdhbnQgdG8gbWFnaWNhbGx5IGRpZGRsZSB3aXRoIGEgdXNlcidzDQorbWVzc2FnZSB1bmxlc3MgYWJzb2x1dGVseSBwb3NpdGl2ZWx5IG5lY2Vzc2FyeS4NCitTb21lIHVzZXJzIG1heSB3YW50IHRvIHNlbmQgZmlsZXMgd2l0aCAiLiIgYWxvbmUgb24gYSBsaW5lOw0KK215IHdlbGwtbWVhbmluZyB0aW5rZXJpbmcgY291bGQgc2VyaW91c2x5IGhhcm0gdGhlbS4NCisNCisNCis9aGVhZDIgSW5maW5pdGUgbG9vcHMgbWF5IG1lYW4gdGFpbnRlZCBkYXRhIQ0KKw0KK1N0ZWZhbiBTYXV0dGVyIG5vdGljZWQgYSBidWcgaW4gMi4xMDYgd2hlcmUgYSBtLy9nYyBtYXRjaCB3YXMNCitmYWlsaW5nIGR1ZSB0byB0YWludGVkIGRhdGEsIGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBpbnNpZGUNCitNSU1FOjpMaXRlLg0KKw0KK0kgYW0gYXR0ZW1wdGluZyB0byBjb3JyZWN0IGZvciB0aGlzLCBidXQgYmUgYWR2aXNlZCB0aGF0IG15IGZpeCB3aWxsDQorc2lsZW50bHkgdW50YWludCB0aGUgZGF0YSAoZ2l2ZW4gdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0NCitvY2N1cnMsIHRoaXMgc2hvdWxkIGJlIGJlbmlnbjogSSd2ZSBsYWJlbGxlZCB0aGUgc291cmNlIGNvZGUgd2l0aA0KK1VOVEFJTlQgY29tbWVudHMgZm9yIHRoZSBjdXJpb3VzKS4NCisNCitTbzogZG9uJ3QgZGVwZW5kIG9uIHRhaW50LWNoZWNraW5nIHRvIHNhdmUgeW91IGZyb20gb3V0cHV0dGluZw0KK3RhaW50ZWQgZGF0YSBpbiBhIG1lc3NhZ2UuDQorDQorDQorPWhlYWQyIERvbid0IHR3ZWFrIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbg0KKw0KK0dsb2JhbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBhcmUgYmFkLCBhbmQgc2hvdWxkIGdvIGF3YXkuDQorVW50aWwgdGhleSBkbywgcGxlYXNlIGZvbGxvdyB0aGUgaGludHMgd2l0aCBlYWNoIHNldHRpbmcNCitvbiBob3cgSTxub3Q+IHRvIGNoYW5nZSBpdC4NCisNCis9aGVhZDEgQSBNSU1FIFBSSU1FUg0KKw0KKz1oZWFkMiBDb250ZW50IHR5cGVzDQorDQorVGhlICJUeXBlIiBwYXJhbWV0ZXIgb2YgQzxidWlsZCgpPiBpcyBhIEk8Y29udGVudCB0eXBlPi4NCitUaGlzIGlzIHRoZSBhY3R1YWwgdHlwZSBvZiBkYXRhIHlvdSBhcmUgc2VuZGluZy4NCitHZW5lcmFsbHkgdGhpcyBpcyBhIHN0cmluZyBvZiB0aGUgZm9ybSBDPCJtYWpvcnR5cGUvbWlub3J0eXBlIj4uDQorDQorSGVyZSBhcmUgdGhlIG1ham9yIE1JTUUgdHlwZXMuDQorQSBtb3JlLWNvbXByZWhlbnNpdmUgbGlzdGluZyBtYXkgYmUgZm91bmQgaW4gUkZDLTIwNDYuDQorDQorPW92ZXIgNA0KKw0KKz1pdGVtIGFwcGxpY2F0aW9uDQorDQorRGF0YSB3aGljaCBkb2VzIG5vdCBmaXQgaW4gYW55IG9mIHRoZSBvdGhlciBjYXRlZ29yaWVzLCBwYXJ0aWN1bGFybHkNCitkYXRhIHRvIGJlIHByb2Nlc3NlZCBieSBzb21lIHR5cGUgb2YgYXBwbGljYXRpb24gcHJvZ3JhbS4NCitDPGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbT4sIEM8YXBwbGljYXRpb24vZ3ppcD4sIEM8YXBwbGljYXRpb24vcG9zdHNjcmlwdD4uLi4NCisNCis9aXRlbSBhdWRpbw0KKw0KK0F1ZGlvIGRhdGEuDQorQzxhdWRpby9iYXNpYz4uLi4NCisNCis9aXRlbSBpbWFnZQ0KKw0KK0dyYXBoaWNzIGRhdGEuDQorQzxpbWFnZS9naWY+LCBDPGltYWdlL2pwZWc+Li4uDQorDQorPWl0ZW0gbWVzc2FnZQ0KKw0KK0EgbWVzc2FnZSwgdXN1YWxseSBhbm90aGVyIG1haWwgb3IgTUlNRSBtZXNzYWdlLg0KK0M8bWVzc2FnZS9yZmM4MjI+Li4uDQorDQorPWl0ZW0gbXVsdGlwYXJ0DQorDQorQSBtZXNzYWdlIGNvbnRhaW5pbmcgb3RoZXIgbWVzc2FnZXMuDQorQzxtdWx0aXBhcnQvbWl4ZWQ+LCBDPG11bHRpcGFydC9hbHRlcm5hdGl2ZT4uLi4NCisNCis9aXRlbSB0ZXh0DQorDQorVGV4dHVhbCBkYXRhLCBtZWFudCBmb3IgaHVtYW5zIHRvIHJlYWQuDQorQzx0ZXh0L3BsYWluPiwgQzx0ZXh0L2h0bWw+Li4uDQorDQorPWl0ZW0gdmlkZW8NCisNCitWaWRlbyBvciB2aWRlbythdWRpbyBkYXRhLg0KK0M8dmlkZW8vbXBlZz4uLi4NCisNCis9YmFjaw0KKw0KKw0KKz1oZWFkMiBDb250ZW50IHRyYW5zZmVyIGVuY29kaW5ncw0KKw0KK1RoZSAiRW5jb2RpbmciIHBhcmFtZXRlciBvZiBDPGJ1aWxkKCk+Lg0KK1RoaXMgaXMgaG93IHRoZSBtZXNzYWdlIGJvZHkgaXMgcGFja2FnZWQgdXAgZm9yIHNhZmUgdHJhbnNpdC4NCisNCitIZXJlIGFyZSB0aGUgNSBtYWpvciBNSU1FIGVuY29kaW5ncy4NCitBIG1vcmUtY29tcHJlaGVuc2l2ZSBsaXN0aW5nIG1heSBiZSBmb3VuZCBpbiBSRkMtMjA0NS4NCisNCis9b3ZlciA0DQorDQorPWl0ZW0gN2JpdA0KKw0KK0Jhc2ljYWxseSwgbm8gSTxyZWFsPiBlbmNvZGluZyBpcyBkb25lLiAgSG93ZXZlciwgdGhpcyBsYWJlbCBndWFyYW50ZWVzIHRoYXQgbm8NCis4LWJpdCBjaGFyYWN0ZXJzIGFyZSBwcmVzZW50LCBhbmQgdGhhdCBsaW5lcyBkbyBub3QgZXhjZWVkIDEwMDAgY2hhcmFjdGVycw0KK2luIGxlbmd0aC4NCisNCis9aXRlbSA4Yml0DQorDQorQmFzaWNhbGx5LCBubyBJPHJlYWw+IGVuY29kaW5nIGlzIGRvbmUuICBUaGUgbWVzc2FnZSBtaWdodCBjb250YWluIDgtYml0DQorY2hhcmFjdGVycywgYnV0IHRoaXMgZW5jb2RpbmcgZ3VhcmFudGVlcyB0aGF0IGxpbmVzIGRvIG5vdCBleGNlZWQgMTAwMA0KK2NoYXJhY3RlcnMgaW4gbGVuZ3RoLg0KKw0KKz1pdGVtIGJpbmFyeQ0KKw0KK05vIGVuY29kaW5nIGlzIGRvbmUgYXQgYWxsLiAgTWVzc2FnZSBtaWdodCBjb250YWluIDgtYml0IGNoYXJhY3RlcnMsDQorYW5kIGxpbmVzIG1pZ2h0IGJlIGxvbmdlciB0aGFuIDEwMDAgY2hhcmFjdGVycyBsb25nLg0KKw0KK1RoZSBtb3N0IGxpYmVyYWwsIGFuZCB0aGUgbGVhc3QgbGlrZWx5IHRvIGdldCB0aHJvdWdoIG1haWwgZ2F0ZXdheXMuDQorVXNlIHNwYXJpbmdseSwgb3IgKGJldHRlciB5ZXQpIG5vdCBhdCBhbGwuDQorDQorPWl0ZW0gYmFzZTY0DQorDQorTGlrZSAidXVlbmNvZGUiLCBidXQgdmVyeSB3ZWxsLWRlZmluZWQuICBUaGlzIGlzIGhvdyB5b3Ugc2hvdWxkIHNlbmQNCitlc3NlbnRpYWxseSBiaW5hcnkgaW5mb3JtYXRpb24gKHRhciBmaWxlcywgR0lGcywgSlBFR3MsIGV0Yy4pLg0KKw0KKz1pdGVtIHF1b3RlZC1wcmludGFibGUNCisNCitVc2VmdWwgZm9yIGVuY29kaW5nIG1lc3NhZ2VzIHdoaWNoIGFyZSB0ZXh0dWFsIGluIG5hdHVyZSwgeWV0IHdoaWNoIGNvbnRhaW4NCitub24tQVNDSUkgY2hhcmFjdGVycyAoZS5nLiwgTGF0aW4tMSwgTGF0aW4tMiwgb3IgYW55IG90aGVyIDgtYml0IGFscGhhYmV0KS4NCisNCis9YmFjaw0KKw0KKz1jdXQNCisNCis9YmVnaW4gRk9SX1JFQURNRV9PTkxZDQorDQorPWhlYWQxIElOU1RBTExBVElPTg0KKw0KK0luc3RhbGwgdXNpbmcNCisNCisgIHBlcmwgbWFrZWZpbGUucGwNCisgIG1ha2UgdGVzdA0KKyAgbWFrZSBpbnN0YWxsDQorDQorQWRqdXN0IHRoZSBtYWtlIGNvbW1hbmQgYXMgaXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgT1MuDQorJ25tYWtlJyBpcyB0aGUgdXN1YWwgbmFtZSB1bmRlciBXaW4zMg0KKw0KK0luIG9yZGVyIHRvIHJlYWQgdGhlIGRvY21lbnRhdGlvbiBwbGVhc2UgdXNlDQorDQorICBwZXJsZG9jIE1JTUU6OkxpdGUNCisNCitmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IgdmlzaXQNCisNCisgIGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc2VhcmNoP3F1ZXJ5PU1JTUUlM0ElM0FMaXRlJm1vZGU9YWxsDQorDQorZm9yIGEgbGlzdCBvZiBhbGwgTUlNRTo6TGl0ZSByZWxhdGVkIG1hdGVyaWFscyBpbmNsdWRpbmcgdGhlDQorZG9jdW1lbnRhdGlvbiBpbiBIVE1MIG9mIGFsbCBvZiB0aGUgcmVsZWFzZWQgdmVyc2lvbnMgb2YNCitNSU1FOjpMaXRlLg0KKw0KKz1jdXQNCisNCis9ZW5kIEZPUl9SRUFETUVfT05MWQ0KKw0KKz1jdXQNCisNCis9aGVhZDEgSEVMUEVSIE1PRFVMRVMNCisNCitNSU1FOjpMaXRlIHdvcmtzIG5pY2VseSB3aXRoIG90aGVyIGNlcnRhaW4gb3RoZXIgbW9kdWxlcyBpZiB0aGV5IGFyZSBwcmVzZW50Lg0KK0dvb2QgdG8gaGF2ZSBpbnN0YWxsZWQgaXMgdGhlIGxhdGVzdCBMPE1JTUU6OlR5cGVzfE1JTUU6OlR5cGVzPiwNCitMPE1haWw6OkFkZHJlc3N8TWFpbDo6QWRkcmVzcz4sIEw8TUlNRTo6QmFzZTY0fE1JTUU6OkJhc2U2ND4sDQorTDxNSU1FOjpRdW90ZWRQcmludHxNSU1FOjpRdW90ZWRQcmludD4uDQorDQorSWYgdGhleSBhcmVuJ3QgcHJlc2VudCB0aGVuIHNvbWUgZnVuY3Rpb25hbGl0eSB3b24ndCB3b3JrLCBhbmQgb3RoZXIgZmVhdHVyZXMNCit3b250IGJlIGFzIGVmZmljaWVudCBvciB1cCB0byBkYXRlIGFzIHRoZXkgY291bGQgYmUuIE5ldmVydGhlbGVzcyB0aGV5IGFyZSBvcHRpb25hbA0KK2V4dHJhcy4NCisNCis9aGVhZDEgQlVORExFRCBHT09ESUVTDQorDQorTUlNRTo6TGl0ZSBjb21lcyB3aXRoIGEgbnVtYmVyIG9mIGV4dHJhIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24gYnVuZGxlLg0KK1RoaXMgaW5jbHVkZXMgZXhhbXBsZXMsIGFuZCB1dGlsaXR5IG1vZHVsZXMgdGhhdCB5b3UgY2FuIHVzZSB0byBnZXQgeW91cnNlbGYNCitzdGFydGVkIHdpdGggdGhlIG1vZHVsZS4NCisNCitUaGUgLi9leGFtcGxlcyBkaXJlY3RvcnkgY29udGFpbnMgYSBudW1iZXIgb2Ygc25pcHBldHMgaW4gcHJlcGFyZWQNCitmb3JtLCBnZW5lcmFsbHkgdGhleSBhcmUgZG9jdW1lbnRlZCwgYnV0IHRoZXkgc2hvdWxkIGJlIGVhc3kgdG8gdW5kZXJzdGFuZC4NCisNCitUaGUgLi9jb250cmliIGRpcmVjdG9yeSBjb250YWlucyBhIGNvbXBhbmlvbi90b29sIG1vZHVsZXMgdGhhdCBjb21lIGJ1bmRsZWQNCit3aXRoIE1JTUU6OkxpdGUsIHRoZXkgZG9udCBnZXQgaW5zdGFsbGVkIGJ5IGRlZmF1bHQuIFBsZWFzZSByZXZpZXcgdGhlIFBPRCB0aGV5DQorY29tZSB3aXRoLg0KKw0KKz1oZWFkMSBCVUdTDQorDQorVGhlIHdob2xlIHJlYXNvbiB0aGF0IHZlcnNpb24gMy4wIHdhcyByZWxlYXNlZCB3YXMgdG8gZW5zdXJlIHRoYXQgTUlNRTo6TGl0ZQ0KK2lzIHVwIHRvIGRhdGUgYW5kIHBhdGNoZWQuIElmIHlvdSBmaW5kIGFuIGlzc3VlIHBsZWFzZSByZXBvcnQgaXQuDQorDQorQXMgZmFyIGFzIEkga25vdyBNSU1FOjpMaXRlIGRvZXNudCBjdXJyZW50bHkgaGF2ZSBhbnkgc2VyaW91cyBidWdzLCBidXQgbXkgdXNhZ2UNCitpcyBoYXJkbHkgY29tcHJlaGVuc2l2ZS4NCisNCitIYXZpbmcgc2FpZCB0aGF0IHRoZXJlIGFyZSBhIG51bWJlciBvZiBvcGVuIGlzc3VlcyBmb3IgbWUsIG1vc3RseSBjYXVzZWQgYnkgdGhlIHByb2dyZXNzDQoraW4gdGhlIGNvbW11bml0eSBhcyB3aG9sZSBzaW5jZSBFcnlxIGxhc3QgcmVsZWFzZWQuIFRoZSB0ZXN0cyBhcmUgYmFzZWQgYXJvdW5kIGFuDQoraW50ZXJlc3RpbmcgYnV0IG5vbiBzdGFuZGFyZCB0ZXN0IGZyYW1ld29yay4gSSdkIGxpa2UgdG8gY2hhbmdlIGl0IG92ZXIgdG8gdXNpbmcNCitUZXN0OjpNb3JlLg0KKw0KK1Nob3VsZCB0ZXN0cyBmYWlsIHBsZWFzZSByZXZpZXcgdGhlIC4vdGVzdG91dCBkaXJlY3RvcnksIGFuZCBpbiBhbnkgYnVnIHJlcG9ydHMNCitwbGVhc2UgaW5jbHVkZSB0aGUgb3V0cHV0IG9mIHRoZSByZWxldmVudCBmaWxlLiBUaGlzIGlzIHRoZSBvbmx5IHJlZGVlbWluZyBmZWF0dXJlDQorb2Ygbm90IHVzaW5nIFRlc3Q6Ok1vcmUgdGhhdCBJIGNhbiBzZWUuDQorDQorQnVnIGZpeGVzIC8gUGF0Y2hlcyAvIENvbnRyaWJ1dGlvbiBhcmUgd2VsY29tZSwgaG93ZXZlciBJIHByb2JhYmx5IHdvbid0IGFwcGx5IHRoZW0NCit1bmxlc3MgdGhleSBhbHNvIGhhdmUgYW4gYXNzb2NpYXRlZCB0ZXN0LiBUaGlzIG1lYW5zIHRoYXQgaWYgSSBkb250IGhhdmUgdGhlIHRpbWUgdG8NCit3cml0ZSB0aGUgdGVzdCB0aGUgcGF0Y2ggd29udCBnZXQgYXBwbGllZCwgc28gcGxlYXNlLCBpbmNsdWRlIHRlc3RzIGZvciBhbnkgcGF0Y2hlcw0KK3lvdSBwcm92aWRlLg0KKw0KKz1oZWFkMSBWRVJTSU9ODQorDQorVmVyc2lvbjogMy4wMSAoTWFpbnRlbmFuY2UgcmVsZWFzZSBhbmQgYSBuZXcgY2FyZXRha2VyISkNCisNCis9aGVhZDEgQ0hBTkdFIExPRw0KKw0KK01vdmVkIHRvIC4vY2hhbmdlcy5wb2QNCisNCis9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMNCisNCisgIENvcHlyaWdodCAoYykgMTk5NyBieSBFcnlxLg0KKyAgQ29weXJpZ2h0IChjKSAxOTk4IGJ5IFplZUdlZSBTb2Z0d2FyZSBJbmMuDQorICBDb3B5cmlnaHQgKGMpIDIwMDMgWXZlcyBPcnRvbi4gZGVtZXJwaHEgKGF0KSBob3RtYWlsLmNvbS4NCisNCitBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4NCityZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsDQoraXRzZWxmLg0KKw0KK1RoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBCPE5PIFdBUlJBTlRZPiBvZiBhbnkga2luZC4NCitTZWUgdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBkZXRhaWxzLg0KKw0KKz1oZWFkMSBOVVRSSVRJT05BTCBJTkZPUk1BVElPTg0KKw0KK0ZvciBzb21lIHJlYXNvbiwgdGhlIFVTIEZEQSBzYXlzIHRoYXQgdGhpcyBpcyBub3cgcmVxdWlyZWQgYnkgbGF3DQorb24gYW55IHByb2R1Y3RzIHRoYXQgYmVhciB0aGUgbmFtZSAiTGl0ZSIuLi4NCisNCitWZXJzaW9uIDMuMCBpcyBub3cgbmV3IGFuZCBpbXByb3ZlZCEgVGhlIGRpc3RyaWJ1dGlvbiBpcyBub3cgMzAlIHNtYWxsZXIhDQorDQorICAgIE1JTUU6OkxpdGUgICAgICAgICAgICAgICAgfA0KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgICAgU2VydmluZyBzaXplOiAgICAgICAgICAgICB8IDEgbW9kdWxlDQorICAgIFNlcnZpbmdzIHBlciBjb250YWluZXI6ICAgfCAxDQorICAgIENhbG9yaWVzOiAgICAgICAgICAgICAgICAgfCAwDQorICAgIEZhdDogICAgICAgICAgICAgICAgICAgICAgfCAwZw0KKyAgICAgIFNhdHVyYXRlZCBGYXQ6ICAgICAgICAgIHwgMGcNCisNCitXYXJuaW5nOiBmb3IgY29uc3VtcHRpb24gYnkgaGFyZHdhcmUgb25seSEgIE1heSBwcm9kdWNlDQoraW5kaWdlc3Rpb24gaW4gaHVtYW5zIGlmIHRha2VuIGludGVybmFsbHkuDQorDQorPWhlYWQxIEFVVEhPUg0KKw0KK0VyeXEgKEY8ZXJ5cUB6ZWVnZWUuY29tPikuDQorUHJlc2lkZW50LCBaZWVHZWUgU29mdHdhcmUgSW5jLiAoRjxodHRwOi8vd3d3LnplZWdlZS5jb20+KS4NCisNCitHbyB0byBGPGh0dHA6Ly93d3cuemVlZ2VlLmNvbT4gZm9yIHRoZSBsYXRlc3QgZG93bmxvYWRzDQorYW5kIG9uLWxpbmUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBtb2R1bGUuICBFbmpveS4NCisNCitQYXRjaGVzIEFuZCBNYWludGVuYW5jZSBieSBZdmVzIE9ydG9uIGRlbWVycGhxQGhvdG1haWwuY29tIGFuZCBtYW55IG90aGVycy4gQ29uc3VsdA0KKy4vY2hhbmdlcy5wb2QNCisNCis9Y3V0DQorDQpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvT0xFL1N0b3JhZ2VfTGl0ZS5wbSBiL21jdS90b29scy9wZXJsL09MRS9TdG9yYWdlX0xpdGUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhMmE1NwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL09MRS9TdG9yYWdlX0xpdGUucG0KQEAgLTAsMCArMSwxNjg2IEBACisjIE9MRTo6U3RvcmFnZV9MaXRlDQorIyAgYnkgS2F3YWksIFRha2Fub3JpIChIaXBwbzIwMDApIDIwMDAuMTEuNCwgOCwgMTQNCisjIFRoaXMgUHJvZ3JhbSBpcyBTdGlsbCBBTFBIQSB2ZXJzaW9uLg0KKyMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisjIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFMgT2JqZWN0DQorIy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFMNCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorcGFja2FnZSBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOw0KK3JlcXVpcmUgRXhwb3J0ZXI7DQordXNlIHN0cmljdDsNCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsNCitASVNBID0gcXcoRXhwb3J0ZXIpOw0KKyRWRVJTSU9OID0gJzAuMTknOw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIG5ldyAoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUykNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIG5ldyAoJCQkJCQkJCQkJDskJCkgew0KKyMxLiBDb25zdHJ1Y3RvciBmb3IgR2VuZXJhbCBVc2FnZQ0KKyAgbXkoJHNDbGFzcywgJGlObywgJHNObSwgJGlUeXBlLCAkaVByZXYsICRpTmV4dCwgJGlEaXIsDQorICAgICAkcmFUaW1lMXN0LCAkcmFUaW1lMm5kLCAkaVN0YXJ0LCAkaVNpemUsICRzRGF0YSwgJHJhQ2hpbGQpID0gQF87DQorDQorICBpZigkaVR5cGUgPT0gT0xFOjpTdG9yYWdlX0xpdGU6OlBwc1R5cGVfRmlsZSgpKSB7ICNGSUxFDQorICAgIHJldHVybiBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpGaWxlLT5fbmV3DQorICAgICAgICAoJGlObywgJHNObSwgJGlUeXBlLCAkaVByZXYsICRpTmV4dCwgJGlEaXIsICRyYVRpbWUxc3QsICRyYVRpbWUybmQsDQorICAgICAgICAgJGlTdGFydCwgJGlTaXplLCAkc0RhdGEsICRyYUNoaWxkKTsNCisgIH0NCisgIGVsc2lmKCRpVHlwZSA9PSBPTEU6OlN0b3JhZ2VfTGl0ZTo6UHBzVHlwZV9EaXIoKSkgeyAjRElSRUNUUlkNCisgICAgcmV0dXJuIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OkRpci0+X25ldw0KKyAgICAgICAgKCRpTm8sICRzTm0sICRpVHlwZSwgJGlQcmV2LCAkaU5leHQsICRpRGlyLCAkcmFUaW1lMXN0LCAkcmFUaW1lMm5kLA0KKyAgICAgICAgICRpU3RhcnQsICRpU2l6ZSwgJHNEYXRhLCAkcmFDaGlsZCk7DQorICB9DQorICBlbHNpZigkaVR5cGUgPT0gT0xFOjpTdG9yYWdlX0xpdGU6OlBwc1R5cGVfUm9vdCgpKSB7ICNST09UDQorICAgIHJldHVybiBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpSb290LT5fbmV3DQorICAgICAgICAoJGlObywgJHNObSwgJGlUeXBlLCAkaVByZXYsICRpTmV4dCwgJGlEaXIsICRyYVRpbWUxc3QsICRyYVRpbWUybmQsDQorICAgICAgICAgJGlTdGFydCwgJGlTaXplLCAkc0RhdGEsICRyYUNoaWxkKTsNCisgIH0NCisgIGVsc2Ugew0KKyAgICBkaWUgIkVycm9yIFBQUzokaVR5cGUgJHNObVxuIjsNCisgIH0NCit9DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgX25ldyAoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUykNCisjICAgZm9yIE9MRTo6U3RvcmFnZV9MaXRlDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3N1YiBfbmV3ICgkJCQkJCQkJCQkJDskJCkgew0KKyAgbXkoJHNDbGFzcywgJGlObywgJHNObSwgJGlUeXBlLCAkaVByZXYsICRpTmV4dCwgJGlEaXIsDQorICAgICAgICAkcmFUaW1lMXN0LCAkcmFUaW1lMm5kLCAkaVN0YXJ0LCAkaVNpemUsICRzRGF0YSwgJHJhQ2hpbGQpID0gQF87DQorIzEuIENvbnN0cnVjdG9yIGZvciBPTEU6OlN0b3JhZ2VfTGl0ZQ0KKyAgbXkgJG9UaGlzID0gew0KKyAgICBObyAgID0+ICRpTm8sDQorICAgIE5hbWUgPT4gJHNObSwNCisgICAgVHlwZSA9PiAkaVR5cGUsDQorICAgIFByZXZQcHMgPT4gJGlQcmV2LA0KKyAgICBOZXh0UHBzID0+ICRpTmV4dCwNCisgICAgRGlyUHBzID0+ICRpRGlyLA0KKyAgICBUaW1lMXN0ID0+ICRyYVRpbWUxc3QsDQorICAgIFRpbWUybmQgPT4gJHJhVGltZTJuZCwNCisgICAgU3RhcnRCbG9jayA9PiAkaVN0YXJ0LA0KKyAgICBTaXplICAgICAgID0+ICRpU2l6ZSwNCisgICAgRGF0YSAgICAgICA9PiAkc0RhdGEsDQorICAgIENoaWxkICAgICAgPT4gJHJhQ2hpbGQsDQorICB9Ow0KKyAgYmxlc3MgJG9UaGlzLCAkc0NsYXNzOw0KKyAgcmV0dXJuICRvVGhpczsNCit9DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgX0RhdGFMZW4gKE9MRTo6U3RvcmFnZV9MaXRlOjpQUFMpDQorIyBDaGVjayBmb3IgdXBkYXRlDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3N1YiBfRGF0YUxlbigkKSB7DQorICAgIG15KCRvU2VsZikgPUBfOw0KKyAgICByZXR1cm4gMCB1bmxlc3MoZGVmaW5lZCgkb1NlbGYtPntEYXRhfSkpOw0KKyAgICByZXR1cm4gKCRvU2VsZi0+e19QUFNfRklMRX0pPw0KKyAgICAgICAgKCRvU2VsZi0+e19QUFNfRklMRX0tPnN0YXQoKSlbN10gOiBsZW5ndGgoJG9TZWxmLT57RGF0YX0pOw0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBfbWFrZVNtYWxsRGF0YSAoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUykNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9tYWtlU21hbGxEYXRhKCQkJCkgew0KKyAgbXkoJG9UaGlzLCAkYUxpc3QsICRyaEluZm8pID0gQF87DQorICBteSAoJHNSZXMpOw0KKyAgbXkgJEZJTEUgPSAkcmhJbmZvLT57X0ZJTEVIX307DQorICBteSAkaVNtQmxrID0gMDsNCisNCisgIGZvcmVhY2ggbXkgJG9QcHMgKEAkYUxpc3QpIHsNCisjMS4gTWFrZSBTQkQsIHNtYWxsIGRhdGEgc3RyaW5nDQorICBpZigkb1Bwcy0+e1R5cGV9PT1PTEU6OlN0b3JhZ2VfTGl0ZTo6UHBzVHlwZV9GaWxlKCkpIHsNCisgICAgbmV4dCBpZigkb1Bwcy0+e1NpemV9PD0wKTsNCisgICAgaWYoJG9QcHMtPntTaXplfSA8ICRyaEluZm8tPntfU01BTExfU0laRX0pIHsNCisgICAgICBteSAkaVNtYkNudCA9IGludCgkb1Bwcy0+e1NpemV9IC8gJHJoSW5mby0+e19TTUFMTF9CTE9DS19TSVpFfSkNCisgICAgICAgICAgICAgICAgICAgICsgKCgkb1Bwcy0+e1NpemV9ICUgJHJoSW5mby0+e19TTUFMTF9CTE9DS19TSVpFfSk/IDE6IDApOw0KKyAgICAgICMxLjEgQWRkIHRvIFNCRA0KKyAgICAgIGZvciAobXkgJGkgPSAwOyAkaTwoJGlTbWJDbnQtMSk7ICRpKyspIHsNCisgICAgICAgICAgICBwcmludCB7JEZJTEV9IChwYWNrKCJWIiwgJGkrJGlTbUJsaysxKSk7DQorICAgICAgfQ0KKyAgICAgIHByaW50IHskRklMRX0gKHBhY2soIlYiLCAtMikpOw0KKw0KKyAgICAgICMxLjIgQWRkIHRvIERhdGEgU3RyaW5nKHRoaXMgd2lsbCBiZSB3cml0dGVuIGZvciBSb290RW50cnkpDQorICAgICAgI0NoZWNrIGZvciB1cGRhdGUNCisgICAgICBpZigkb1Bwcy0+e19QUFNfRklMRX0pIHsNCisgICAgICAgIG15ICRzQnVmZjsNCisgICAgICAgICRvUHBzLT57X1BQU19GSUxFfS0+c2VlaygwLCAwKTsgI1RvIFRoZSBUb3ANCisgICAgICAgIHdoaWxlKCRvUHBzLT57X1BQU19GSUxFfS0+cmVhZCgkc0J1ZmYsIDQwOTYpKSB7DQorICAgICAgICAgICAgJHNSZXMgLj0gJHNCdWZmOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBlbHNlIHsNCisgICAgICAgICRzUmVzIC49ICRvUHBzLT57RGF0YX07DQorICAgICAgfQ0KKyAgICAgICRzUmVzIC49ICgiXHgwMCIgeA0KKyAgICAgICAgKCRyaEluZm8tPntfU01BTExfQkxPQ0tfU0laRX0gLSAoJG9QcHMtPntTaXplfSUgJHJoSW5mby0+e19TTUFMTF9CTE9DS19TSVpFfSkpKQ0KKyAgICAgICAgaWYoJG9QcHMtPntTaXplfSUgJHJoSW5mby0+e19TTUFMTF9CTE9DS19TSVpFfSk7DQorICAgICAgIzEuMyBTZXQgZm9yIFBQUw0KKyAgICAgICRvUHBzLT57U3RhcnRCbG9ja30gPSAkaVNtQmxrOw0KKyAgICAgICRpU21CbGsgKz0gJGlTbWJDbnQ7DQorICAgIH0NCisgIH0NCisgIH0NCisgIG15ICRpU2JDbnQgPSBpbnQoJHJoSW5mby0+e19CSUdfQkxPQ0tfU0laRX0vIE9MRTo6U3RvcmFnZV9MaXRlOjpMb25nSW50U2l6ZSgpKTsNCisgIHByaW50IHskRklMRX0gKHBhY2soIlYiLCAtMSkgeCAoJGlTYkNudCAtICgkaVNtQmxrICUgJGlTYkNudCkpKQ0KKyAgICBpZigkaVNtQmxrICAlICRpU2JDbnQpOw0KKyMyLiBXcml0ZSBTQkQgd2l0aCBhZGp1c3RpbmcgbGVuZ3RoIGZvciBibG9jaw0KKyAgcmV0dXJuICRzUmVzOw0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBfc2F2ZVBwc1drIChPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTKQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgX3NhdmVQcHNXaygkJCkNCit7DQorICBteSgkb1RoaXMsICRyaEluZm8pID0gQF87DQorIzEuIFdyaXRlIFBQUw0KKyAgbXkgJEZJTEUgPSAkcmhJbmZvLT57X0ZJTEVIX307DQorICBwcmludCB7JEZJTEV9ICgNCisgICAgICAgICAgICAkb1RoaXMtPntOYW1lfQ0KKyAgICAgICAgICAgIC4gKCJceDAwIiB4ICg2NCAtIGxlbmd0aCgkb1RoaXMtPntOYW1lfSkpKSAgIzY0DQorICAgICAgICAgICAgLCBwYWNrKCJ2IiwgbGVuZ3RoKCRvVGhpcy0+e05hbWV9KSArIDIpICAgICAjNjYNCisgICAgICAgICAgICAsIHBhY2soImMiLCAkb1RoaXMtPntUeXBlfSkgICAgICAgICAjNjcNCisgICAgICAgICAgICAsIHBhY2soImMiLCAweDAwKSAjVUsgICAgICAgICAgICAgICAjNjgNCisgICAgICAgICAgICAsIHBhY2soIlYiLCAkb1RoaXMtPntQcmV2UHBzfSkgI1ByZXYgICAgICAgICM3Mg0KKyAgICAgICAgICAgICwgcGFjaygiViIsICRvVGhpcy0+e05leHRQcHN9KSAjTmV4dCAgICAgICAgIzc2DQorICAgICAgICAgICAgLCBwYWNrKCJWIiwgJG9UaGlzLT57RGlyUHBzfSkgICNEaXIgICAgICM4MA0KKyAgICAgICAgICAgICwgIlx4MDBceDA5XHgwMlx4MDAiICAgICAgICAgICAgICAgICM4NA0KKyAgICAgICAgICAgICwgIlx4MDBceDAwXHgwMFx4MDAiICAgICAgICAgICAgICAgICM4OA0KKyAgICAgICAgICAgICwgIlx4YzBceDAwXHgwMFx4MDAiICAgICAgICAgICAgICAgICM5Mg0KKyAgICAgICAgICAgICwgIlx4MDBceDAwXHgwMFx4NDYiICAgICAgICAgICAgICAgICM5Ng0KKyAgICAgICAgICAgICwgIlx4MDBceDAwXHgwMFx4MDAiICAgICAgICAgICAgICAgICMxMDANCisgICAgICAgICAgICAsIE9MRTo6U3RvcmFnZV9MaXRlOjpMb2NhbERhdGUyT0xFKCRvVGhpcy0+e1RpbWUxc3R9KSAgICAgICAjMTA4DQorICAgICAgICAgICAgLCBPTEU6OlN0b3JhZ2VfTGl0ZTo6TG9jYWxEYXRlMk9MRSgkb1RoaXMtPntUaW1lMm5kfSkgICAgICAgIzExNg0KKyAgICAgICAgICAgICwgcGFjaygiViIsIGRlZmluZWQoJG9UaGlzLT57U3RhcnRCbG9ja30pPw0KKyAgICAgICAgICAgICAgICAgICAgICAkb1RoaXMtPntTdGFydEJsb2NrfTowKSAgICAgICAjMTE2DQorICAgICAgICAgICAgLCBwYWNrKCJWIiwgZGVmaW5lZCgkb1RoaXMtPntTaXplfSk/DQorICAgICAgICAgICAgICAgICAkb1RoaXMtPntTaXplfSA6IDApICAgICAgICAgICAgIzEyNA0KKyAgICAgICAgICAgICwgcGFjaygiViIsIDApLCAgICAgICAgICAgICAgICAgICMxMjgNCisgICAgICAgICk7DQorfQ0KKw0KKyMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisjIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OlJvb3QgT2JqZWN0DQorIy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OlJvb3QNCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorcGFja2FnZSBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpSb290Ow0KK3JlcXVpcmUgRXhwb3J0ZXI7DQordXNlIHN0cmljdDsNCit1c2UgSU86OkZpbGU7DQordXNlIElPOjpIYW5kbGU7DQordXNlIEZjbnRsOw0KK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOw0KK0BJU0EgPSBxdyhPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTIEV4cG9ydGVyKTsNCiskVkVSU0lPTiA9ICcwLjE5JzsNCitzdWIgX3NhdmVQcHNTZXRQbnQoJCQkKTsNCitzdWIgX3NhdmVQcHNTZXRQbnQyKCQkJCk7DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgbmV3IChPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpSb290KQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgbmV3ICgkOyQkJCkgew0KKyAgICBteSgkc0NsYXNzLCAkcmFUaW1lMXN0LCAkcmFUaW1lMm5kLCAkcmFDaGlsZCkgPSBAXzsNCisgICAgT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6X25ldygNCisgICAgICAgICRzQ2xhc3MsDQorICAgICAgICB1bmRlZiwNCisgICAgICAgIE9MRTo6U3RvcmFnZV9MaXRlOjpBc2MyVWNzKCdSb290IEVudHJ5JyksDQorICAgICAgICA1LA0KKyAgICAgICAgdW5kZWYsDQorICAgICAgICB1bmRlZiwNCisgICAgICAgIHVuZGVmLA0KKyAgICAgICAgJHJhVGltZTFzdCwNCisgICAgICAgICRyYVRpbWUybmQsDQorICAgICAgICB1bmRlZiwNCisgICAgICAgIHVuZGVmLA0KKyAgICAgICAgdW5kZWYsDQorICAgICAgICAkcmFDaGlsZCk7DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIHNhdmUgKE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OlJvb3QpDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3N1YiBzYXZlKCQkOyQkKSB7DQorICBteSgkb1RoaXMsICRzRmlsZSwgJGJOb0FzLCAkcmhJbmZvKSA9IEBfOw0KKyAgIzAuSW5pdGlhbCBTZXR0aW5nIGZvciBzYXZpbmcNCisgICRyaEluZm8gPSB7fSB1bmxlc3MoJHJoSW5mbyk7DQorICAkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfSAgPSAyKioNCisgICAgICAgICAgICAgICAgKCgkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfSk/DQorICAgICAgICAgICAgICAgICAgICBfYWRqdXN0MigkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfSkgIDogOSk7DQorICAkcmhJbmZvLT57X1NNQUxMX0JMT0NLX1NJWkV9PSAyICoqDQorICAgICAgICAgICAgICAgICgoJHJoSW5mby0+e19TTUFMTF9CTE9DS19TSVpFfSk/DQorICAgICAgICAgICAgICAgICAgICBfYWRqdXN0MigkcmhJbmZvLT57X1NNQUxMX0JMT0NLX1NJWkV9KTogNik7DQorICAkcmhJbmZvLT57X1NNQUxMX1NJWkV9ID0gMHgxMDAwOw0KKyAgJHJoSW5mby0+e19QUFNfU0laRX0gPSAweDgwOw0KKw0KKyAgbXkgJGNsb3NlRmlsZSA9IDE7DQorDQorICAjMS5PcGVuIEZpbGUNCisgICMxLjEgJHNGaWxlIGlzIFJlZiBvZiBzY2FsYXINCisgIGlmKHJlZigkc0ZpbGUpIGVxICdTQ0FMQVInKSB7DQorICAgIHJlcXVpcmUgSU86OlNjYWxhcjsNCisgICAgbXkgJG9JbyA9IG5ldyBJTzo6U2NhbGFyICRzRmlsZSwgT19XUk9OTFk7DQorICAgICRyaEluZm8tPntfRklMRUhffSA9ICRvSW87DQorICB9DQorICAjMS4xLjEgJHNGaWxlIGlzIGEgSU86OlNjYWxhciBvYmplY3QNCisgICMgTm93IGhhbmRsZWQgYXMgYSBmaWxlaGFuZGxlIHJlZiBiZWxvdy4NCisNCisgICMxLjIgJHNGaWxlIGlzIGEgSU86OkhhbmRsZSBvYmplY3QNCisgIGVsc2lmKFVOSVZFUlNBTDo6aXNhKCRzRmlsZSwgJ0lPOjpIYW5kbGUnKSkgew0KKyAgICAjIE5vdCBhbGwgZmlsZWhhbmRsZXMgc3VwcG9ydCBiaW5tb2RlKCkgc28gdHJ5IGl0IGluIGFuIGV2YWwuDQorICAgIGV2YWx7IGJpbm1vZGUgJHNGaWxlIH07DQorICAgICRyaEluZm8tPntfRklMRUhffSA9ICRzRmlsZTsNCisgIH0NCisgICMxLjMgJHNGaWxlIGlzIGEgc2ltcGxlIGZpbGVuYW1lIHN0cmluZw0KKyAgZWxzaWYoIXJlZigkc0ZpbGUpKSB7DQorICAgIGlmKCRzRmlsZSBuZSAnLScpIHsNCisgICAgICAgIG15ICRvSW8gPSBuZXcgSU86OkZpbGU7DQorICAgICAgICAkb0lvLT5vcGVuKCI+JHNGaWxlIikgfHwgcmV0dXJuIHVuZGVmOw0KKyAgICAgICAgYmlubW9kZSgkb0lvKTsNCisgICAgICAgICRyaEluZm8tPntfRklMRUhffSA9ICRvSW87DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgICBteSAkb0lvID0gbmV3IElPOjpIYW5kbGU7DQorICAgICAgICAkb0lvLT5mZG9wZW4oZmlsZW5vKFNURE9VVCksInciKSB8fCByZXR1cm4gdW5kZWY7DQorICAgICAgICBiaW5tb2RlKCRvSW8pOw0KKyAgICAgICAgJHJoSW5mby0+e19GSUxFSF99ID0gJG9JbzsNCisgICAgfQ0KKyAgfQ0KKyAgIzEuNCBBc3N1bWUgdGhhdCBpZiAkc0ZpbGUgaXMgYSByZWYgdGhlbiBpdCBpcyBhIHZhbGlkIGZpbGVoYW5kbGUNCisgIGVsc2Ugew0KKyAgICAjIE5vdCBhbGwgZmlsZWhhbmRsZXMgc3VwcG9ydCBiaW5tb2RlKCkgc28gdHJ5IGl0IGluIGFuIGV2YWwuDQorICAgIGV2YWx7IGJpbm1vZGUgJHNGaWxlIH07DQorICAgICRyaEluZm8tPntfRklMRUhffSA9ICRzRmlsZTsNCisgICAgIyBDYWxsZXIgY29udHJvbHMgZmlsZWhhbmRsZSBjbG9zaW5nDQorICAgICRjbG9zZUZpbGUgPSAwOw0KKyAgfQ0KKw0KKyAgbXkgJGlCbGsgPSAwOw0KKyAgIzEuIE1ha2UgYW4gYXJyYXkgb2YgUFBTIChmb3IgU2F2ZSkNCisgIG15IEBhTGlzdD0oKTsNCisgIGlmKCRiTm9Bcykgew0KKyAgICBfc2F2ZVBwc1NldFBudDIoWyRvVGhpc10sIFxAYUxpc3QsICRyaEluZm8pOw0KKyAgfQ0KKyAgZWxzZSB7DQorICAgIF9zYXZlUHBzU2V0UG50KFskb1RoaXNdLCBcQGFMaXN0LCAkcmhJbmZvKTsNCisgIH0NCisgIG15ICgkaVNCRGNudCwgJGlCQmNudCwgJGlQUFNjbnQpID0gJG9UaGlzLT5fY2FsY1NpemUoXEBhTGlzdCwgJHJoSW5mbyk7DQorDQorICAjMi5TYXZlIEhlYWRlcg0KKyAgJG9UaGlzLT5fc2F2ZUhlYWRlcigkcmhJbmZvLCAkaVNCRGNudCwgJGlCQmNudCwgJGlQUFNjbnQpOw0KKw0KKyAgIzMuTWFrZSBTbWFsbCBEYXRhIHN0cmluZyAod3JpdGUgU0JEKQ0KKyAgbXkgJHNTbVdrID0gJG9UaGlzLT5fbWFrZVNtYWxsRGF0YShcQGFMaXN0LCAkcmhJbmZvKTsNCisgICRvVGhpcy0+e0RhdGF9ID0gJHNTbVdrOyAgI1NtYWxsIERhdGFzIGJlY29tZSBSb290RW50cnkgRGF0YQ0KKw0KKyAgIzQuIFdyaXRlIEJCDQorICBteSAkaUJCbGsgPSAkaVNCRGNudDsNCisgICRvVGhpcy0+X3NhdmVCaWdEYXRhKFwkaUJCbGssIFxAYUxpc3QsICRyaEluZm8pOw0KKw0KKyAgIzUuIFdyaXRlIFBQUw0KKyAgJG9UaGlzLT5fc2F2ZVBwcyhcQGFMaXN0LCAkcmhJbmZvKTsNCisNCisgICM2LiBXcml0ZSBCRCBhbmQgQkRMaXN0IGFuZCBBZGRpbmcgSGVhZGVyIGluZm9ybWF0aW9ucw0KKyAgJG9UaGlzLT5fc2F2ZUJiZCgkaVNCRGNudCwgJGlCQmNudCwgJGlQUFNjbnQsICAkcmhJbmZvKTsNCisNCisgICM3LkNsb3NlIEZpbGUNCisgIHJldHVybiAkcmhJbmZvLT57X0ZJTEVIX30tPmNsb3NlIGlmICRjbG9zZUZpbGU7DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9jYWxjU2l6ZSAoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUykNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9jYWxjU2l6ZSgkJCkNCit7DQorICBteSgkb1RoaXMsICRyYUxpc3QsICRyaEluZm8pID0gQF87DQorDQorIzAuIENhbGN1bGF0ZSBCYXNpYyBTZXR0aW5nDQorICBteSAoJGlTQkRjbnQsICRpQkJjbnQsICRpUFBTY250KSA9ICgwLDAsMCk7DQorICBteSAkaVNtYWxsTGVuID0gMDsNCisgIG15ICRpU0JjbnQgPSAwOw0KKyAgZm9yZWFjaCBteSAkb1BwcyAoQCRyYUxpc3QpIHsNCisgICAgICBpZigkb1Bwcy0+e1R5cGV9PT1PTEU6OlN0b3JhZ2VfTGl0ZTo6UHBzVHlwZV9GaWxlKCkpIHsNCisgICAgICAgICRvUHBzLT57U2l6ZX0gPSAkb1Bwcy0+X0RhdGFMZW4oKTsgICNNb2QNCisgICAgICAgIGlmKCRvUHBzLT57U2l6ZX0gPCAkcmhJbmZvLT57X1NNQUxMX1NJWkV9KSB7DQorICAgICAgICAgICRpU0JjbnQgKz0gaW50KCRvUHBzLT57U2l6ZX0gLyAkcmhJbmZvLT57X1NNQUxMX0JMT0NLX1NJWkV9KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKCRvUHBzLT57U2l6ZX0gJSAkcmhJbmZvLT57X1NNQUxMX0JMT0NLX1NJWkV9KT8gMTogMCk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgJGlCQmNudCArPQ0KKyAgICAgICAgICAgIChpbnQoJG9QcHMtPntTaXplfS8gJHJoSW5mby0+e19CSUdfQkxPQ0tfU0laRX0pICsNCisgICAgICAgICAgICAgICAgKCgkb1Bwcy0+e1NpemV9JSAkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfSk/IDE6IDApKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICB9DQorICAkaVNtYWxsTGVuID0gJGlTQmNudCAqICRyaEluZm8tPntfU01BTExfQkxPQ0tfU0laRX07DQorICBteSAkaVNsQ250ID0gaW50KCRyaEluZm8tPntfQklHX0JMT0NLX1NJWkV9LyBPTEU6OlN0b3JhZ2VfTGl0ZTo6TG9uZ0ludFNpemUoKSk7DQorICAkaVNCRGNudCA9IGludCgkaVNCY250IC8gJGlTbENudCkrICgoJGlTQmNudCAlICRpU2xDbnQpPyAxOjApOw0KKyAgJGlCQmNudCArPSAgKGludCgkaVNtYWxsTGVuLyAkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfSkgKw0KKyAgICAgICAgICAgICAgICAoKCAkaVNtYWxsTGVuJSAkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfSk/IDE6IDApKTsNCisgIG15ICRpQ250ID0gc2NhbGFyKEAkcmFMaXN0KTsNCisgIG15ICRpQmRDbnQgPSAkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfS9PTEU6OlN0b3JhZ2VfTGl0ZTo6UHBzU2l6ZSgpOw0KKyAgJGlQUFNjbnQgPSAoaW50KCRpQ250LyRpQmRDbnQpICsgKCgkaUNudCAlICRpQmRDbnQpPyAxOiAwKSk7DQorICByZXR1cm4gKCRpU0JEY250LCAkaUJCY250LCAkaVBQU2NudCk7DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9hZGp1c3QyIChPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpSb290KQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgX2FkanVzdDIoJCkgew0KKyAgbXkoJGkyKSA9IEBfOw0KKyAgbXkgJGlXazsNCisgICRpV2sgPSBsb2coJGkyKS9sb2coMik7DQorICByZXR1cm4gKCRpV2sgPiBpbnQoJGlXaykpPyBpbnQoJGlXaykrMTokaVdrOw0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBfc2F2ZUhlYWRlciAoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6Um9vdCkNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9zYXZlSGVhZGVyKCQkJCQkKSB7DQorICBteSgkb1RoaXMsICRyaEluZm8sICRpU0JEY250LCAkaUJCY250LCAkaVBQU2NudCkgPSBAXzsNCisgIG15ICRGSUxFID0gJHJoSW5mby0+e19GSUxFSF99Ow0KKw0KKyMwLiBDYWxjdWxhdGUgQmFzaWMgU2V0dGluZw0KKyAgbXkgJGlCbENudCA9ICRyaEluZm8tPntfQklHX0JMT0NLX1NJWkV9IC8gT0xFOjpTdG9yYWdlX0xpdGU6OkxvbmdJbnRTaXplKCk7DQorICBteSAkaTFzdEJkTCA9IGludCgoJHJoSW5mby0+e19CSUdfQkxPQ0tfU0laRX0gLSAweDRDKSAvIE9MRTo6U3RvcmFnZV9MaXRlOjpMb25nSW50U2l6ZSgpKTsNCisgIG15ICRpMXN0QmRNYXggPSAkaTFzdEJkTCAqICRpQmxDbnQgIC0gJGkxc3RCZEw7DQorICBteSAkaUJkRXhMID0gMDsNCisgIG15ICRpQWxsID0gJGlCQmNudCArICRpUFBTY250ICsgJGlTQkRjbnQ7DQorICBteSAkaUFsbFcgPSAkaUFsbDsNCisgIG15ICRpQmRDbnRXID0gaW50KCRpQWxsVyAvICRpQmxDbnQpICsgKCgkaUFsbFcgJSAkaUJsQ250KT8gMTogMCk7DQorICBteSAkaUJkQ250ID0gaW50KCgkaUFsbCArICRpQmRDbnRXKSAvICRpQmxDbnQpICsgKCgoJGlBbGxXKyRpQmRDbnRXKSAlICRpQmxDbnQpPyAxOiAwKTsNCisgIG15ICRpOw0KKw0KKyAgaWYgKCRpQmRDbnQgPiAkaTFzdEJkTCkgew0KKyAgICAjMC4xIENhbGN1bGF0ZSBCRCBjb3VudA0KKyAgICAkaUJsQ250LS07ICN0aGUgQmxDbnQgaXMgcmVkdWNlZCBpbiB0aGUgY291bnQgb2YgdGhlIGxhc3Qgc2VjdCBpcyB1c2VkIGZvciBhIHBvaW50ZXIgdGhlIG5leHQgQmwNCisgICAgbXkgJGlCQmxlZnRvdmVyID0gJGlBbGwgLSAkaTFzdEJkTWF4Ow0KKw0KKyAgICBpZiAoJGlBbGwgPiRpMXN0QmRNYXgpIHsNCisgICAgICB3aGlsZSgxKSB7DQorICAgICAgICAkaUJkQ250ID0gaW50KCgkaUJCbGVmdG92ZXIpIC8gJGlCbENudCkgKyAoKCgkaUJCbGVmdG92ZXIpICUgJGlCbENudCk/IDE6IDApOw0KKyAgICAgICAgJGlCZEV4TCA9IGludCgoJGlCZENudCkgLyAkaUJsQ250KSArICgoKCRpQmRDbnQpICUgJGlCbENudCk/IDE6IDApOw0KKyAgICAgICAgJGlCQmxlZnRvdmVyID0gJGlCQmxlZnRvdmVyICsgJGlCZEV4TDsNCisgICAgICAgIGxhc3QgaWYoJGlCZENudCA9PSAoaW50KCgkaUJCbGVmdG92ZXIpIC8gJGlCbENudCkgKyAoKCgkaUJCbGVmdG92ZXIpICUgJGlCbENudCk/IDE6IDApKSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgICRpQmRDbnQgKz0gJGkxc3RCZEw7DQorICAgICNwcmludCAiaUJkQ250ID0gJGlCZENudCBcbiI7DQorICB9DQorIzEuU2F2ZSBIZWFkZXINCisgIHByaW50IHskRklMRX0gKA0KKyAgICAgICAgICAgICJceEQwXHhDRlx4MTFceEUwXHhBMVx4QjFceDFBXHhFMSINCisgICAgICAgICAgICAsICJceDAwXHgwMFx4MDBceDAwIiB4IDQNCisgICAgICAgICAgICAsIHBhY2soInYiLCAweDNiKQ0KKyAgICAgICAgICAgICwgcGFjaygidiIsIDB4MDMpDQorICAgICAgICAgICAgLCBwYWNrKCJ2IiwgLTIpDQorICAgICAgICAgICAgLCBwYWNrKCJ2IiwgOSkNCisgICAgICAgICAgICAsIHBhY2soInYiLCA2KQ0KKyAgICAgICAgICAgICwgcGFjaygidiIsIDApDQorICAgICAgICAgICAgLCAiXHgwMFx4MDBceDAwXHgwMCIgeCAyDQorICAgICAgICAgICAgLCBwYWNrKCJWIiwgJGlCZENudCksDQorICAgICAgICAgICAgLCBwYWNrKCJWIiwgJGlCQmNudCskaVNCRGNudCksICNST09UIFNUQVJUDQorICAgICAgICAgICAgLCBwYWNrKCJWIiwgMCkNCisgICAgICAgICAgICAsIHBhY2soIlYiLCAweDEwMDApDQorICAgICAgICAgICAgLCBwYWNrKCJWIiwgJGlTQkRjbnQgPyAwIDogLTIpICAgICAgICAgICAgICAgICAgI1NtYWxsIEJsb2NrIERlcG90DQorICAgICAgICAgICAgLCBwYWNrKCJWIiwgJGlTQkRjbnQpDQorICAgICk7DQorIzIuIEV4dHJhIEJETGlzdCBTdGFydCwgQ291bnQNCisgIGlmKCRpQWxsIDw9ICRpMXN0QmRNYXgpIHsNCisgICAgcHJpbnQgeyRGSUxFfSAoDQorICAgICAgICAgICAgICAgIHBhY2soIlYiLCAtMiksICAgICAgI0V4dHJhIEJETGlzdCBTdGFydA0KKyAgICAgICAgICAgICAgICBwYWNrKCJWIiwgMCksICAgICAgICNFeHRyYSBCRExpc3QgQ291bnQNCisgICAgICAgICk7DQorICB9DQorICBlbHNlIHsNCisgICAgcHJpbnQgeyRGSUxFfSAoDQorICAgICAgICAgICAgcGFjaygiViIsICRpQWxsKyRpQmRDbnQpLA0KKyAgICAgICAgICAgIHBhY2soIlYiLCAkaUJkRXhMKSwNCisgICAgICAgICk7DQorICB9DQorDQorIzMuIEJETGlzdA0KKyAgICBmb3IoJGk9MDsgJGk8JGkxc3RCZEwgYW5kICRpIDwgJGlCZENudDsgJGkrKykgew0KKyAgICAgICAgcHJpbnQgeyRGSUxFfSAocGFjaygiViIsICRpQWxsKyRpKSk7DQorICAgIH0NCisgICAgcHJpbnQgeyRGSUxFfSAoKHBhY2soIlYiLCAtMSkpIHgoJGkxc3RCZEwtJGkpKSBpZigkaTwkaTFzdEJkTCk7DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9zYXZlQmlnRGF0YSAoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUykNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9zYXZlQmlnRGF0YSgkJCQkKSB7DQorICBteSgkb1RoaXMsICRpU3RCbGssICRyYUxpc3QsICRyaEluZm8pID0gQF87DQorICBteSAkaVJlcyA9IDA7DQorICBteSAkRklMRSA9ICRyaEluZm8tPntfRklMRUhffTsNCisNCisjMS5Xcml0ZSBCaWcgKGdlIDB4MTAwMCkgRGF0YSBpbnRvIEJsb2NrDQorICBmb3JlYWNoIG15ICRvUHBzIChAJHJhTGlzdCkgew0KKyAgICBpZigkb1Bwcy0+e1R5cGV9IT1PTEU6OlN0b3JhZ2VfTGl0ZTo6UHBzVHlwZV9EaXIoKSkgew0KKyNwcmludCAiUFBTOiAkb1BwcyBERUY6IiwgZGVmaW5lZCgkb1Bwcy0+e0RhdGF9KSwgIlxuIjsNCisgICAgICAgICRvUHBzLT57U2l6ZX0gPSAkb1Bwcy0+X0RhdGFMZW4oKTsgICNNb2QNCisgICAgICAgIGlmKCgkb1Bwcy0+e1NpemV9ID49ICRyaEluZm8tPntfU01BTExfU0laRX0pIHx8DQorICAgICAgICAgICAgKCgkb1Bwcy0+e1R5cGV9ID09IE9MRTo6U3RvcmFnZV9MaXRlOjpQcHNUeXBlX1Jvb3QoKSkgJiYgZGVmaW5lZCgkb1Bwcy0+e0RhdGF9KSkpIHsNCisgICAgICAgICAgICAjMS4xIFdyaXRlIERhdGENCisgICAgICAgICAgICAjQ2hlY2sgZm9yIHVwZGF0ZQ0KKyAgICAgICAgICAgIGlmKCRvUHBzLT57X1BQU19GSUxFfSkgew0KKyAgICAgICAgICAgICAgICBteSAkc0J1ZmY7DQorICAgICAgICAgICAgICAgIG15ICRpTGVuID0gMDsNCisgICAgICAgICAgICAgICAgJG9QcHMtPntfUFBTX0ZJTEV9LT5zZWVrKDAsIDApOyAjVG8gVGhlIFRvcA0KKyAgICAgICAgICAgICAgICB3aGlsZSgkb1Bwcy0+e19QUFNfRklMRX0tPnJlYWQoJHNCdWZmLCA0MDk2KSkgew0KKyAgICAgICAgICAgICAgICAgICAgJGlMZW4gKz0gbGVuZ3RoKCRzQnVmZik7DQorICAgICAgICAgICAgICAgICAgICBwcmludCB7JEZJTEV9ICgkc0J1ZmYpOyAgICAgICAgICAgI0NoZWNrIGZvciB1cGRhdGUNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgcHJpbnQgeyRGSUxFfSAoJG9QcHMtPntEYXRhfSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHByaW50IHskRklMRX0gKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJceDAwIiB4DQorICAgICAgICAgICAgICAgICAgICAgICAgKCRyaEluZm8tPntfQklHX0JMT0NLX1NJWkV9IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCRvUHBzLT57U2l6ZX0gJSAkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfSkpDQorICAgICAgICAgICAgICAgICAgICApIGlmICgkb1Bwcy0+e1NpemV9ICUgJHJoSW5mby0+e19CSUdfQkxPQ0tfU0laRX0pOw0KKyAgICAgICAgICAgICMxLjIgU2V0IEZvciBQUFMNCisgICAgICAgICAgICAkb1Bwcy0+e1N0YXJ0QmxvY2t9ID0gJCRpU3RCbGs7DQorICAgICAgICAgICAgJCRpU3RCbGsgKz0NCisgICAgICAgICAgICAgICAgICAgIChpbnQoJG9QcHMtPntTaXplfS8gJHJoSW5mby0+e19CSUdfQkxPQ0tfU0laRX0pICsNCisgICAgICAgICAgICAgICAgICAgICAgICAoKCRvUHBzLT57U2l6ZX0lICRyaEluZm8tPntfQklHX0JMT0NLX1NJWkV9KT8gMTogMCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9zYXZlUHBzIChPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpSb290KQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgX3NhdmVQcHMoJCQkKQ0KK3sNCisgIG15KCRvVGhpcywgJHJhTGlzdCwgJHJoSW5mbykgPSBAXzsNCisjMC4gSW5pdGlhbA0KKyAgbXkgJEZJTEUgPSAkcmhJbmZvLT57X0ZJTEVIX307DQorIzIuIFNhdmUgUFBTDQorICBmb3JlYWNoIG15ICRvSXRlbSAoQCRyYUxpc3QpIHsNCisgICAgICAkb0l0ZW0tPl9zYXZlUHBzV2soJHJoSW5mbyk7DQorICB9DQorIzMuIEFkanVzdCBmb3IgQmxvY2sNCisgIG15ICRpQ250ID0gc2NhbGFyKEAkcmFMaXN0KTsNCisgIG15ICRpQkNudCA9ICRyaEluZm8tPntfQklHX0JMT0NLX1NJWkV9IC8gJHJoSW5mby0+e19QUFNfU0laRX07DQorICBwcmludCB7JEZJTEV9ICgiXHgwMCIgeCAoKCRpQkNudCAtICgkaUNudCAlICRpQkNudCkpICogJHJoSW5mby0+e19QUFNfU0laRX0pKQ0KKyAgICAgICAgaWYoJGlDbnQgJSAkaUJDbnQpOw0KKyAgcmV0dXJuIGludCgkaUNudCAvICRpQkNudCkgKyAoKCRpQ250ICUgJGlCQ250KT8gMTogMCk7DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9zYXZlUHBzU2V0UG50MiAoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6Um9vdCkNCisjICBGb3IgVGVzdA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgX3NhdmVQcHNTZXRQbnQyKCQkJCkNCit7DQorICBteSgkYVRoaXMsICRyYUxpc3QsICRyaEluZm8pID0gQF87DQorIzEuIG1ha2UgQXJyYXkgYXMgQ2hpbGRyZW4tUmVsYXRpb25zDQorIzEuMSBpZiBObyBDaGlsZHJlbg0KKyAgaWYoJCMkYVRoaXMgPCAwKSB7DQorICAgICAgcmV0dXJuIDB4RkZGRkZGRkY7DQorICB9DQorICBlbHNpZigkIyRhVGhpcyA9PSAwKSB7DQorIzEuMiBKdXN0IE9ubHkgb25lDQorICAgICAgcHVzaCBAJHJhTGlzdCwgJGFUaGlzLT5bMF07DQorICAgICAgJGFUaGlzLT5bMF0tPntOb30gPSAkIyRyYUxpc3Q7DQorICAgICAgJGFUaGlzLT5bMF0tPntQcmV2UHBzfSA9IDB4RkZGRkZGRkY7DQorICAgICAgJGFUaGlzLT5bMF0tPntOZXh0UHBzfSA9IDB4RkZGRkZGRkY7DQorICAgICAgJGFUaGlzLT5bMF0tPntEaXJQcHN9ID0gX3NhdmVQcHNTZXRQbnQyKCRhVGhpcy0+WzBdLT57Q2hpbGR9LCAkcmFMaXN0LCAkcmhJbmZvKTsNCisgICAgICByZXR1cm4gJGFUaGlzLT5bMF0tPntOb307DQorICB9DQorICBlbHNlIHsNCisjMS4zIEFycmF5DQorICAgICAgbXkgJGlDbnQgPSAkIyRhVGhpcyArIDE7DQorIzEuMy4xIERlZmluZSBDZW50ZXINCisgICAgICBteSAkaVBvcyA9IDA7ICNpbnQoJGlDbnQvIDIpOyAgICAgIyRpQ250DQorDQorICAgICAgbXkgQGFXayA9IEAkYVRoaXM7DQorICAgICAgbXkgQGFQcmV2ID0gKCQjJGFUaGlzID4gMSk/IHNwbGljZShAYVdrLCAxLCAxKSA6ICgpOyAjJGlQb3MpOw0KKyAgICAgIG15IEBhTmV4dCA9IHNwbGljZShAYVdrLCAxKTsgIywgJGlDbnQgLSAkaVBvcyAtMSk7DQorICAgICAgJGFUaGlzLT5bJGlQb3NdLT57UHJldlBwc30gPSBfc2F2ZVBwc1NldFBudDIoDQorICAgICAgICAgICAgXEBhUHJldiwgJHJhTGlzdCwgJHJoSW5mbyk7DQorICAgICAgcHVzaCBAJHJhTGlzdCwgJGFUaGlzLT5bJGlQb3NdOw0KKyAgICAgICRhVGhpcy0+WyRpUG9zXS0+e05vfSA9ICQjJHJhTGlzdDsNCisNCisjMS4zLjIgRGV2aWRlIGEgYXJyYXkgaW50byBQcmV2aW91cyxOZXh0DQorICAgICAgJGFUaGlzLT5bJGlQb3NdLT57TmV4dFBwc30gPSBfc2F2ZVBwc1NldFBudDIoDQorICAgICAgICAgICAgXEBhTmV4dCwgJHJhTGlzdCwgJHJoSW5mbyk7DQorICAgICAgJGFUaGlzLT5bJGlQb3NdLT57RGlyUHBzfSA9IF9zYXZlUHBzU2V0UG50MigkYVRoaXMtPlskaVBvc10tPntDaGlsZH0sICRyYUxpc3QsICRyaEluZm8pOw0KKyAgICAgIHJldHVybiAkYVRoaXMtPlskaVBvc10tPntOb307DQorICB9DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9zYXZlUHBzU2V0UG50MiAoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6Um9vdCkNCisjICBGb3IgVGVzdA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgX3NhdmVQcHNTZXRQbnQycygkJCQpDQorew0KKyAgbXkoJGFUaGlzLCAkcmFMaXN0LCAkcmhJbmZvKSA9IEBfOw0KKyMxLiBtYWtlIEFycmF5IGFzIENoaWxkcmVuLVJlbGF0aW9ucw0KKyMxLjEgaWYgTm8gQ2hpbGRyZW4NCisgIGlmKCQjJGFUaGlzIDwgMCkgew0KKyAgICAgIHJldHVybiAweEZGRkZGRkZGOw0KKyAgfQ0KKyAgZWxzaWYoJCMkYVRoaXMgPT0gMCkgew0KKyMxLjIgSnVzdCBPbmx5IG9uZQ0KKyAgICAgIHB1c2ggQCRyYUxpc3QsICRhVGhpcy0+WzBdOw0KKyAgICAgICRhVGhpcy0+WzBdLT57Tm99ID0gJCMkcmFMaXN0Ow0KKyAgICAgICRhVGhpcy0+WzBdLT57UHJldlBwc30gPSAweEZGRkZGRkZGOw0KKyAgICAgICRhVGhpcy0+WzBdLT57TmV4dFBwc30gPSAweEZGRkZGRkZGOw0KKyAgICAgICRhVGhpcy0+WzBdLT57RGlyUHBzfSA9IF9zYXZlUHBzU2V0UG50MigkYVRoaXMtPlswXS0+e0NoaWxkfSwgJHJhTGlzdCwgJHJoSW5mbyk7DQorICAgICAgcmV0dXJuICRhVGhpcy0+WzBdLT57Tm99Ow0KKyAgfQ0KKyAgZWxzZSB7DQorIzEuMyBBcnJheQ0KKyAgICAgIG15ICRpQ250ID0gJCMkYVRoaXMgKyAxOw0KKyMxLjMuMSBEZWZpbmUgQ2VudGVyDQorICAgICAgbXkgJGlQb3MgPSAwOyAjaW50KCRpQ250LyAyKTsgICAgICMkaUNudA0KKyAgICAgIHB1c2ggQCRyYUxpc3QsICRhVGhpcy0+WyRpUG9zXTsNCisgICAgICAkYVRoaXMtPlskaVBvc10tPntOb30gPSAkIyRyYUxpc3Q7DQorICAgICAgbXkgQGFXayA9IEAkYVRoaXM7DQorIzEuMy4yIERldmlkZSBhIGFycmF5IGludG8gUHJldmlvdXMsTmV4dA0KKyAgICAgIG15IEBhUHJldiA9IHNwbGljZShAYVdrLCAwLCAkaVBvcyk7DQorICAgICAgbXkgQGFOZXh0ID0gc3BsaWNlKEBhV2ssIDEsICRpQ250IC0gJGlQb3MgLTEpOw0KKyAgICAgICRhVGhpcy0+WyRpUG9zXS0+e1ByZXZQcHN9ID0gX3NhdmVQcHNTZXRQbnQyKA0KKyAgICAgICAgICAgIFxAYVByZXYsICRyYUxpc3QsICRyaEluZm8pOw0KKyAgICAgICRhVGhpcy0+WyRpUG9zXS0+e05leHRQcHN9ID0gX3NhdmVQcHNTZXRQbnQyKA0KKyAgICAgICAgICAgIFxAYU5leHQsICRyYUxpc3QsICRyaEluZm8pOw0KKyAgICAgICRhVGhpcy0+WyRpUG9zXS0+e0RpclBwc30gPSBfc2F2ZVBwc1NldFBudDIoJGFUaGlzLT5bJGlQb3NdLT57Q2hpbGR9LCAkcmFMaXN0LCAkcmhJbmZvKTsNCisgICAgICByZXR1cm4gJGFUaGlzLT5bJGlQb3NdLT57Tm99Ow0KKyAgfQ0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBfc2F2ZVBwc1NldFBudCAoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6Um9vdCkNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9zYXZlUHBzU2V0UG50KCQkJCkNCit7DQorICBteSgkYVRoaXMsICRyYUxpc3QsICRyaEluZm8pID0gQF87DQorIzEuIG1ha2UgQXJyYXkgYXMgQ2hpbGRyZW4tUmVsYXRpb25zDQorIzEuMSBpZiBObyBDaGlsZHJlbg0KKyAgaWYoJCMkYVRoaXMgPCAwKSB7DQorICAgICAgcmV0dXJuIDB4RkZGRkZGRkY7DQorICB9DQorICBlbHNpZigkIyRhVGhpcyA9PSAwKSB7DQorIzEuMiBKdXN0IE9ubHkgb25lDQorICAgICAgcHVzaCBAJHJhTGlzdCwgJGFUaGlzLT5bMF07DQorICAgICAgJGFUaGlzLT5bMF0tPntOb30gPSAkIyRyYUxpc3Q7DQorICAgICAgJGFUaGlzLT5bMF0tPntQcmV2UHBzfSA9IDB4RkZGRkZGRkY7DQorICAgICAgJGFUaGlzLT5bMF0tPntOZXh0UHBzfSA9IDB4RkZGRkZGRkY7DQorICAgICAgJGFUaGlzLT5bMF0tPntEaXJQcHN9ID0gX3NhdmVQcHNTZXRQbnQoJGFUaGlzLT5bMF0tPntDaGlsZH0sICRyYUxpc3QsICRyaEluZm8pOw0KKyAgICAgIHJldHVybiAkYVRoaXMtPlswXS0+e05vfTsNCisgIH0NCisgIGVsc2Ugew0KKyMxLjMgQXJyYXkNCisgICAgICBteSAkaUNudCA9ICQjJGFUaGlzICsgMTsNCisjMS4zLjEgRGVmaW5lIENlbnRlcg0KKyAgICAgIG15ICRpUG9zID0gaW50KCRpQ250LyAyKTsgICAgICMkaUNudA0KKyAgICAgIHB1c2ggQCRyYUxpc3QsICRhVGhpcy0+WyRpUG9zXTsNCisgICAgICAkYVRoaXMtPlskaVBvc10tPntOb30gPSAkIyRyYUxpc3Q7DQorICAgICAgbXkgQGFXayA9IEAkYVRoaXM7DQorIzEuMy4yIERldmlkZSBhIGFycmF5IGludG8gUHJldmlvdXMsTmV4dA0KKyAgICAgIG15IEBhUHJldiA9IHNwbGljZShAYVdrLCAwLCAkaVBvcyk7DQorICAgICAgbXkgQGFOZXh0ID0gc3BsaWNlKEBhV2ssIDEsICRpQ250IC0gJGlQb3MgLTEpOw0KKyAgICAgICRhVGhpcy0+WyRpUG9zXS0+e1ByZXZQcHN9ID0gX3NhdmVQcHNTZXRQbnQoDQorICAgICAgICAgICAgXEBhUHJldiwgJHJhTGlzdCwgJHJoSW5mbyk7DQorICAgICAgJGFUaGlzLT5bJGlQb3NdLT57TmV4dFBwc30gPSBfc2F2ZVBwc1NldFBudCgNCisgICAgICAgICAgICBcQGFOZXh0LCAkcmFMaXN0LCAkcmhJbmZvKTsNCisgICAgICAkYVRoaXMtPlskaVBvc10tPntEaXJQcHN9ID0gX3NhdmVQcHNTZXRQbnQoJGFUaGlzLT5bJGlQb3NdLT57Q2hpbGR9LCAkcmFMaXN0LCAkcmhJbmZvKTsNCisgICAgICByZXR1cm4gJGFUaGlzLT5bJGlQb3NdLT57Tm99Ow0KKyAgfQ0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBfc2F2ZVBwc1NldFBudCAoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6Um9vdCkNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9zYXZlUHBzU2V0UG50MSgkJCQpDQorew0KKyAgbXkoJGFUaGlzLCAkcmFMaXN0LCAkcmhJbmZvKSA9IEBfOw0KKyMxLiBtYWtlIEFycmF5IGFzIENoaWxkcmVuLVJlbGF0aW9ucw0KKyMxLjEgaWYgTm8gQ2hpbGRyZW4NCisgIGlmKCQjJGFUaGlzIDwgMCkgew0KKyAgICAgIHJldHVybiAweEZGRkZGRkZGOw0KKyAgfQ0KKyAgZWxzaWYoJCMkYVRoaXMgPT0gMCkgew0KKyMxLjIgSnVzdCBPbmx5IG9uZQ0KKyAgICAgIHB1c2ggQCRyYUxpc3QsICRhVGhpcy0+WzBdOw0KKyAgICAgICRhVGhpcy0+WzBdLT57Tm99ID0gJCMkcmFMaXN0Ow0KKyAgICAgICRhVGhpcy0+WzBdLT57UHJldlBwc30gPSAweEZGRkZGRkZGOw0KKyAgICAgICRhVGhpcy0+WzBdLT57TmV4dFBwc30gPSAweEZGRkZGRkZGOw0KKyAgICAgICRhVGhpcy0+WzBdLT57RGlyUHBzfSA9IF9zYXZlUHBzU2V0UG50KCRhVGhpcy0+WzBdLT57Q2hpbGR9LCAkcmFMaXN0LCAkcmhJbmZvKTsNCisgICAgICByZXR1cm4gJGFUaGlzLT5bMF0tPntOb307DQorICB9DQorICBlbHNlIHsNCisjMS4zIEFycmF5DQorICAgICAgbXkgJGlDbnQgPSAkIyRhVGhpcyArIDE7DQorIzEuMy4xIERlZmluZSBDZW50ZXINCisgICAgICBteSAkaVBvcyA9IGludCgkaUNudC8gMik7ICAgICAjJGlDbnQNCisgICAgICBwdXNoIEAkcmFMaXN0LCAkYVRoaXMtPlskaVBvc107DQorICAgICAgJGFUaGlzLT5bJGlQb3NdLT57Tm99ID0gJCMkcmFMaXN0Ow0KKyAgICAgIG15IEBhV2sgPSBAJGFUaGlzOw0KKyMxLjMuMiBEZXZpZGUgYSBhcnJheSBpbnRvIFByZXZpb3VzLE5leHQNCisgICAgICBteSBAYVByZXYgPSBzcGxpY2UoQGFXaywgMCwgJGlQb3MpOw0KKyAgICAgIG15IEBhTmV4dCA9IHNwbGljZShAYVdrLCAxLCAkaUNudCAtICRpUG9zIC0xKTsNCisgICAgICAkYVRoaXMtPlskaVBvc10tPntQcmV2UHBzfSA9IF9zYXZlUHBzU2V0UG50KA0KKyAgICAgICAgICAgIFxAYVByZXYsICRyYUxpc3QsICRyaEluZm8pOw0KKyAgICAgICRhVGhpcy0+WyRpUG9zXS0+e05leHRQcHN9ID0gX3NhdmVQcHNTZXRQbnQoDQorICAgICAgICAgICAgXEBhTmV4dCwgJHJhTGlzdCwgJHJoSW5mbyk7DQorICAgICAgJGFUaGlzLT5bJGlQb3NdLT57RGlyUHBzfSA9IF9zYXZlUHBzU2V0UG50KCRhVGhpcy0+WyRpUG9zXS0+e0NoaWxkfSwgJHJhTGlzdCwgJHJoSW5mbyk7DQorICAgICAgcmV0dXJuICRhVGhpcy0+WyRpUG9zXS0+e05vfTsNCisgIH0NCit9DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgX3NhdmVCYmQgKE9MRTo6U3RvcmFnZV9MaXRlKQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgX3NhdmVCYmQoJCQkJCkNCit7DQorICBteSgkb1RoaXMsICRpU2JkU2l6ZSwgJGlCc2l6ZSwgJGlQcHNDbnQsICRyaEluZm8pID0gQF87DQorICBteSAkRklMRSA9ICRyaEluZm8tPntfRklMRUhffTsNCisjMC4gQ2FsY3VsYXRlIEJhc2ljIFNldHRpbmcNCisgIG15ICRpQmJDbnQgPSAkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfSAvIE9MRTo6U3RvcmFnZV9MaXRlOjpMb25nSW50U2l6ZSgpOw0KKyAgbXkgJGlCbENudCA9ICRpQmJDbnQgLSAxOw0KKyAgbXkgJGkxc3RCZEwgPSBpbnQoKCRyaEluZm8tPntfQklHX0JMT0NLX1NJWkV9IC0gMHg0QykgLyBPTEU6OlN0b3JhZ2VfTGl0ZTo6TG9uZ0ludFNpemUoKSk7DQorICBteSAkaTFzdEJkTWF4ID0gJGkxc3RCZEwgKiAkaUJiQ250ICAtICRpMXN0QmRMOw0KKyAgbXkgJGlCZEV4TCA9IDA7DQorICBteSAkaUFsbCA9ICRpQnNpemUgKyAkaVBwc0NudCArICRpU2JkU2l6ZTsNCisgIG15ICRpQWxsVyA9ICRpQWxsOw0KKyAgbXkgJGlCZENudFcgPSBpbnQoJGlBbGxXIC8gJGlCYkNudCkgKyAoKCRpQWxsVyAlICRpQmJDbnQpPyAxOiAwKTsNCisgIG15ICRpQmRDbnQgPSAwOw0KKyAgbXkgJGk7DQorIzAuMSBDYWxjdWxhdGUgQkQgY291bnQNCisgIG15ICRpQkJsZWZ0b3ZlciA9ICRpQWxsIC0gJGkxc3RCZE1heDsNCisgIGlmICgkaUFsbCA+JGkxc3RCZE1heCkgew0KKw0KKyAgICB3aGlsZSgxKSB7DQorICAgICAgJGlCZENudCA9IGludCgoJGlCQmxlZnRvdmVyKSAvICRpQmxDbnQpICsgKCgoJGlCQmxlZnRvdmVyKSAlICRpQmxDbnQpPyAxOiAwKTsNCisgICAgICAkaUJkRXhMID0gaW50KCgkaUJkQ250KSAvICRpQmxDbnQpICsgKCgoJGlCZENudCkgJSAkaUJsQ250KT8gMTogMCk7DQorICAgICAgJGlCQmxlZnRvdmVyID0gJGlCQmxlZnRvdmVyICsgJGlCZEV4TDsNCisgICAgICBsYXN0IGlmKCRpQmRDbnQgPT0gKGludCgoJGlCQmxlZnRvdmVyKSAvICRpQmxDbnQpICsgKCgoJGlCQmxlZnRvdmVyKSAlICRpQmxDbnQpPyAxOiAwKSkpOw0KKyAgICB9DQorICB9DQorICAkaUFsbFcgKz0gJGlCZEV4TDsNCisgICRpQmRDbnQgKz0gJGkxc3RCZEw7DQorICAjcHJpbnQgImlCZENudCA9ICRpQmRDbnQgXG4iOw0KKw0KKyMxLiBNYWtpbmcgQkQNCisjMS4xIFNldCBmb3IgU0JEDQorICBpZigkaVNiZFNpemUgPiAwKSB7DQorICAgIGZvciAoJGkgPSAwOyAkaTwoJGlTYmRTaXplLTEpOyAkaSsrKSB7DQorICAgICAgcHJpbnQgeyRGSUxFfSAocGFjaygiViIsICRpKzEpKTsNCisgICAgfQ0KKyAgICBwcmludCB7JEZJTEV9IChwYWNrKCJWIiwgLTIpKTsNCisgIH0NCisjMS4yIFNldCBmb3IgQg0KKyAgZm9yICgkaSA9IDA7ICRpPCgkaUJzaXplLTEpOyAkaSsrKSB7DQorICAgICAgcHJpbnQgeyRGSUxFfSAocGFjaygiViIsICRpKyRpU2JkU2l6ZSsxKSk7DQorICB9DQorICBwcmludCB7JEZJTEV9IChwYWNrKCJWIiwgLTIpKTsNCisNCisjMS4zIFNldCBmb3IgUFBTDQorICBmb3IgKCRpID0gMDsgJGk8KCRpUHBzQ250LTEpOyAkaSsrKSB7DQorICAgICAgcHJpbnQgeyRGSUxFfSAocGFjaygiViIsICRpKyRpU2JkU2l6ZSskaUJzaXplKzEpKTsNCisgIH0NCisgIHByaW50IHskRklMRX0gKHBhY2soIlYiLCAtMikpOw0KKyMxLjQgU2V0IGZvciBCQkQgaXRzZWxmICggMHhGRkZGRkZGRCA6IEJCRCkNCisgIGZvcigkaT0wOyAkaTwkaUJkQ250OyRpKyspIHsNCisgICAgcHJpbnQgeyRGSUxFfSAocGFjaygiViIsIDB4RkZGRkZGRkQpKTsNCisgIH0NCisjMS41IFNldCBmb3IgRXh0cmFCRExpc3QNCisgIGZvcigkaT0wOyAkaTwkaUJkRXhMOyRpKyspIHsNCisgICAgcHJpbnQgeyRGSUxFfSAocGFjaygiViIsIDB4RkZGRkZGRkMpKTsNCisgIH0NCisjMS42IEFkanVzdCBmb3IgQmxvY2sNCisgIHByaW50IHskRklMRX0gKHBhY2soIlYiLCAtMSkgeCAoJGlCYkNudCAtICgoJGlBbGxXICsgJGlCZENudCkgJSAkaUJiQ250KSkpDQorICAgICAgICAgICAgICAgIGlmKCgkaUFsbFcgKyAkaUJkQ250KSAlICRpQmJDbnQpOw0KKyMyLkV4dHJhIEJETGlzdA0KKyAgaWYoJGlCZENudCA+ICRpMXN0QmRMKSAgew0KKyAgICBteSAkaU49MDsNCisgICAgbXkgJGlOYj0wOw0KKyAgICBmb3IoJGk9JGkxc3RCZEw7JGk8JGlCZENudDsgJGkrKywgJGlOKyspIHsNCisgICAgICBpZigkaU4+PSgkaUJiQ250LTEpKSB7DQorICAgICAgICAgICRpTiA9IDA7DQorICAgICAgICAgICRpTmIrKzsNCisgICAgICAgICAgcHJpbnQgeyRGSUxFfSAocGFjaygiViIsICRpQWxsKyRpQmRDbnQrJGlOYikpOw0KKyAgICAgIH0NCisgICAgICBwcmludCB7JEZJTEV9IChwYWNrKCJWIiwgJGlCc2l6ZSskaVNiZFNpemUrJGlQcHNDbnQrJGkpKTsNCisgICAgfQ0KKyAgICBwcmludCB7JEZJTEV9IChwYWNrKCJWIiwgLTEpIHggKCgkaUJiQ250LTEpIC0gKCgkaUJkQ250LSRpMXN0QmRMKSAlICgkaUJiQ250LTEpKSkpDQorICAgICAgICBpZigoJGlCZENudC0kaTFzdEJkTCkgJSAoJGlCYkNudC0xKSk7DQorICAgIHByaW50IHskRklMRX0gKHBhY2soIlYiLCAtMikpOw0KKyAgfQ0KK30NCisNCisjLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorIyBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpGaWxlIE9iamVjdA0KKyMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpGaWxlDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3BhY2thZ2UgT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6RmlsZTsNCityZXF1aXJlIEV4cG9ydGVyOw0KK3VzZSBzdHJpY3Q7DQordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7DQorQElTQSA9IHF3KE9MRTo6U3RvcmFnZV9MaXRlOjpQUFMgRXhwb3J0ZXIpOw0KKyRWRVJTSU9OID0gJzAuMTknOw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIG5ldyAoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6RmlsZSkNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIG5ldyAoJCQkKSB7DQorICBteSgkc0NsYXNzLCAkc05tLCAkc0RhdGEpID0gQF87DQorICAgIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6Ol9uZXcoDQorICAgICAgICAkc0NsYXNzLA0KKyAgICAgICAgdW5kZWYsDQorICAgICAgICAkc05tLA0KKyAgICAgICAgMiwNCisgICAgICAgIHVuZGVmLA0KKyAgICAgICAgdW5kZWYsDQorICAgICAgICB1bmRlZiwNCisgICAgICAgIHVuZGVmLA0KKyAgICAgICAgdW5kZWYsDQorICAgICAgICB1bmRlZiwNCisgICAgICAgIHVuZGVmLA0KKyAgICAgICAgJHNEYXRhLA0KKyAgICAgICAgdW5kZWYpOw0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBuZXdGaWxlIChPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpGaWxlKQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgbmV3RmlsZSAoJCQ7JCkgew0KKyAgICBteSgkc0NsYXNzLCAkc05tLCAkc0ZpbGUpID0gQF87DQorICAgIG15ICRvU2VsZiA9DQorICAgIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6Ol9uZXcoDQorICAgICAgICAkc0NsYXNzLA0KKyAgICAgICAgdW5kZWYsDQorICAgICAgICAkc05tLA0KKyAgICAgICAgMiwNCisgICAgICAgIHVuZGVmLA0KKyAgICAgICAgdW5kZWYsDQorICAgICAgICB1bmRlZiwNCisgICAgICAgIHVuZGVmLA0KKyAgICAgICAgdW5kZWYsDQorICAgICAgICB1bmRlZiwNCisgICAgICAgIHVuZGVmLA0KKyAgICAgICAgJycsDQorICAgICAgICB1bmRlZik7DQorIw0KKyAgICBpZigoIWRlZmluZWQoJHNGaWxlKSkgb3IgKCRzRmlsZSBlcSAnJykpIHsNCisgICAgICAgICRvU2VsZi0+e19QUFNfRklMRX0gPSBJTzo6RmlsZS0+bmV3X3RtcGZpbGUoKTsNCisgICAgfQ0KKyAgICBlbHNpZihVTklWRVJTQUw6OmlzYSgkc0ZpbGUsICdJTzo6SGFuZGxlJykpIHsNCisgICAgICAgICRvU2VsZi0+e19QUFNfRklMRX0gPSAkc0ZpbGU7DQorICAgIH0NCisgICAgZWxzaWYoIXJlZigkc0ZpbGUpKSB7DQorICAgICAgICAjRmlsZSBOYW1lDQorICAgICAgICAkb1NlbGYtPntfUFBTX0ZJTEV9ID0gbmV3IElPOjpGaWxlOw0KKyAgICAgICAgcmV0dXJuIHVuZGVmIHVubGVzcygkb1NlbGYtPntfUFBTX0ZJTEV9KTsNCisgICAgICAgICRvU2VsZi0+e19QUFNfRklMRX0tPm9wZW4oIiRzRmlsZSIsICJyKyIpIHx8IHJldHVybiB1bmRlZjsNCisgICAgfQ0KKyAgICBlbHNlIHsNCisgICAgICAgIHJldHVybiB1bmRlZjsNCisgICAgfQ0KKyAgICBpZigkb1NlbGYtPntfUFBTX0ZJTEV9KSB7DQorICAgICAgICAkb1NlbGYtPntfUFBTX0ZJTEV9LT5zZWVrKDAsIDIpOw0KKyAgICAgICAgYmlubW9kZSgkb1NlbGYtPntfUFBTX0ZJTEV9KTsNCisgICAgICAgICRvU2VsZi0+e19QUFNfRklMRX0tPmF1dG9mbHVzaCgxKTsNCisgICAgfQ0KKyAgICByZXR1cm4gJG9TZWxmOw0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBhcHBlbmQgKE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OkZpbGUpDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3N1YiBhcHBlbmQgKCQkKSB7DQorICAgIG15KCRvU2VsZiwgJHNEYXRhKSA9IEBfOw0KKyAgICBpZigkb1NlbGYtPntfUFBTX0ZJTEV9KSB7DQorICAgICAgICBwcmludCB7JG9TZWxmLT57X1BQU19GSUxFfX0gJHNEYXRhOw0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgICAgJG9TZWxmLT57RGF0YX0gLj0gJHNEYXRhOw0KKyAgICB9DQorfQ0KKw0KKyMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisjIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OkRpciBPYmplY3QNCisjLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgbmV3IChPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpEaXIpDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3BhY2thZ2UgT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6RGlyOw0KK3JlcXVpcmUgRXhwb3J0ZXI7DQordXNlIHN0cmljdDsNCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsNCitASVNBID0gcXcoT0xFOjpTdG9yYWdlX0xpdGU6OlBQUyBFeHBvcnRlcik7DQorJFZFUlNJT04gPSAnMC4xOSc7DQorc3ViIG5ldyAoJCQ7JCQkKSB7DQorICAgIG15KCRzQ2xhc3MsICRzTmFtZSwgJHJhVGltZTFzdCwgJHJhVGltZTJuZCwgJHJhQ2hpbGQpID0gQF87DQorICAgIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6Ol9uZXcoDQorICAgICAgICAkc0NsYXNzLA0KKyAgICAgICAgdW5kZWYsDQorICAgICAgICAkc05hbWUsDQorICAgICAgICAxLA0KKyAgICAgICAgdW5kZWYsDQorICAgICAgICB1bmRlZiwNCisgICAgICAgIHVuZGVmLA0KKyAgICAgICAgJHJhVGltZTFzdCwNCisgICAgICAgICRyYVRpbWUybmQsDQorICAgICAgICB1bmRlZiwNCisgICAgICAgIHVuZGVmLA0KKyAgICAgICAgdW5kZWYsDQorICAgICAgICAkcmFDaGlsZCk7DQorfQ0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjIE9MRTo6U3RvcmFnZV9MaXRlDQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK3BhY2thZ2UgT0xFOjpTdG9yYWdlX0xpdGU7DQorcmVxdWlyZSBFeHBvcnRlcjsNCisNCit1c2Ugc3RyaWN0Ow0KK3VzZSBJTzo6RmlsZTsNCit1c2UgVGltZTo6TG9jYWwgJ3RpbWVnbSc7DQorDQordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSBARVhQT1JUKTsNCitASVNBID0gcXcoRXhwb3J0ZXIpOw0KKyRWRVJTSU9OID0gJzAuMTknOw0KK3N1YiBfZ2V0UHBzU2VhcmNoKCQkJCQkOyQpOw0KK3N1YiBfZ2V0UHBzVHJlZSgkJCQ7JCk7DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQ29uc3QgZm9yIE9MRTo6U3RvcmFnZV9MaXRlDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMwLiBDb25zdGFudHMNCitzdWIgUHBzVHlwZV9Sb290IHs1fTsNCitzdWIgUHBzVHlwZV9EaXIgIHsxfTsNCitzdWIgUHBzVHlwZV9GaWxlIHsyfTsNCitzdWIgRGF0YVNpemVTbWFsbHsweDEwMDB9Ow0KK3N1YiBMb25nSW50U2l6ZSAgezR9Ow0KK3N1YiBQcHNTaXplICAgICAgezB4ODB9Ow0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIG5ldyBPTEU6OlN0b3JhZ2VfTGl0ZQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgbmV3KCQkKSB7DQorICBteSgkc0NsYXNzLCAkc0ZpbGUpID0gQF87DQorICBteSAkb1RoaXMgPSB7DQorICAgIF9GSUxFID0+ICRzRmlsZSwNCisgIH07DQorICBibGVzcyAkb1RoaXM7DQorICByZXR1cm4gJG9UaGlzOw0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBnZXRQcHNUcmVlOiBPTEU6OlN0b3JhZ2VfTGl0ZQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgZ2V0UHBzVHJlZSgkOyQpDQorew0KKyAgbXkoJG9UaGlzLCAkYkRhdGEpID0gQF87DQorIzAuSW5pdA0KKyAgbXkgJHJoSW5mbyA9IF9pbml0UGFyc2UoJG9UaGlzLT57X0ZJTEV9KTsNCisgIHJldHVybiB1bmRlZiB1bmxlc3MoJHJoSW5mbyk7DQorIzEuIEdldCBEYXRhDQorICBteSAoJG9QcHMpID0gX2dldFBwc1RyZWUoMCwgJHJoSW5mbywgJGJEYXRhKTsNCisgIGNsb3NlKElOKTsNCisgIHJldHVybiAkb1BwczsNCit9DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgZ2V0U2VhcmNoOiBPTEU6OlN0b3JhZ2VfTGl0ZQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgZ2V0UHBzU2VhcmNoKCQkOyQkKQ0KK3sNCisgIG15KCRvVGhpcywgJHJhTmFtZSwgJGJEYXRhLCAkaUNhc2UpID0gQF87DQorIzAuSW5pdA0KKyAgbXkgJHJoSW5mbyA9IF9pbml0UGFyc2UoJG9UaGlzLT57X0ZJTEV9KTsNCisgIHJldHVybiB1bmRlZiB1bmxlc3MoJHJoSW5mbyk7DQorIzEuIEdldCBEYXRhDQorICBteSBAYUxpc3QgPSBfZ2V0UHBzU2VhcmNoKDAsICRyaEluZm8sICRyYU5hbWUsICRiRGF0YSwgJGlDYXNlKTsNCisgIGNsb3NlKElOKTsNCisgIHJldHVybiBAYUxpc3Q7DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGdldE50aFBwczogT0xFOjpTdG9yYWdlX0xpdGUNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIGdldE50aFBwcygkJDskKQ0KK3sNCisgIG15KCRvVGhpcywgJGlObywgJGJEYXRhKSA9IEBfOw0KKyMwLkluaXQNCisgIG15ICRyaEluZm8gPSBfaW5pdFBhcnNlKCRvVGhpcy0+e19GSUxFfSk7DQorICByZXR1cm4gdW5kZWYgdW5sZXNzKCRyaEluZm8pOw0KKyMxLiBHZXQgRGF0YQ0KKyAgbXkgJG9QcHMgPSBfZ2V0TnRoUHBzKCRpTm8sICRyaEluZm8sICRiRGF0YSk7DQorICBjbG9zZSBJTjsNCisgIHJldHVybiAkb1BwczsNCit9DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgX2luaXRQYXJzZTogT0xFOjpTdG9yYWdlX0xpdGUNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9pbml0UGFyc2UoJCkgew0KKyAgbXkoJHNGaWxlKT1AXzsNCisgIG15ICRvSW87DQorICAjMS4gJHNGaWxlIGlzIFJlZiBvZiBzY2FsYXINCisgIGlmKHJlZigkc0ZpbGUpIGVxICdTQ0FMQVInKSB7DQorICAgIHJlcXVpcmUgSU86OlNjYWxhcjsNCisgICAgJG9JbyA9IG5ldyBJTzo6U2NhbGFyOw0KKyAgICAkb0lvLT5vcGVuKCRzRmlsZSk7DQorICB9DQorICAjMi4gJHNGaWxlIGlzIGEgSU86OkhhbmRsZSBvYmplY3QNCisgIGVsc2lmKFVOSVZFUlNBTDo6aXNhKCRzRmlsZSwgJ0lPOjpIYW5kbGUnKSkgew0KKyAgICAkb0lvID0gJHNGaWxlOw0KKyAgICBiaW5tb2RlKCRvSW8pOw0KKyAgfQ0KKyAgIzMuICRzRmlsZSBpcyBhIHNpbXBsZSBmaWxlbmFtZSBzdHJpbmcNCisgIGVsc2lmKCFyZWYoJHNGaWxlKSkgew0KKyAgICAkb0lvID0gbmV3IElPOjpGaWxlOw0KKyAgICAkb0lvLT5vcGVuKCI8JHNGaWxlIikgfHwgcmV0dXJuIHVuZGVmOw0KKyAgICBiaW5tb2RlKCRvSW8pOw0KKyAgfQ0KKyAgIzQgQXNzdW1lIHRoYXQgaWYgJHNGaWxlIGlzIGEgcmVmIHRoZW4gaXQgaXMgYSB2YWxpZCBmaWxlaGFuZGxlDQorICBlbHNlIHsNCisgICAgJG9JbyA9ICRzRmlsZTsNCisgICAgIyBOb3QgYWxsIGZpbGVoYW5kbGVzIHN1cHBvcnQgYmlubW9kZSgpIHNvIHRyeSBpdCBpbiBhbiBldmFsLg0KKyAgICBldmFseyBiaW5tb2RlICRvSW8gfTsNCisgIH0NCisgIHJldHVybiBfZ2V0SGVhZGVySW5mbygkb0lvKTsNCit9DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgX2dldFBwc1RyZWU6IE9MRTo6U3RvcmFnZV9MaXRlDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3N1YiBfZ2V0UHBzVHJlZSgkJCQ7JCkgew0KKyAgbXkoJGlObywgJHJoSW5mbywgJGJEYXRhLCAkcmFEb25lKSA9IEBfOw0KKyAgaWYoZGVmaW5lZCgkcmFEb25lKSkgew0KKyAgICByZXR1cm4gKCkgaWYoZ3JlcCB7JF8gPT0kaU5vfSBAJHJhRG9uZSk7DQorICB9DQorICBlbHNlIHsNCisgICAgJHJhRG9uZT1bXTsNCisgIH0NCisgIHB1c2ggQCRyYURvbmUsICRpTm87DQorDQorICBteSAkaVJvb3RCbG9jayA9ICRyaEluZm8tPntfUk9PVF9TVEFSVH0gOw0KKyMxLiBHZXQgSW5mb3JtYXRpb24gYWJvdXQgaXRzZWxmDQorICBteSAkb1BwcyA9IF9nZXROdGhQcHMoJGlObywgJHJoSW5mbywgJGJEYXRhKTsNCisjMi4gQ2hpbGQNCisgIGlmKCRvUHBzLT57RGlyUHBzfSAhPSAgMHhGRkZGRkZGRikgew0KKyAgICBteSBAYUNoaWxkTCA9IF9nZXRQcHNUcmVlKCRvUHBzLT57RGlyUHBzfSwgJHJoSW5mbywgJGJEYXRhLCAkcmFEb25lKTsNCisgICAgJG9QcHMtPntDaGlsZH0gPSAgXEBhQ2hpbGRMOw0KKyAgfQ0KKyAgZWxzZSB7DQorICAgICRvUHBzLT57Q2hpbGR9ID0gIHVuZGVmOw0KKyAgfQ0KKyMzLiBQcmV2aW91cyxOZXh0IFBQU3MNCisgIG15IEBhTGlzdCA9ICgpOw0KKyAgcHVzaCBAYUxpc3QsIF9nZXRQcHNUcmVlKCRvUHBzLT57UHJldlBwc30sICRyaEluZm8sICRiRGF0YSwgJHJhRG9uZSkNCisgICAgICAgICAgICAgICAgICAgICAgICBpZigkb1Bwcy0+e1ByZXZQcHN9ICE9IDB4RkZGRkZGRkYpOw0KKyAgcHVzaCBAYUxpc3QsICRvUHBzOw0KKyAgcHVzaCBAYUxpc3QsIF9nZXRQcHNUcmVlKCRvUHBzLT57TmV4dFBwc30sICRyaEluZm8sICRiRGF0YSwgJHJhRG9uZSkNCisgICAgICAgICAgICAgICAgaWYoJG9QcHMtPntOZXh0UHBzfSAhPSAweEZGRkZGRkZGKTsNCisgIHJldHVybiBAYUxpc3Q7DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9nZXRQcHNTZWFyY2g6IE9MRTo6U3RvcmFnZV9MaXRlDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3N1YiBfZ2V0UHBzU2VhcmNoKCQkJCQkOyQpIHsNCisgIG15KCRpTm8sICRyaEluZm8sICRyYU5hbWUsICRiRGF0YSwgJGlDYXNlLCAkcmFEb25lKSA9IEBfOw0KKyAgbXkgJGlSb290QmxvY2sgPSAkcmhJbmZvLT57X1JPT1RfU1RBUlR9IDsNCisgIG15IEBhUmVzOw0KKyMxLiBDaGVjayBpdCBzZWxmDQorICBpZihkZWZpbmVkKCRyYURvbmUpKSB7DQorICAgIHJldHVybiAoKSBpZihncmVwIHskXz09JGlOb30gQCRyYURvbmUpOw0KKyAgfQ0KKyAgZWxzZSB7DQorICAgICRyYURvbmU9W107DQorICB9DQorICBwdXNoIEAkcmFEb25lLCAkaU5vOw0KKyAgbXkgJG9QcHMgPSBfZ2V0TnRoUHBzKCRpTm8sICRyaEluZm8sIHVuZGVmKTsNCisjICBpZihncmVwKCRfIGVxICRvUHBzLT57TmFtZX0sIEAkcmFOYW1lKSkgew0KKyAgaWYoKCRpQ2FzZSAmJiAoZ3JlcCgvXlxRJG9QcHMtPntOYW1lfVxFJC9pLCBAJHJhTmFtZSkpKSB8fA0KKyAgICAgKGdyZXAoJF8gZXEgJG9QcHMtPntOYW1lfSwgQCRyYU5hbWUpKSkgew0KKyAgICAkb1BwcyA9IF9nZXROdGhQcHMoJGlObywgJHJoSW5mbywgJGJEYXRhKSBpZiAoJGJEYXRhKTsNCisgICAgQGFSZXMgPSAoJG9QcHMpOw0KKyAgfQ0KKyAgZWxzZSB7DQorICAgIEBhUmVzID0gKCk7DQorICB9DQorIzIuIENoZWNrIENoaWxkLCBQcmV2aW91cywgTmV4dCBQUFNzDQorICBwdXNoIEBhUmVzLCBfZ2V0UHBzU2VhcmNoKCRvUHBzLT57RGlyUHBzfSwgICRyaEluZm8sICRyYU5hbWUsICRiRGF0YSwgJGlDYXNlLCAkcmFEb25lKQ0KKyAgICAgICAgaWYoJG9QcHMtPntEaXJQcHN9ICE9ICAweEZGRkZGRkZGKSA7DQorICBwdXNoIEBhUmVzLCBfZ2V0UHBzU2VhcmNoKCRvUHBzLT57UHJldlBwc30sICRyaEluZm8sICRyYU5hbWUsICRiRGF0YSwgJGlDYXNlLCAkcmFEb25lKQ0KKyAgICAgICAgaWYoJG9QcHMtPntQcmV2UHBzfSAhPSAweEZGRkZGRkZGICk7DQorICBwdXNoIEBhUmVzLCBfZ2V0UHBzU2VhcmNoKCRvUHBzLT57TmV4dFBwc30sICRyaEluZm8sICRyYU5hbWUsICRiRGF0YSwgJGlDYXNlLCAkcmFEb25lKQ0KKyAgICAgICAgaWYoJG9QcHMtPntOZXh0UHBzfSAhPSAweEZGRkZGRkZGKTsNCisgIHJldHVybiBAYVJlczsNCit9DQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjIEdldCBIZWFkZXIgSW5mbyAoQkFTRSBJbmZvcm1haW4gYWJvdXQgdGhhdCBmaWxlKQ0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorc3ViIF9nZXRIZWFkZXJJbmZvKCQpew0KKyAgbXkoJEZJTEUpID0gQF87DQorICBteSgkaVdrKTsNCisgIG15ICRyaEluZm8gPSB7fTsNCisgICRyaEluZm8tPntfRklMRUhffSA9ICRGSUxFOw0KKyAgbXkgJHNXazsNCisjMC4gQ2hlY2sgSUQNCisgICRyaEluZm8tPntfRklMRUhffS0+c2VlaygwLCAwKTsNCisgICRyaEluZm8tPntfRklMRUhffS0+cmVhZCgkc1drLCA4KTsNCisgIHJldHVybiB1bmRlZiB1bmxlc3MoJHNXayBlcSAiXHhEMFx4Q0ZceDExXHhFMFx4QTFceEIxXHgxQVx4RTEiKTsNCisjQklHIEJMT0NLIFNJWkUNCisgICRpV2sgPSBfZ2V0SW5mb0Zyb21GaWxlKCRyaEluZm8tPntfRklMRUhffSwgMHgxRSwgMiwgInYiKTsNCisgIHJldHVybiB1bmRlZiB1bmxlc3MoZGVmaW5lZCgkaVdrKSk7DQorICAkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfSA9IDIgKiogJGlXazsNCisjU01BTEwgQkxPQ0sgU0laRQ0KKyAgJGlXayA9IF9nZXRJbmZvRnJvbUZpbGUoJHJoSW5mby0+e19GSUxFSF99LCAweDIwLCAyLCAidiIpOw0KKyAgcmV0dXJuIHVuZGVmIHVubGVzcyhkZWZpbmVkKCRpV2spKTsNCisgICRyaEluZm8tPntfU01BTExfQkxPQ0tfU0laRX0gPSAyICoqICRpV2s7DQorI0JEQiBDb3VudA0KKyAgJGlXayA9IF9nZXRJbmZvRnJvbUZpbGUoJHJoSW5mby0+e19GSUxFSF99LCAweDJDLCA0LCAiViIpOw0KKyAgcmV0dXJuIHVuZGVmIHVubGVzcyhkZWZpbmVkKCRpV2spKTsNCisgICRyaEluZm8tPntfQkRCX0NPVU5UfSA9ICRpV2s7DQorI1NUQVJUIEJMT0NLDQorICAkaVdrID0gX2dldEluZm9Gcm9tRmlsZSgkcmhJbmZvLT57X0ZJTEVIX30sIDB4MzAsIDQsICJWIik7DQorICByZXR1cm4gdW5kZWYgdW5sZXNzKGRlZmluZWQoJGlXaykpOw0KKyAgJHJoSW5mby0+e19ST09UX1NUQVJUfSA9ICRpV2s7DQorI01JTiBTSVpFIE9GIEJCDQorIyAgJGlXayA9IF9nZXRJbmZvRnJvbUZpbGUoJHJoSW5mby0+e19GSUxFSF99LCAweDM4LCA0LCAiViIpOw0KKyMgIHJldHVybiB1bmRlZiB1bmxlc3MoZGVmaW5lZCgkaVdrKSk7DQorIyAgJHJoSW5mby0+e19NSU5fU0laRV9CQn0gPSAkaVdrOw0KKyNTTUFMTCBCRCBTVEFSVA0KKyAgJGlXayA9IF9nZXRJbmZvRnJvbUZpbGUoJHJoSW5mby0+e19GSUxFSF99LCAweDNDLCA0LCAiViIpOw0KKyAgcmV0dXJuIHVuZGVmIHVubGVzcyhkZWZpbmVkKCRpV2spKTsNCisgICRyaEluZm8tPntfU0JEX1NUQVJUfSA9ICRpV2s7DQorI1NNQUxMIEJEIENPVU5UDQorICAkaVdrID0gX2dldEluZm9Gcm9tRmlsZSgkcmhJbmZvLT57X0ZJTEVIX30sIDB4NDAsIDQsICJWIik7DQorICByZXR1cm4gdW5kZWYgdW5sZXNzKGRlZmluZWQoJGlXaykpOw0KKyAgJHJoSW5mby0+e19TQkRfQ09VTlR9ID0gJGlXazsNCisjRVhUUkEgQkJEIFNUQVJUDQorICAkaVdrID0gX2dldEluZm9Gcm9tRmlsZSgkcmhJbmZvLT57X0ZJTEVIX30sIDB4NDQsIDQsICJWIik7DQorICByZXR1cm4gdW5kZWYgdW5sZXNzKGRlZmluZWQoJGlXaykpOw0KKyAgJHJoSW5mby0+e19FWFRSQV9CQkRfU1RBUlR9ID0gJGlXazsNCisjRVhUUkEgQkQgQ09VTlQNCisgICRpV2sgPSBfZ2V0SW5mb0Zyb21GaWxlKCRyaEluZm8tPntfRklMRUhffSwgMHg0OCwgNCwgIlYiKTsNCisgIHJldHVybiB1bmRlZiB1bmxlc3MoZGVmaW5lZCgkaVdrKSk7DQorICAkcmhJbmZvLT57X0VYVFJBX0JCRF9DT1VOVH0gPSAkaVdrOw0KKyNHRVQgQkJEIElORk8NCisgICRyaEluZm8tPntfQkJEX0lORk99PSBfZ2V0QmJkSW5mbygkcmhJbmZvKTsNCisjR0VUIFJPT1QgUFBTDQorICBteSAkb1Jvb3QgPSBfZ2V0TnRoUHBzKDAsICRyaEluZm8sIHVuZGVmKTsNCisgICRyaEluZm8tPntfU0JfU1RBUlR9ID0gJG9Sb290LT57U3RhcnRCbG9ja307DQorICAkcmhJbmZvLT57X1NCX1NJWkV9ICA9ICRvUm9vdC0+e1NpemV9Ow0KKyAgcmV0dXJuICRyaEluZm87DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9nZXRJbmZvRnJvbUZpbGUNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9nZXRJbmZvRnJvbUZpbGUoJCQkJCkgew0KKyAgbXkoJEZJTEUsICRpUG9zLCAkaUxlbiwgJHNGbXQpID1AXzsNCisgIG15KCRzV2spOw0KKyAgcmV0dXJuIHVuZGVmIHVubGVzcygkRklMRSk7DQorICByZXR1cm4gdW5kZWYgaWYoJEZJTEUtPnNlZWsoJGlQb3MsIDApPT0wKTsNCisgIHJldHVybiB1bmRlZiBpZigkRklMRS0+cmVhZCgkc1drLCAgJGlMZW4pIT0kaUxlbik7DQorICByZXR1cm4gdW5wYWNrKCRzRm10LCAkc1drKTsNCit9DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgX2dldEJiZEluZm8NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9nZXRCYmRJbmZvKCQpIHsNCisgIG15KCRyaEluZm8pID1AXzsNCisgIG15IEBhQmRMaXN0ID0gKCk7DQorICBteSAkaUJkYkNudCA9ICRyaEluZm8tPntfQkRCX0NPVU5UfTsNCisgIG15ICRpR2V0Q250Ow0KKyAgbXkgJHNXazsNCisgIG15ICRpMXN0Q250ID0gaW50KCgkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfSAtIDB4NEMpIC8gT0xFOjpTdG9yYWdlX0xpdGU6OkxvbmdJbnRTaXplKCkpOw0KKyAgbXkgJGlCZGxDbnQgPSBpbnQoJHJoSW5mby0+e19CSUdfQkxPQ0tfU0laRX0gLyBPTEU6OlN0b3JhZ2VfTGl0ZTo6TG9uZ0ludFNpemUoKSkgLSAxOw0KKw0KKyMxLiAxc3QgQkRsaXN0DQorICAkcmhJbmZvLT57X0ZJTEVIX30tPnNlZWsoMHg0QywgMCk7DQorICAkaUdldENudCA9ICgkaUJkYkNudCA8ICRpMXN0Q250KT8gJGlCZGJDbnQ6ICRpMXN0Q250Ow0KKyAgJHJoSW5mby0+e19GSUxFSF99LT5yZWFkKCRzV2ssIE9MRTo6U3RvcmFnZV9MaXRlOjpMb25nSW50U2l6ZSgpKiRpR2V0Q250KTsNCisgIHB1c2ggQGFCZExpc3QsIHVucGFjaygiViRpR2V0Q250IiwgJHNXayk7DQorICAkaUJkYkNudCAtPSAkaUdldENudDsNCisjMi4gRXh0cmEgQkRMaXN0DQorICBteSAkaUJsb2NrID0gJHJoSW5mby0+e19FWFRSQV9CQkRfU1RBUlR9Ow0KKyAgd2hpbGUoKCRpQmRiQ250PiAwKSAmJiBfaXNOb3JtYWxCbG9jaygkaUJsb2NrKSl7DQorICAgIF9zZXRGaWxlUG9zKCRpQmxvY2ssIDAsICRyaEluZm8pOw0KKyAgICAkaUdldENudD0gKCRpQmRiQ250IDwgJGlCZGxDbnQpPyAkaUJkYkNudDogJGlCZGxDbnQ7DQorICAgICRyaEluZm8tPntfRklMRUhffS0+cmVhZCgkc1drLCBPTEU6OlN0b3JhZ2VfTGl0ZTo6TG9uZ0ludFNpemUoKSokaUdldENudCk7DQorICAgIHB1c2ggQGFCZExpc3QsIHVucGFjaygiViRpR2V0Q250IiwgJHNXayk7DQorICAgICRpQmRiQ250IC09ICRpR2V0Q250Ow0KKyAgICAkcmhJbmZvLT57X0ZJTEVIX30tPnJlYWQoJHNXaywgT0xFOjpTdG9yYWdlX0xpdGU6OkxvbmdJbnRTaXplKCkpOw0KKyAgICAkaUJsb2NrID0gdW5wYWNrKCJWIiwgJHNXayk7DQorICB9DQorIzMuR2V0IEJEcw0KKyAgbXkgQGFXazsNCisgIG15ICVoQmQ7DQorICBteSAkaUJsa05vID0gMDsNCisgIG15ICRpQmRMOw0KKyAgbXkgJGk7DQorICBteSAkaUJkQ250ID0gaW50KCRyaEluZm8tPntfQklHX0JMT0NLX1NJWkV9IC8gT0xFOjpTdG9yYWdlX0xpdGU6OkxvbmdJbnRTaXplKCkpOw0KKyAgZm9yZWFjaCAkaUJkTCAoQGFCZExpc3QpIHsNCisgICAgX3NldEZpbGVQb3MoJGlCZEwsIDAsICRyaEluZm8pOw0KKyAgICAkcmhJbmZvLT57X0ZJTEVIX30tPnJlYWQoJHNXaywgJHJoSW5mby0+e19CSUdfQkxPQ0tfU0laRX0pOw0KKyAgICBAYVdrID0gdW5wYWNrKCJWJGlCZENudCIsICRzV2spOw0KKyAgICBmb3IoJGk9MDskaTwkaUJkQ250OyRpKyssICRpQmxrTm8rKykgew0KKyAgICAgICBpZigkYVdrWyRpXSAhPSAoJGlCbGtObysxKSl7DQorICAgICAgICAgICAgJGhCZHskaUJsa05vfSA9ICRhV2tbJGldOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gXCVoQmQ7DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGdldE50aFBwcyAoT0xFOjpTdG9yYWdlX0xpdGUpDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3N1YiBfZ2V0TnRoUHBzKCQkJCl7DQorICBteSgkaVBvcywgJHJoSW5mbywgJGJEYXRhKSA9IEBfOw0KKyAgbXkoJGlQcHNTdGFydCkgPSAoJHJoSW5mby0+e19ST09UX1NUQVJUfSk7DQorICBteSgkaVBwc0Jsb2NrLCAkaVBwc1Bvcyk7DQorICBteSAkc1drOw0KKyAgbXkgJGlCbG9jazsNCisNCisgIG15ICRpQmFzZUNudCA9ICRyaEluZm8tPntfQklHX0JMT0NLX1NJWkV9IC8gT0xFOjpTdG9yYWdlX0xpdGU6OlBwc1NpemUoKTsNCisgICRpUHBzQmxvY2sgPSBpbnQoJGlQb3MgLyAkaUJhc2VDbnQpOw0KKyAgJGlQcHNQb3MgICA9ICRpUG9zICUgJGlCYXNlQ250Ow0KKw0KKyAgJGlCbG9jayA9IF9nZXROdGhCbG9ja05vKCRpUHBzU3RhcnQsICRpUHBzQmxvY2ssICRyaEluZm8pOw0KKyAgcmV0dXJuIHVuZGVmIHVubGVzcyhkZWZpbmVkKCRpQmxvY2spKTsNCisNCisgIF9zZXRGaWxlUG9zKCRpQmxvY2ssIE9MRTo6U3RvcmFnZV9MaXRlOjpQcHNTaXplKCkqJGlQcHNQb3MsICRyaEluZm8pOw0KKyAgJHJoSW5mby0+e19GSUxFSF99LT5yZWFkKCRzV2ssIE9MRTo6U3RvcmFnZV9MaXRlOjpQcHNTaXplKCkpOw0KKyAgcmV0dXJuIHVuZGVmIHVubGVzcygkc1drKTsNCisgIG15ICRpTm1TaXplID0gdW5wYWNrKCJ2Iiwgc3Vic3RyKCRzV2ssIDB4NDAsIDIpKTsNCisgICRpTm1TaXplID0gKCRpTm1TaXplID4gMik/ICRpTm1TaXplIC0gMiA6ICRpTm1TaXplOw0KKyAgbXkgJHNObT0gc3Vic3RyKCRzV2ssIDAsICRpTm1TaXplKTsNCisgIG15ICRpVHlwZSA9IHVucGFjaygiQyIsIHN1YnN0cigkc1drLCAweDQyLCAyKSk7DQorICBteSAkbFBwc1ByZXYgPSB1bnBhY2soIlYiLCBzdWJzdHIoJHNXaywgMHg0NCwgT0xFOjpTdG9yYWdlX0xpdGU6OkxvbmdJbnRTaXplKCkpKTsNCisgIG15ICRsUHBzTmV4dCA9IHVucGFjaygiViIsIHN1YnN0cigkc1drLCAweDQ4LCBPTEU6OlN0b3JhZ2VfTGl0ZTo6TG9uZ0ludFNpemUoKSkpOw0KKyAgbXkgJGxEaXJQcHMgID0gdW5wYWNrKCJWIiwgc3Vic3RyKCRzV2ssIDB4NEMsIE9MRTo6U3RvcmFnZV9MaXRlOjpMb25nSW50U2l6ZSgpKSk7DQorICBteSBAcmFUaW1lMXN0ID0NCisgICAgICAgICgoJGlUeXBlID09IE9MRTo6U3RvcmFnZV9MaXRlOjpQcHNUeXBlX1Jvb3QoKSkgb3IgKCRpVHlwZSA9PSBPTEU6OlN0b3JhZ2VfTGl0ZTo6UHBzVHlwZV9EaXIoKSkpPw0KKyAgICAgICAgICAgIE9MRURhdGUyTG9jYWwoc3Vic3RyKCRzV2ssIDB4NjQsIDgpKSA6IHVuZGVmICwNCisgIG15IEByYVRpbWUybmQgPQ0KKyAgICAgICAgKCgkaVR5cGUgPT0gT0xFOjpTdG9yYWdlX0xpdGU6OlBwc1R5cGVfUm9vdCgpKSBvciAoJGlUeXBlID09IE9MRTo6U3RvcmFnZV9MaXRlOjpQcHNUeXBlX0RpcigpKSk/DQorICAgICAgICAgICAgT0xFRGF0ZTJMb2NhbChzdWJzdHIoJHNXaywgMHg2QywgOCkpIDogdW5kZWYsDQorICBteSgkaVN0YXJ0LCAkaVNpemUpID0gdW5wYWNrKCJWViIsIHN1YnN0cigkc1drLCAweDc0LCA4KSk7DQorICBpZigkYkRhdGEpIHsNCisgICAgICBteSAkc0RhdGEgPSBfZ2V0RGF0YSgkaVR5cGUsICRpU3RhcnQsICRpU2l6ZSwgJHJoSW5mbyk7DQorICAgICAgcmV0dXJuIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFMtPm5ldygNCisgICAgICAgICRpUG9zLCAkc05tLCAkaVR5cGUsICRsUHBzUHJldiwgJGxQcHNOZXh0LCAkbERpclBwcywNCisgICAgICAgIFxAcmFUaW1lMXN0LCBcQHJhVGltZTJuZCwgJGlTdGFydCwgJGlTaXplLCAkc0RhdGEsIHVuZGVmKTsNCisgIH0NCisgIGVsc2Ugew0KKyAgICAgIHJldHVybiBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTLT5uZXcoDQorICAgICAgICAkaVBvcywgJHNObSwgJGlUeXBlLCAkbFBwc1ByZXYsICRsUHBzTmV4dCwgJGxEaXJQcHMsDQorICAgICAgICBcQHJhVGltZTFzdCwgXEByYVRpbWUybmQsICRpU3RhcnQsICRpU2l6ZSwgdW5kZWYsIHVuZGVmKTsNCisgIH0NCit9DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgX3NldEZpbGVQb3MgKE9MRTo6U3RvcmFnZV9MaXRlKQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgX3NldEZpbGVQb3MoJCQkKXsNCisgIG15KCRpQmxvY2ssICRpUG9zLCAkcmhJbmZvKSA9IEBfOw0KKyAgJHJoSW5mby0+e19GSUxFSF99LT5zZWVrKCgkaUJsb2NrKzEpKiRyaEluZm8tPntfQklHX0JMT0NLX1NJWkV9KyRpUG9zLCAwKTsNCit9DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgX2dldE50aEJsb2NrTm8gKE9MRTo6U3RvcmFnZV9MaXRlKQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgX2dldE50aEJsb2NrTm8oJCQkKXsNCisgIG15KCRpU3RCbG9jaywgJGlOdGgsICRyaEluZm8pID0gQF87DQorICBteSAkaVN2Ow0KKyAgbXkgJGlOZXh0ID0gJGlTdEJsb2NrOw0KKyAgZm9yKG15ICRpID0wOyAkaTwkaU50aDsgJGkrKykgew0KKyAgICAkaVN2ID0gJGlOZXh0Ow0KKyAgICAkaU5leHQgPSBfZ2V0TmV4dEJsb2NrTm8oJGlTdiwgJHJoSW5mbyk7DQorICAgIHJldHVybiB1bmRlZiB1bmxlc3MgX2lzTm9ybWFsQmxvY2soJGlOZXh0KTsNCisgIH0NCisgIHJldHVybiAkaU5leHQ7DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9nZXREYXRhIChPTEU6OlN0b3JhZ2VfTGl0ZSkNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9nZXREYXRhKCQkJCQpDQorew0KKyAgbXkoJGlUeXBlLCAkaUJsb2NrLCAkaVNpemUsICRyaEluZm8pID0gQF87DQorICBpZiAoJGlUeXBlID09IE9MRTo6U3RvcmFnZV9MaXRlOjpQcHNUeXBlX0ZpbGUoKSkgew0KKyAgICBpZigkaVNpemUgPCBPTEU6OlN0b3JhZ2VfTGl0ZTo6RGF0YVNpemVTbWFsbCgpKSB7DQorICAgICAgICByZXR1cm4gX2dldFNtYWxsRGF0YSgkaUJsb2NrLCAkaVNpemUsICRyaEluZm8pOw0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIF9nZXRCaWdEYXRhKCRpQmxvY2ssICRpU2l6ZSwgJHJoSW5mbyk7DQorICAgIH0NCisgIH0NCisgIGVsc2lmKCRpVHlwZSA9PSBPTEU6OlN0b3JhZ2VfTGl0ZTo6UHBzVHlwZV9Sb290KCkpIHsgICNSb290DQorICAgIHJldHVybiBfZ2V0QmlnRGF0YSgkaUJsb2NrLCAkaVNpemUsICRyaEluZm8pOw0KKyAgfQ0KKyAgZWxzaWYoJGlUeXBlID09IE9MRTo6U3RvcmFnZV9MaXRlOjpQcHNUeXBlX0RpcigpKSB7ICAjIERpcmVjdG9yeQ0KKyAgICByZXR1cm4gdW5kZWY7DQorICB9DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9nZXRCaWdEYXRhIChPTEU6OlN0b3JhZ2VfTGl0ZSkNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9nZXRCaWdEYXRhKCQkJCkNCit7DQorICBteSgkaUJsb2NrLCAkaVNpemUsICRyaEluZm8pID0gQF87DQorICBteSgkaVJlc3QsICRzV2ssICRzUmVzKTsNCisNCisgIHJldHVybiAnJyB1bmxlc3MoX2lzTm9ybWFsQmxvY2soJGlCbG9jaykpOw0KKyAgJGlSZXN0ID0gJGlTaXplOw0KKyAgbXkoJGksICRpR2V0U2l6ZSwgJGlOZXh0KTsNCisgICRzUmVzID0gJyc7DQorICBteSBAYUtleXM9IHNvcnQoeyRhPD0+JGJ9IGtleXMoJXskcmhJbmZvLT57X0JCRF9JTkZPfX0pKTsNCisNCisgIHdoaWxlICgkaVJlc3QgPiAwKSB7DQorICAgIG15IEBhUmVzID0gZ3JlcCgkXyA+PSAkaUJsb2NrLCBAYUtleXMpOw0KKyAgICBteSAkaU5LZXkgPSAkYVJlc1swXTsNCisgICAgJGkgPSAkaU5LZXkgLSAkaUJsb2NrOw0KKyAgICAkaU5leHQgPSAkcmhJbmZvLT57X0JCRF9JTkZPfXskaU5LZXl9Ow0KKyAgICBfc2V0RmlsZVBvcygkaUJsb2NrLCAwLCAkcmhJbmZvKTsNCisgICAgbXkgJGlHZXRTaXplID0gKCRyaEluZm8tPntfQklHX0JMT0NLX1NJWkV9ICogKCRpKzEpKTsNCisgICAgJGlHZXRTaXplID0gJGlSZXN0IGlmKCRpUmVzdCA8ICRpR2V0U2l6ZSk7DQorICAgICRyaEluZm8tPntfRklMRUhffS0+cmVhZCggJHNXaywgJGlHZXRTaXplKTsNCisgICAgJHNSZXMgLj0gJHNXazsNCisgICAgJGlSZXN0IC09ICRpR2V0U2l6ZTsNCisgICAgJGlCbG9jaz0gJGlOZXh0Ow0KKyAgfQ0KKyAgcmV0dXJuICRzUmVzOw0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBfZ2V0TmV4dEJsb2NrTm8gKE9MRTo6U3RvcmFnZV9MaXRlKQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgX2dldE5leHRCbG9ja05vKCQkKXsNCisgIG15KCRpQmxvY2tObywgJHJoSW5mbykgPSBAXzsNCisgIG15ICRpUmVzID0gJHJoSW5mby0+e19CQkRfSU5GT30tPnskaUJsb2NrTm99Ow0KKyAgcmV0dXJuIGRlZmluZWQoJGlSZXMpPyAkaVJlczogJGlCbG9ja05vKzE7DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9pc05vcm1hbEJsb2NrIChPTEU6OlN0b3JhZ2VfTGl0ZSkNCisjIDB4RkZGRkZGRkMgOiBCRExpc3QsIDB4RkZGRkZGRkQgOiBCQkQsDQorIyAweEZGRkZGRkZFOiBFbmQgb2YgQ2hhaW4gMHhGRkZGRkZGRiA6IHVudXNlZA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgX2lzTm9ybWFsQmxvY2soJCl7DQorICBteSgkaUJsb2NrKSA9IEBfOw0KKyAgcmV0dXJuICgkaUJsb2NrIDwgMHhGRkZGRkZGQyk/IDE6IHVuZGVmOw0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBfZ2V0U21hbGxEYXRhIChPTEU6OlN0b3JhZ2VfTGl0ZSkNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3ViIF9nZXRTbWFsbERhdGEoJCQkKQ0KK3sNCisgIG15KCRpU21CbG9jaywgJGlTaXplLCAkcmhJbmZvKSA9IEBfOw0KKyAgbXkoJHNSZXMsICRzV2spOw0KKyAgbXkgJGlSZXN0ID0gJGlTaXplOw0KKyAgJHNSZXMgPSAnJzsNCisgIHdoaWxlICgkaVJlc3QgPiAwKSB7DQorICAgIF9zZXRGaWxlUG9zU21hbGwoJGlTbUJsb2NrLCAkcmhJbmZvKTsNCisgICAgJHJoSW5mby0+e19GSUxFSF99LT5yZWFkKCRzV2ssDQorICAgICAgICAoJGlSZXN0ID49ICRyaEluZm8tPntfU01BTExfQkxPQ0tfU0laRX0pPw0KKyAgICAgICAgICAgICRyaEluZm8tPntfU01BTExfQkxPQ0tfU0laRX06ICRpUmVzdCk7DQorICAgICRzUmVzIC49ICRzV2s7DQorICAgICRpUmVzdCAtPSAkcmhJbmZvLT57X1NNQUxMX0JMT0NLX1NJWkV9Ow0KKyAgICAkaVNtQmxvY2s9IF9nZXROZXh0U21hbGxCbG9ja05vKCRpU21CbG9jaywgJHJoSW5mbyk7DQorICB9DQorICByZXR1cm4gJHNSZXM7DQorfQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIF9zZXRGaWxlUG9zU21hbGwoT0xFOjpTdG9yYWdlX0xpdGUpDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3N1YiBfc2V0RmlsZVBvc1NtYWxsKCQkKQ0KK3sNCisgIG15KCRpU21CbG9jaywgJHJoSW5mbykgPSBAXzsNCisgIG15ICRpU21TdGFydCA9ICRyaEluZm8tPntfU0JfU1RBUlR9Ow0KKyAgbXkgJGlCYXNlQ250ID0gJHJoSW5mby0+e19CSUdfQkxPQ0tfU0laRX0gLyAkcmhJbmZvLT57X1NNQUxMX0JMT0NLX1NJWkV9Ow0KKyAgbXkgJGlOdGggPSBpbnQoJGlTbUJsb2NrLyRpQmFzZUNudCk7DQorICBteSAkaVBvcyA9ICRpU21CbG9jayAlICRpQmFzZUNudDsNCisNCisgIG15ICRpQmxrID0gX2dldE50aEJsb2NrTm8oJGlTbVN0YXJ0LCAkaU50aCwgJHJoSW5mbyk7DQorICBfc2V0RmlsZVBvcygkaUJsaywgJGlQb3MgKiAkcmhJbmZvLT57X1NNQUxMX0JMT0NLX1NJWkV9LCAkcmhJbmZvKTsNCit9DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgX2dldE5leHRTbWFsbEJsb2NrTm8gKE9MRTo6U3RvcmFnZV9MaXRlKQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgX2dldE5leHRTbWFsbEJsb2NrTm8oJCQpDQorew0KKyAgbXkoJGlTbUJsb2NrLCAkcmhJbmZvKSA9IEBfOw0KKyAgbXkoJHNXayk7DQorDQorICBteSAkaUJhc2VDbnQgPSAkcmhJbmZvLT57X0JJR19CTE9DS19TSVpFfSAvIE9MRTo6U3RvcmFnZV9MaXRlOjpMb25nSW50U2l6ZSgpOw0KKyAgbXkgJGlOdGggPSBpbnQoJGlTbUJsb2NrLyRpQmFzZUNudCk7DQorICBteSAkaVBvcyA9ICRpU21CbG9jayAlICRpQmFzZUNudDsNCisgIG15ICRpQmxrID0gX2dldE50aEJsb2NrTm8oJHJoSW5mby0+e19TQkRfU1RBUlR9LCAkaU50aCwgJHJoSW5mbyk7DQorICBfc2V0RmlsZVBvcygkaUJsaywgJGlQb3MgKiBPTEU6OlN0b3JhZ2VfTGl0ZTo6TG9uZ0ludFNpemUoKSwgJHJoSW5mbyk7DQorICAkcmhJbmZvLT57X0ZJTEVIX30tPnJlYWQoJHNXaywgT0xFOjpTdG9yYWdlX0xpdGU6OkxvbmdJbnRTaXplKCkpOw0KKyAgcmV0dXJuIHVucGFjaygiViIsICRzV2spOw0KKw0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBBc2MyVWNzOiBPTEU6OlN0b3JhZ2VfTGl0ZQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgQXNjMlVjcygkKQ0KK3sNCisgIG15KCRzQXNjKSA9IEBfOw0KKyAgcmV0dXJuIGpvaW4oIlx4MDAiLCBzcGxpdCAvLywgJHNBc2MpIC4gIlx4MDAiOw0KK30NCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBVY3MyQXNjOiBPTEU6OlN0b3JhZ2VfTGl0ZQ0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitzdWIgVWNzMkFzYygkKQ0KK3sNCisgIG15KCRzVWNzKSA9IEBfOw0KKyAgcmV0dXJuIGpvaW4oJycsIG1hcChwYWNrKCdjJywgJF8pLCB1bnBhY2soJ3YqJywgJHNVY3MpKSk7DQorfQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIE9MRURhdGUyTG9jYWwoKQ0KKyMNCisjIENvbnZlcnQgZnJvbSBhIFdpbmRvdyBGSUxFVElNRSBzdHJ1Y3R1cmUgdG8gYSBsb2NhbHRpbWUgYXJyYXkuIEZJTEVUSU1FIGlzDQorIyBhIDY0LWJpdCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiAxMDAtbmFub3NlY29uZCBpbnRlcnZhbHMgc2luY2UNCisjIEphbnVhcnkgMSAxNjAxLg0KKyMNCisjIFdlIGZpcnN0IGNvbnZlcnQgdGhlIEZJTEVUSU1FIHRvIHNlY29uZHMgYW5kIHRoZW4gc3VidHJhY3QgdGhlIGRpZmZlcmVuY2UNCisjIGJldHdlZW4gdGhlIDE2MDEgZXBvY2ggYW5kIHRoZSAxOTcwIFVuaXggZXBvY2guDQorIw0KK3N1YiBPTEVEYXRlMkxvY2FsIHsNCisNCisgICAgbXkgJG9sZXRpbWUgPSBzaGlmdDsNCisNCisgICAgIyBVbnBhY2sgdGhlIEZJTEVUSU1FIGludG8gaGlnaCBhbmQgbG93IGxvbmdzLg0KKyAgICBteSAoICRsbywgJGhpICkgPSB1bnBhY2sgJ1YyJywgJG9sZXRpbWU7DQorDQorICAgICMgQ29udmVydCB0aGUgbG9uZ3MgdG8gYSBkb3VibGUuDQorICAgIG15ICRuYW5vc2Vjb25kcyA9ICRoaSAqIDIqKjMyICsgJGxvOw0KKw0KKyAgICAjIENvbnZlcnQgdGhlIDEwMCBuYW5vc2Vjb25kIHVuaXRzIGludG8gc2Vjb25kcy4NCisgICAgbXkgJHRpbWUgPSAkbmFub3NlY29uZHMgLyAxZTc7DQorDQorICAgICMgU3VidHJhY3QgdGhlIG51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gdGhlIDE2MDEgYW5kIDE5NzAgZXBvY2hzLg0KKyAgICAkdGltZSAtPSAxMTY0NDQ3MzYwMDsNCisNCisgICAgIyBDb252ZXJ0IHRvIGEgbG9jYWx0aW1lIChhY3R1YWxseSBnbXRpbWUpIHN0cnVjdHVyZS4NCisgICAgbXkgQGxvY2FsdGltZSA9IGdtdGltZSgkdGltZSk7DQorDQorICAgIHJldHVybiBAbG9jYWx0aW1lOw0KK30NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBMb2NhbERhdGUyT0xFKCkNCisjDQorIyBDb252ZXJ0IGZyb20gYSBhIGxvY2FsdGltZSBhcnJheSB0byBhIFdpbmRvdyBGSUxFVElNRSBzdHJ1Y3R1cmUuIEZJTEVUSU1FIGlzDQorIyBhIDY0LWJpdCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiAxMDAtbmFub3NlY29uZCBpbnRlcnZhbHMgc2luY2UNCisjIEphbnVhcnkgMSAxNjAxLg0KKyMNCisjIFdlIGZpcnN0IGNvbnZlcnQgdGhlIGxvY2FsdGltZSAoYWN0dWFsbHkgZ210aW1lKSB0byBzZWNvbmRzIGFuZCB0aGVuIGFkZCB0aGUNCisjIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgMTYwMSBlcG9jaCBhbmQgdGhlIDE5NzAgVW5peCBlcG9jaC4gV2UgY29udmVydCB0aGF0IHRvDQorIyAxMDAgbmFub3NlY29uZCB1bml0cywgZGl2aWRlIGl0IGludG8gaGlnaCBhbmQgbG93IGxvbmdzIGFuZCByZXR1cm4gaXQgYXMgYQ0KKyMgcGFja2VkIDY0Yml0IHN0cnVjdHVyZS4NCisjDQorc3ViIExvY2FsRGF0ZTJPTEUgew0KKw0KKyAgICBteSAkbG9jYWx0aW1lID0gc2hpZnQ7DQorDQorICAgIHJldHVybiAiXHgwMCIgeCA4IHVubGVzcyAkbG9jYWx0aW1lOw0KKw0KKyAgICAjIENvbnZlcnQgZnJvbSBsb2NhbHRpbWUgKGFjdHVhbGx5IGdtdGltZSkgdG8gc2Vjb25kcy4NCisgICAgbXkgJHRpbWUgPSB0aW1lZ20oIEB7JGxvY2FsdGltZX0gKTsNCisNCisgICAgIyBBZGQgdGhlIG51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gdGhlIDE2MDEgYW5kIDE5NzAgZXBvY2hzLg0KKyAgICAkdGltZSArPSAxMTY0NDQ3MzYwMDsNCisNCisgICAgIyBUaGUgRklMRVRJTUUgc2Vjb25kcyBhcmUgaW4gdW5pdHMgb2YgMTAwIG5hbm9zZWNvbmRzLg0KKyAgICBteSAkbmFub3NlY29uZHMgPSAkdGltZSAqIDFFNzsNCisNCit1c2UgUE9TSVggJ2Ztb2QnOw0KKw0KKyAgICAjIFBhY2sgdGhlIHRvdGFsIG5hbm9zZWNvbmRzIGludG8gNjQgYml0cy4uLg0KKyAgICBteSAkaGkgPSBpbnQoICRuYW5vc2Vjb25kcyAvIDIqKjMyICk7DQorICAgIG15ICRsbyA9IGZtb2QoJG5hbm9zZWNvbmRzLCAyKiozMik7DQorDQorICAgIG15ICRvbGV0aW1lID0gcGFjayAiVlYiLCAkbG8sICRoaTsNCisNCisgICAgcmV0dXJuICRvbGV0aW1lOw0KK30NCisNCisxOw0KK19fRU5EX18NCisNCisNCis9aGVhZDEgTkFNRQ0KKw0KK09MRTo6U3RvcmFnZV9MaXRlIC0gU2ltcGxlIENsYXNzIGZvciBPTEUgZG9jdW1lbnQgaW50ZXJmYWNlLg0KKw0KKz1oZWFkMSBTWU5PUFNJUw0KKw0KKyAgICB1c2UgT0xFOjpTdG9yYWdlX0xpdGU7DQorDQorICAgICMgSW5pdGlhbGl6ZS4NCisNCisgICAgIyBGcm9tIGEgZmlsZQ0KKyAgICBteSAkb09sID0gT0xFOjpTdG9yYWdlX0xpdGUtPm5ldygic29tZS54bHMiKTsNCisNCisgICAgIyBGcm9tIGEgZmlsZWhhbmRsZSBvYmplY3QNCisgICAgdXNlIElPOjpGaWxlOw0KKyAgICBteSAkb0lvID0gbmV3IElPOjpGaWxlOw0KKyAgICAkb0lvLT5vcGVuKCI8aW9maWxlLnhscyIpOw0KKyAgICBiaW5tb2RlKCRvSW8pOw0KKyAgICBteSAkb09sID0gT0xFOjpTdG9yYWdlX0xpdGUtPm5ldygkb0ZpbGUpOw0KKw0KKyAgICAjIFJlYWQgZGF0YQ0KKyAgICBteSAkb1BwcyA9ICRvT2wtPmdldFBwc1RyZWUoMSk7DQorDQorICAgICMgU2F2ZSBEYXRhDQorICAgICMgVG8gYSBGaWxlDQorICAgICRvUHBzLT5zYXZlKCJrYWJhLnhscyIpOyAja2FiYS54bHMNCisgICAgJG9QcHMtPnNhdmUoJy0nKTsgICAgICAgICNTVERPVVQNCisNCisgICAgIyBUbyBhIGZpbGVoYW5kbGUgb2JqZWN0DQorICAgIG15ICRvSW8gPSBuZXcgSU86OkZpbGU7DQorICAgICRvSW8tPm9wZW4oIj5pb2ZpbGUueGxzIik7DQorICAgIGJpbW9kZSgkb0lvKTsNCisgICAgJG9QcHMtPnNhdmUoJG9Jbyk7DQorDQorDQorPWhlYWQxIERFU0NSSVBUSU9ODQorDQorT0xFOjpTdG9yYWdlX0xpdGUgYWxsb3dzIHlvdSB0byByZWFkIGFuZCB3cml0ZSBhbiBPTEUgc3RydWN0dXJlZCBmaWxlLg0KKw0KK09MRTo6U3RvcmFnZV9MaXRlOjpQUFMgaXMgYSBjbGFzcyByZXByZXNlbnRpbmcgUFBTLiBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpSb290LCBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpGaWxlIGFuZCBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpEaXINCithcmUgc3ViY2xhc3NlcyBvZiBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTLg0KKw0KKw0KKz1oZWFkMiBuZXcoKQ0KKw0KK0NvbnN0cnVjdG9yLg0KKw0KKyAgICAkb09sZSA9IE9MRTo6U3RvcmFnZV9MaXRlLT5uZXcoJHNGaWxlKTsNCisNCitDcmVhdGVzIGEgT0xFOjpTdG9yYWdlX0xpdGUgb2JqZWN0IGZvciBDPCRzRmlsZT4uIEM8JHNGaWxlPiBtdXN0IGJlIGEgY29ycmVjdCBmaWxlIG5hbWUuDQorDQorVGhlIEM8bmV3KCk+IGNvbnN0cnVjdG9yIGFsc28gYWNjZXB0cyBhIHZhbGlkIGZpbGVoYW5kbGUuIFJlbWVtYmVyIHRvIEM8YmlubW9kZSgpPiB0aGUgZmlsZWhhbmRsZSBmaXJzdC4NCisNCisNCis9aGVhZDIgZ2V0UHBzVHJlZSgpDQorDQorICAgICRvUHBzUm9vdCA9ICRvT2xlLT5nZXRQcHNUcmVlKFskYkRhdGFdKTsNCisNCitSZXR1cm5zIFBQUyBhcyBhbiBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpSb290IG9iamVjdC4NCitPdGhlciBQUFMgb2JqZWN0cyB3aWxsIGJlIGluY2x1ZGVkIGFzIGl0cyBjaGlsZHJlbi4NCisNCitJZiBDPCRiRGF0YT4gaXMgdHJ1ZSwgdGhlIG9iamVjdHMgd2lsbCBoYXZlIGRhdGEgaW4gdGhlIGZpbGUuDQorDQorDQorPWhlYWQyIGdldFBwc1NlYXJjaCgpDQorDQorICAgICRvUHBzUm9vdCA9ICRvT2xlLT5nZXRQcHNUcmVlKCRyYU5hbWUgWywgJGJEYXRhXVssICRpQ2FzZV0gKTsNCisNCitSZXR1cm5zIFBQU3MgYXMgT0xFOjpTdG9yYWdlX0xpdGU6OlBQUyBvYmplY3RzIHRoYXQgaGFzIHRoZSBuYW1lIHNwZWNpZmllZCBpbiBDPCRyYU5hbWU+IGFycmF5Lg0KKw0KK0lmIEM8JGJEYXRhPiBpcyB0cnVlLCB0aGUgb2JqZWN0cyB3aWxsIGhhdmUgZGF0YSBpbiB0aGUgZmlsZS4NCitJZiBDPCRpQ2FzZT4gaXMgdHJ1ZSwgc2VhcmNoIGlzIGNhc2UgaW5zZW5zaXRpdmUuDQorDQorDQorPWhlYWQyIGdldE50aFBwcygpDQorDQorICAgICRvUHBzUm9vdCA9ICRvT2xlLT5nZXROdGhQcHMoJGlOdGggWywgJGJEYXRhXSk7DQorDQorUmV0dXJucyBQUFMgYXMgQzxPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTPiBvYmplY3Qgc3BlY2lmaWVkIG51bWJlciBDPCRpTnRoPi4NCisNCitJZiBDPCRiRGF0YT4gaXMgdHJ1ZSwgdGhlIG9iamVjdHMgd2lsbCBoYXZlIGRhdGEgaW4gdGhlIGZpbGUuDQorDQorDQorPWhlYWQyIEFzYzJVY3MoKQ0KKw0KKyAgICAkc1VjczIgPSBPTEU6OlN0b3JhZ2VfTGl0ZTo6QXNjMlVjcygkc0FzYz4pOw0KKw0KK1V0aWxpdHkgZnVuY3Rpb24uIEp1c3QgYWRkcyAweDAwIGFmdGVyIGV2ZXJ5IGNoYXJhY3RlcnMgaW4gQzwkc0FzYz4uDQorDQorDQorPWhlYWQyIFVjczJBc2MoKQ0KKw0KKyAgICAkc0FzYyA9IE9MRTo6U3RvcmFnZV9MaXRlOjpVY3MyQXNjKCRzVWNzMik7DQorDQorVXRpbGl0eSBmdW5jdGlvbi4gSnVzdCBkZWxldGVzIDB4MDAgYWZ0ZXIgd29yZHMgaW4gQzwkc1Vjcz4uDQorDQorDQorPWhlYWQxIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFMNCisNCitPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTIGhhcyB0aGVzZSBwcm9wZXJ0aWVzOg0KKw0KKz1vdmVyIDQNCisNCis9aXRlbSBObw0KKw0KK09yZGVyIG51bWJlciBpbiBzYXZpbmcuDQorDQorPWl0ZW0gTmFtZQ0KKw0KK0l0cyBuYW1lIGluIFVDUzIgKGEuay5hIFVuaWNvZGUpLg0KKw0KKz1pdGVtIFR5cGUNCisNCitJdHMgdHlwZSAoMTpEaXIsIDI6RmlsZSAoRGF0YSksIDU6IFJvb3QpDQorDQorPWl0ZW0gUHJldlBwcw0KKw0KK1ByZXZpb3VzIHBwcyAoYXMgTm8pDQorDQorPWl0ZW0gTmV4dFBwcw0KKw0KK05leHQgcHBzIChhcyBObykNCisNCis9aXRlbSBEaXJQcHMNCisNCitEaXIgcHBzIChhcyBObykuDQorDQorPWl0ZW0gVGltZTFzdA0KKw0KK1RpbWVzdGFtcCAxc3QgaW4gYXJyYXkgcmVmIGFzIHNpbWlsYXIgZm9tYXQgb2YgbG9jYWx0aW1lLg0KKw0KKz1pdGVtIFRpbWUybmQNCisNCitUaW1lc3RhbXAgMm5kIGluIGFycmF5IHJlZiBhcyBzaW1pbGFyIGZvbWF0IG9mIGxvY2FsdGltZS4NCisNCis9aXRlbSBTdGFydEJsb2NrDQorDQorU3RhcnQgYmxvY2sgbnVtYmVyDQorDQorPWl0ZW0gU2l6ZQ0KKw0KK1NpemUgb2YgdGhlIHBwcw0KKw0KKz1pdGVtIERhdGENCisNCitJdHMgZGF0YQ0KKw0KKz1pdGVtIENoaWxkDQorDQorSXRzIGNoaWxkIFBQU3MgaW4gYXJyYXkgcmVmDQorDQorPWJhY2sNCisNCisNCis9aGVhZDEgT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6Um9vdA0KKw0KK09MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OlJvb3QgaGFzIDIgbWV0aG9kcy4NCisNCis9aGVhZDIgbmV3KCkNCisNCisgICAgJG9Sb290ID0gT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6Um9vdC0+bmV3KA0KKyAgICAgICAgICAgICAgICAgICAgJHJhVGltZTFzdCwNCisgICAgICAgICAgICAgICAgICAgICRyYVRpbWUybmQsDQorICAgICAgICAgICAgICAgICAgICAkcmFDaGlsZCk7DQorDQorDQorQ29uc3RydWN0b3IuDQorDQorQzwkcmFUaW1lMXN0PiwgQzwkcmFUaW1lMm5kPiBhcmUgYXJyYXkgcmVmcyB3aXRoICgkaVNlYywgJGlNaW4sICRpSG91ciwgJGlEYXksICRpTW9uLCAkaVllYXIpLg0KKyRpU2VjIG1lYW5zIHNlY29uZHMsICRpTWluIG1lYW5zIG1pbnV0ZXMuICRpSG91ciBtZWFucyBob3Vycy4NCiskaURheSBtZWFucyBkYXkuICRpTW9uIGlzIG1vbnRoIC0xLiAkaVllYXIgaXMgeWVhciAtIDE5MDAuDQorDQorQzwkcmFDaGlsZD4gaXMgYSBhcnJheSByZWYgb2YgY2hpbGRyZW4gUFBTcy4NCisNCisNCis9aGVhZDIgc2F2ZSgpDQorDQorICAgICRvUm9vdCA9ICRvUm9vdD4tPnNhdmUoDQorICAgICAgICAgICAgICAgICAgICAkc0ZpbGUsDQorICAgICAgICAgICAgICAgICAgICAkYk5vQXMpOw0KKw0KKw0KK1NhdmVzIGluZm9ybWF0aW9uIGludG8gQzwkc0ZpbGU+LiBJZiBDPCRzRmlsZT4gaXMgJy0nLCB0aGlzIHdpbGwgdXNlIFNURE9VVC4NCisNCitUaGUgQzxuZXcoKT4gY29uc3RydWN0b3IgYWxzbyBhY2NlcHRzIGEgdmFsaWQgZmlsZWhhbmRsZS4gUmVtZW1iZXIgdG8gQzxiaW5tb2RlKCk+IHRoZSBmaWxlaGFuZGxlIGZpcnN0Lg0KKw0KK0lmIEM8JGJOb0FzPiBpcyBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgdXNlIHRoZSBObyBvZiBQUFNzIGZvciBzYXZpbmcgb3JkZXIuDQorSWYgQzwkYk5vQXM+IGlzIHVuZGVmaW5lZCwgdGhpcyB3aWxsIGNhbGN1bGF0ZSBQUFMgc2F2aW5nIG9yZGVyLg0KKw0KKw0KKz1oZWFkMSBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpEaXINCisNCitPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpEaXIgaGFzIDEgbWV0aG9kLg0KKw0KKz1oZWFkMiBuZXcoKQ0KKw0KKyAgICAkb1Jvb3QgPSBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpEaXItPm5ldygNCisgICAgICAgICAgICAgICAgICAgICRzTmFtZSwNCisgICAgICAgICAgICAgICAgICBbLCAkcmFUaW1lMXN0XQ0KKyAgICAgICAgICAgICAgICAgIFssICRyYVRpbWUybmRdDQorICAgICAgICAgICAgICAgICAgWywgJHJhQ2hpbGQ+XSk7DQorDQorDQorQ29uc3RydWN0b3IuDQorDQorQzwkc05hbWU+IGlzIGEgbmFtZSBvZiB0aGUgUFBTLg0KKw0KK0M8JHJhVGltZTFzdD4sIEM8JHJhVGltZTJuZD4gaXMgYSBhcnJheSByZWYgYXMNCisoJGlTZWMsICRpTWluLCAkaUhvdXIsICRpRGF5LCAkaU1vbiwgJGlZZWFyKS4NCiskaVNlYyBtZWFucyBzZWNvbmRzLCAkaU1pbiBtZWFucyBtaW51dGVzLiAkaUhvdXIgbWVhbnMgaG91cnMuDQorJGlEYXkgbWVhbnMgZGF5LiAkaU1vbiBpcyBtb250aCAtMS4gJGlZZWFyIGlzIHllYXIgLSAxOTAwLg0KKw0KK0M8JHJhQ2hpbGQ+IGlzIGEgYXJyYXkgcmVmIG9mIGNoaWxkcmVuIFBQU3MuDQorDQorDQorPWhlYWQxIE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OkZpbGUNCisNCitPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpGaWxlIGhhcyAzIG1ldGhvZC4NCisNCis9aGVhZDIgbmV3DQorDQorICAgICRvUm9vdCA9IE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OkZpbGUtPm5ldygkc05hbWUsICRzRGF0YSk7DQorDQorQzwkc05hbWU+IGlzIG5hbWUgb2YgdGhlIFBQUy4NCisNCitDPCRzRGF0YT4gaXMgZGF0YSBvZiB0aGUgUFBTLg0KKw0KKw0KKz1oZWFkMiBuZXdGaWxlKCkNCisNCisgICAgJG9Sb290ID0gT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6RmlsZS0+bmV3RmlsZSgkc05hbWUsICRzRmlsZSk7DQorDQorVGhpcyBmdW5jdGlvbiBtYWtlcyB0byB1c2UgZmlsZSBoYW5kbGUgZm9yIGdldGluZyBhbmQgc3RvcmluZyBkYXRhLg0KKw0KK0M8JHNOYW1lPiBpcyBuYW1lIG9mIHRoZSBQUFMuDQorDQorSWYgQzwkc0ZpbGU+IGlzIHNjYWxhciwgaXQgYXNzdW1lcyB0aGF0IGlzIGEgZmlsZW5hbWUuDQorSWYgQzwkc0ZpbGU+IGlzIGFuIElPOjpIYW5kbGUgb2JqZWN0LCBpdCB1c2VzIHRoYXQgc3BlY2lmaWVkIGhhbmRsZS4NCitJZiBDPCRzRmlsZT4gaXMgdW5kZWYgb3IgJycsIGl0IHVzZXMgdGVtcG9yYXJ5IGZpbGUuDQorDQorQ0FVVElPTjogVGFrZSBjYXJlIEM8JHNGaWxlPiB3aWxsIGJlIHVwZGF0ZWQgYnkgQzxhcHBlbmQ+IG1ldGhvZC4NCitTbyBpZiB5b3Ugd2FudCB0byB1c2UgSU86OkhhbmRsZSBhbmQgYXBwZW5kIGEgZGF0YSB0byBpdCwNCit5b3Ugc2hvdWxkIG9wZW4gdGhlIGhhbmRsZSB3aXRoICJyKyIuDQorDQorDQorPWhlYWQyIGFwcGVuZCgpDQorDQorICAgICRvUm9vdCA9ICRvUHBzLT5hcHBlbmQoJHNEYXRhKTsNCisNCithcHBlbmRzIHNwZWNpZmllZCBkYXRhIHRvIHRoYXQgUFBTLg0KKw0KK0M8JHNEYXRhPiBpcyBhcHBlbmRpbmcgZGF0YSBmb3IgdGhhdCBQUFMuDQorDQorDQorPWhlYWQxIENBVVRJT04NCisNCitBIHNhdmVkIGZpbGUgd2l0aCBWQkEgKGEuay5hIE1hY3JvcykgYnkgdGhpcyBtb2R1bGUgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuDQorSG93ZXZlciBtb2R1bGVzIGNhbiBnZXQgdGhlIHNhbWUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZSwNCit0aGUgZmlsZSBvY2N1cnMgYSBlcnJvciBpbiBhcHBsaWNhdGlvbihXb3JkLCBFeGNlbCAuLi4pLg0KKw0KKw0KKz1oZWFkMSBERVBSRUNBVEVEIEZFQVRVUkVTDQorDQorT2xkZXIgdmVyc2lvbiBvZiBDPE9MRTo6U3RvcmFnZV9MaXRlPiBhdXRvdml2aWZpZWQgYSBzY2FsYXIgcmVmIGluIHRoZSBDPG5ldygpPiBjb25zdHJ1Y3RvcnMgaW50byBhIHNjYWxhciBmaWxlaGFuZGxlLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgc3RpbGwgdGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGJ1dCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgZG8gbm90IHVzZSBpdC4gSW5zdGVhZCBjcmVhdGUgYSBmaWxlaGFuZGxlIChzY2FsYXIgb3Igb3RoZXJ3aXNlKSBhbmQgcGFzcyB0aGF0IGluLg0KKw0KKw0KKz1oZWFkMSBDT1BZUklHSFQNCisNCitUaGUgT0xFOjpTdG9yYWdlX0xpdGUgbW9kdWxlIGlzIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEthd2FpIFRha2Fub3JpLiBKYXBhbi4NCitBbGwgcmlnaHRzIHJlc2VydmVkLg0KKw0KK1lvdSBtYXkgZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMNCitMaWNlbnNlIG9yIHRoZSBBcnRpc3RpYyBMaWNlbnNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIFBlcmwgUkVBRE1FIGZpbGUuDQorDQorDQorPWhlYWQxIEFDS05PV0xFREdFTUVOVFMNCisNCitGaXJzdCBvZiBhbGwsIEkgd291bGQgbGlrZSB0byBhY2tub3dsZWRnZSB0byBNYXJ0aW4gU2Nod2FydHogYW5kIGhpcyBtb2R1bGUgT0xFOjpTdG9yYWdlLg0KKw0KKw0KKz1oZWFkMSBBVVRIT1INCisNCitLYXdhaSBUYWthbm9yaSBrd2l0a25yQGNwYW4ub3JnDQorDQorVGhpcyBtb2R1bGUgaXMgY3VycmVudGx5IG1haW50YWluZWQgYnkgSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcNCisNCisNCis9aGVhZDEgU0VFIEFMU08NCisNCitPTEU6OlN0b3JhZ2UNCisNCitEb2N1bWVudGF0aW9uIGZvciB0aGUgT0xFIENvbXBvdW5kIGRvY3VtZW50IGhhcyBiZWVuIHJlbGVhc2VkIGJ5IE1pY3Jvc29mdCB1bmRlciB0aGUgSTxPcGVuIFNwZWNpZmljYXRpb24gUHJvbWlzZT4uIFNlZSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaW50ZXJvcC9kb2NzL3N1cHBvcnRpbmd0ZWNobm9sb2dpZXMubXNweA0KKw0KK1RoZSBEaWdpdGFsIEltYWdpbmcgR3JvdXAgaGF2ZSBhbHNvIGRldGFpbGVkIHRoZSBPTEUgZm9ybWF0IGluIHRoZSBKUEVHMjAwMCBzcGVjaWZpY2F0aW9uOiBzZWUgQXBwZW5kaXggQSBvZiBodHRwOi8vd3d3LmkzYS5vcmcvcGRmL3dnMW4xMDE3LnBkZg0KKw0KKw0KKz1jdXQNCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9QYXJzZS9DU1YucG0gYi9tY3UvdG9vbHMvcGVybC9QYXJzZS9DU1YucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0MTQ5YgotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1BhcnNlL0NTVi5wbQpAQCAtMCwwICsxLDQ2MyBAQAorcGFja2FnZSBQYXJzZTo6Q1NWOw0KKw0KKz1wb2QNCisNCis9aGVhZDEgTkFNRQ0KKw0KK1BhcnNlOjpDU1YgLSBIaWdobHkgZmxleGlibGUgQ1ZTIHBhcnNlciBmb3IgbGFyZ2UgZmlsZXMNCisNCis9aGVhZDEgU1lOT1BTSVMNCisNCisgICMgU2ltcGxlIGhlYWRlcmxlc3MgY29tbWEtc2VwZXJhdGVkIGNvbHVtbiBwYXJzZXINCisgIG15ICRzaW1wbGUgPSBQYXJzZTo6Q1NWLT5uZXcoDQorICAgICAgZmlsZSA9PiAnZmlsZS5jc3YnLA0KKyAgICAgICk7DQorICB3aGlsZSAoIG15ICRhcnJheV9yZWYgPSAkc2ltcGxlLT5mZXRjaCApIHsNCisgICAgICMgRG8gc29tZXRoaW5nLi4uDQorICB9DQorDQorLi4uIG9yIGEgbW9yZSBjb21wbGV4IGV4YW1wbGUuLi4NCisNCisgICMgUGFyc2UgYSBjb2xvbi1zZXBlcmF0ZWQgdmFyaWFibGVzIGZpbGUgIGZyb20gYSBoYW5kbGUgYXMgYSBoYXNoDQorICAjIGJhc2VkIG9uIGhlYWRlcnMgZnJvbSB0aGUgZmlyc3QgbGluZS4NCisgICMgVGhlbiBmaWx0ZXIsIHNvIHdlIGVtaXQgb2JqZWN0cyByYXRoZXIgdGhhbiB0aGUgcGxhaW4gaGFzaC4NCisgIG15ICRvYmplY3RzID0gUGFyc2U6OkNTVi0+bmV3KA0KKyAgICAgIGhhbmRsZSA9PiAkaW9faGFuZGxlLA0KKyAgICAgIHNlcF9jaGFyICAgPT4gJzsnLA0KKyAgICAgIGZpZWxkcyAgICAgPT4gJ2F1dG8nLA0KKyAgICAgIGZpbHRlciAgICAgPT4gc3ViIHsgTXk6Ok9iamVjdC0+bmV3KCAkXyApIH0sDQorICAgICAgKTsNCisgIHdoaWxlICggbXkgJG9iamVjdCA9ICRvYmplY3RzLT5mZXRjaCApIHsNCisgICAgICAkb2JqZWN0LT5kb19zb21ldGhpbmc7DQorICB9IA0KKw0KKz1oZWFkMSBERVNDUklQVElPTg0KKw0KK1N1cmVseSB0aGUgQ1BBTiBkb2Vzbid0IG5lZWQgeWV0IGFub3RoZXIgQ1NWIHBhcnNpbmcgbW9kdWxlLg0KKw0KK0w8VGV4dDo6Q1NWX1hTPiBpcyB0aGUgc3RhbmRhcmQgcGFyc2VyIGZvciBDU1YgZmlsZXMuIEl0IGlzIGZhc3QgYXMgaGVsbCwNCitidXQgdW5mb3J0dW5hdGVseSBpdCBjYW4gYmUgYSBiaXQgdmVyYm9zZSB0byB1c2UuDQorDQorQSBudW1iZXIgb2Ygb3RoZXIgbW9kdWxlcyBoYXZlIGF0dGVtcHRlZCB0byBwdXQgdXNhYmlsaXR5IHdyYXBwZXJzIGFyb3VuZA0KK3RoaXMgdmVuZXJhYmxlIG1vZHVsZSwgYnV0IHRoZXkgaGF2ZSBhbGwgZm9jdXNzZWQgb24gcGFyc2luZyB0aGUgZW50aXJlDQorZmlsZSBpbnRvIG1lbW9yeSBhdCBvbmNlLg0KKw0KK1RoaXMgbWV0aG9kIGlzIGZpbmUgdW5sZXNzIHlvdXIgQ1NWIGZpbGVzIHN0YXJ0IHRvIGdldCBsYXJnZS4gT25jZSB0aGF0DQoraGFwcGVucywgdGhlIG9ubHkgZXhpc3Rpbmcgb3B0aW9uIGlzIHRvIGZhbGwgYmFjayBvbiB0aGUgcmVsYXRpdmVseSBzbG93DQorYW5kIGhlYXZ5d2VpZ2h0IEw8WE1MOjpTQVhEcml2ZXI6OkNTVj4gbW9kdWxlLg0KKw0KK0w8UGFyc2U6OkNTVj4gZmlsbHMgdGhpcyBmdW5jdGlvbmFsaXR5IGdhcC4gSXQgcHJvdmlkZXMgYSBmbGV4aWJsZQ0KK2FuZCBsaWdodC13ZWlnaHQgc3RyZWFtaW5nIHBhcnNlciBmb3IgbGFyZ2UsIGV4dHJlbWVseSBsYXJnZSwgb3INCithcmJpdHJhcmlseSBsYXJnZSBDU1YgZmlsZXMuDQorDQorPWhlYWQyIE1haW4gRmVhdHVyZXMNCisNCitCPFN0cmVhbS1CYXNlZCBQYXJzZXI+IC0gQWxsIHBhcnNpbmcgYSBsaW5lIGF0IGEgdGltZS4NCisNCitCPEFycmF5IE1vZGU+IC0gUGFyc2luZyBjYW4gYmUgZG9uZSBpbiBzaW1wbGUgYXJyYXkgbW9kZSwgcmV0dXJuaW5nDQorYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgaWYgdGhlIGNvbHVtbnMgYXJlIG5vdCBuYW1lZC4NCisNCitCPEhhc2ggTW9kZT4gLSBQYXJzaW5nIGNhbiBiZSBkb25lIGluIGhhc2ggbW9kZSwgcHV0dGluZyB0aGUgZGF0YSBpbnRvDQorYSBoYXNoIGFuZCByZXR1cm4gYSByZWZlcmVuY2UgdG8gaXQuDQorDQorQjxGaWx0ZXIgQ2FwYWJpbGl0eT4gLSBBbGwgaXRlbXMgcmV0dXJuZWQgY2FuIGJlIHBhc3NlZCB0aHJvdWdoIGENCitjdXN0b20gZmlsdGVyLiBUaGlzIGZpbHRlciBjYW4gZWl0aGVyIG1vZGlmeSB0aGUgZGF0YSBvbiB0aGUgZmx5LA0KK29yIGRyb3AgcmVjb3JkcyB5b3UgZG9uJ3QgbmVlZC4NCisNCis9aGVhZDIgV3JpdGluZyBGaWx0ZXJzDQorDQorQSBMPFBhcnNlOjpDU1Y+IGZpbHRlciBpcyBhIHN1YnJvdXRpbmUgcmVmZXJlbmNlIHRoYXQgaXMgcGFzc2VkIHRoZSByYXcNCityZWNvcmQgYXMgQzwkXz4sIGFuZCBzaG91bGQgQzxyZXR1cm4+IHRoZSBhbHRlcm5hdGl2ZSBvciBtb2RpZmllZCByZWNvcmQNCit0byByZXR1cm4gdG8gdGhlIHVzZXIuDQorDQorVGhlIG51bGwgZmlsdGVyIChkb2VzIG5vdCBtb2RpZnkgb3IgZHJvcCBhbnkgcmVjb3JkcykgbG9va3MgbGlrZSB0aGUNCitmb2xsb3dpbmcuDQorDQorICBzdWIgeyAkXyB9Ow0KKw0KK0EgZmlsdGVyIHdoaWNoIHJldmVyc2VkIHRoZSBvcmRlciBvZiB0aGUgY29sdW1ucyAoYXNzdW1pbmcgdGhleSBhcmUNCitwYXNzZWQgYXMgYW4gYXJyYXkpIG1pZ2h0IGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nLg0KKw0KKyAgc3ViIHsgcmV0dXJuIFsgcmV2ZXJzZSBAJF8gXSB9Ow0KKw0KK1RvIGRyb3AgdGhlIHJlY29yZCwgeW91IHNob3VsZCByZXR1cm4gQzx1bmRlZj4gZnJvbSB0aGUgZmlsdGVyLiBUaGUNCitwYXJzZXIgd2lsbCB0aGVuIGtlZXAgcHVsbGluZyBhbmQgcGFyc2luZyBuZXcgcmVjb3JkcyB1bnRpbCBvbmUNCitwYXNzZXMgdGhlIGZpbHRlci4NCisNCisgICMgT25seSBrZWVwIHJlY29yZHMgd2hlcmUgZm9vIGlzIHRydWUNCisgIHN1YiB7ICRfLT57Zm9vfSA/ICRfIDogdW5kZWYgfQ0KKw0KK1RvIHNpZ25hbCBhbiBlcnJvciwgdGhyb3cgYW4gZXhjZXB0aW9uDQorDQorICBzdWIgew0KKyAgICAgICRfLT57Zm9vfSA9fiAvYmFyLyBvciBkaWUgIkFzc3VtcHRpb24gZmFpbGVkIjsNCisgICAgICByZXR1cm4gJF87DQorICB9DQorDQorPWhlYWQxIE1FVEhPRFMNCisNCis9Y3V0DQorDQordXNlIDUuMDA1Ow0KK3VzZSBzdHJpY3Q7DQordXNlIENhcnAgICAgICAgICAoKTsNCit1c2UgSU86OkZpbGUgICAgICgpOw0KK3VzZSBUZXh0OjpDU1ZfWFMgKCk7DQordXNlIFBhcmFtczo6VXRpbCBxd3sgX1NUUklORyBfQVJSQVkgX0hBU0gwIF9DT0RFTElLRSBfSEFORExFIH07DQorDQordXNlIHZhcnMgcXd7JFZFUlNJT059Ow0KK0JFR0lOIHsNCisJJFZFUlNJT04gPSAnMS4wMCc7DQorfQ0KKw0KKw0KKw0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMgQ29uc3RydWN0b3INCisNCis9cG9kDQorDQorPWhlYWQyIG5ldw0KKw0KK1RoZSBDPG5ldz4gY29uc3RydWN0b3IgY3JlYXRlcyBhbmQgaW5pdGlhbGlzZSBhIG5ldyBDU1YgcGFyc2VyLg0KKw0KK0l0IHRha2VzIGEgbnVtYmVyIG9mIHBhcmFtcy4NCisNCitUbyBzcGVjaWZ5IHRoZSBDU1YgZGF0YSBzb3VyY2UsIHlvdSBzaG91bGQgcHJvdmlkZSBlaXRoZXIgdGhlIEM8ZmlsZT4NCitwYXJhbSwgd2hpY2ggc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHJlYWQsIG9yIHRoZSBDPGhhbmRsZT4NCitwYXJhbSwgd2hpY2ggc2hvdWxkIGJlIGEgZmlsZSBoYW5kbGUgdG8gcmVhZCBpbnN0ZWFkLg0KKw0KK1RoZSBhY3R1YWwgcGFyc2luZyBpcyBkb25lIHVzaW5nIEw8VGV4dDo6Q1NWX1hTPi4gQW55IG9mIGl0J3MNCitjb25zdHJ1Y3Rvci9wYXJzaW5nIHBhcmFtcyBjYW4gYWxzbyBiZSBwcm92aWRlZCB0byB0aGlzIEM8bmV3PiBtZXRob2QsDQorYW5kIHRoZXkgd2lsbCBiZSBwYXNzZWQgb24uDQorDQorQWx0ZXJuYXRpdmVseSwgdGhleSBjYW4gYmUgcGFzc2VkIGFzIGEgc2luZ2xlIEM8SEFTSD4gcmVmZXJlbmNlIGFzIHRoZQ0KK0M8Y3N2X2F0dHI+IHBhcmFtLiBGb3IgZXhhbXBsZToNCisNCisgICRwYXJzZXIgPSBQYXJzZTo6Q1NWLT5uZXcoDQorICAgICAgZmlsZSAgICAgPT4gJ2ZpbGUuY3N2JywNCisgICAgICBjc3ZfYXR0ciA9PiB7DQorICAgICAgICAgIHNlcF9jaGFyICAgPT4gJzsnLA0KKyAgICAgICAgICBxdW90ZV9jaGFyID0+ICInIiwNCisgICAgICB9LA0KKyAgKTsNCisNCitBbiBvcHRpb25hbCBDPGZpZWxkcz4gcGFyYW0gY2FuIGJlIHByb3ZpZGVkLCB3aGljaCBzaG91bGQgYmUgYW4gYXJyYXkNCityZWZlcmVuY2UgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIENTViBmaWxlLg0KKw0KKyAgJHBhcnNlciA9IFBhcnNlOjpDU1YtPm5ldygNCisgICAgICBmaWxlICAgPT4gJ2ZpbGUuY3N2JywNCisgICAgICBmaWVsZHMgPT4gWyAnY29sMScsICdjb2wyJywgJ2NvbDMnIF0sDQorICApOw0KKw0KK0lmIHRoZSBDPGZpZWxkcz4gcGFyYW0gaXMgcHJvdmlkZWQsIHRoZSBwYXJzZXIgd2lsbCBtYXAgdGhlIGNvbHVtbnMgdG8gYQ0KK2hhc2ggd2hlcmUgdGhlIGtleXMgYXJlIHRoZSBmaWVsZCBuYW1lcyBwcm92aWRlZCwgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZQ0KK3ZhbHVlcyBmb3VuZCBpbiB0aGUgQ1NWIGZpbGUuDQorDQorSWYgdGhlIEM8ZmllbGRzPiBwYXJhbSBpcyBCPG5vdD4gcHJvdmlkZWQsIHRoZSBwYXJzZXIgd2lsbCByZXR1cm4gc2ltcGxlDQorYXJyYXkgcmVmZXJlbmNlcyBvZiB0aGUgY29sdW1ucy4NCisNCitJZiB0aGUgQzxmaWVsZHM+IHBhcmFtIGlzIHRoZSBzdHJpbmcgJ2F1dG8nLCB0aGUgZmllbGRzIHdpbGwgYmUNCithdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYnkgcmVhZGluZyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgQ1NWIGZpbGUgYW5kDQordXNpbmcgdGhvc2UgdmFsdWVzIGFzIHRoZSBmaWVsZCBuYW1lcy4NCisNCitUaGUgb3B0aW9uYWwgQzxmaWx0ZXI+IHBhcmFtIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIHJlY29yZHMgaWYNCitwcm92aWRlZC4gSXQgc2hvdWxkIGJlIGEgQzxDT0RFPiByZWZlcmVuY2Ugb3IgYW55IG90aGVyd2lzZSBjYWxsYWJsZQ0KK3NjYWxhciwgYW5kIGVhY2ggdmFsdWUgcGFyc2VkIChlaXRoZXIgYXJyYXkgcmVmZXJlbmNlIG9yIGhhc2ggcmVmZXJlbmNlKQ0KK3dpbGwgYmUgcGFzc2VkIHRvIHRoZSBmaWx0ZXIgdG8gYmUgY2hhbmdlZCBvciBjb252ZXJ0ZWQgaW50byBhbiBvYmplY3QsDQorb3Igd2hhdGV2ZXIgeW91IHdpc2guDQorDQorUmV0dXJucyBhIG5ldyBMPFBhcnNlOjpDU1Y+IG9iamVjdCwgb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiAoZGllcykgb24gZXJyb3IuDQorDQorPWN1dA0KKw0KK3N1YiBuZXcgew0KKwlteSAkY2xhc3MgPSBzaGlmdDsNCisJbXkgJHNlbGYgID0gYmxlc3MgeyBAXywNCisJCXJvdyAgICA9PiAwLA0KKwkJZXJyc3RyID0+ICcnLA0KKwkJfSwgJGNsYXNzOw0KKw0KKwkjIERvIHdlIGhhdmUgYSBmaWxlIG5hbWUNCisJaWYgKCBleGlzdHMgJHNlbGYtPntmaWxlfSApIHsNCisJCXVubGVzcyAoIF9TVFJJTkcoJHNlbGYtPntmaWxlfSkgKSB7DQorCQkJQ2FycDo6Y3JvYWsoIlBhcnNlOjpDU1YgZmlsZSBwYXJhbSBpcyBub3QgYSBzdHJpbmciKTsNCisJCX0NCisJCXVubGVzcyAoIC1mICRzZWxmLT57ZmlsZX0gYW5kIC1yIF8gKSB7DQorCQkJQ2FycDo6Y3JvYWsoIlBhcnNlOjpDU1YgZmlsZSAnJHNlbGYtPntmaWxlfScgZG9lcyBub3QgZXhpc3QiKTsNCisJCX0NCisJCSRzZWxmLT57aGFuZGxlfSA9IElPOjpGaWxlLT5uZXcoKTsNCisJCXVubGVzcyAoICRzZWxmLT57aGFuZGxlfS0+b3Blbigkc2VsZi0+e2ZpbGV9KSApIHsNCisJCQlDYXJwOjpjcm9haygiUGFyc2U6OkNTViBmaWxlICckc2VsZi0+e2ZpbGV9JyBmYWlsZWQgdG8gbG9hZDogJCEiKTsNCisJCX0NCisJfQ0KKw0KKwkjIERvIHdlIGhhdmUgYSBmaWxlIGhhbmRsZQ0KKwlpZiAoIGV4aXN0cyAkc2VsZi0+e2hhbmRsZX0gKSB7DQorCQl1bmxlc3MgKCBfSEFORExFKCRzZWxmLT57aGFuZGxlfSkgKSB7DQorCQkJQ2FycDo6Y3JvYWsoIlBhcnNlOjpDU1YgaGFuZGxlIHBhcmFtIGlzIG5vdCBhbiBJTyBoYW5kbGUiKTsNCisJCX0NCisJfSBlbHNlIHsNCisJCUNhcnA6OmNyb2FrKCJQYXJzZTo6Q1NWIG5vdCBwcm92aWRlZCBhIGZpbGUgb3IgaGFuZGxlIHBhcmFtIik7DQorCX0NCisNCisJIyBTZXBlcmF0ZSB0aGUgVGV4dDo6Q1NWIGF0dHJpYnV0ZXMNCisJdW5sZXNzICggX0hBU0gwKCRzZWxmLT57Y3N2X2F0dHJ9KSApIHsNCisJCSRzZWxmLT57Y3N2X2F0dHJ9ID0ge307DQorCQlmb3JlYWNoICggcXd7cXVvdGVfY2hhciBlb2wgZXNjYXBlX2NoYXIgc2VwX2NoYXIgYmluYXJ5IGFsd2F5c19xdW90ZX0gKSB7DQorCQkJbmV4dCB1bmxlc3MgZXhpc3RzICRzZWxmLT57JF99Ow0KKwkJCSRzZWxmLT57Y3N2X2F0dHJ9LT57JF99ID0gZGVsZXRlICRzZWxmLT57JF99Ow0KKwkJfQ0KKwl9DQorDQorCSMgQ3JlYXRlIHRoZSBwYXJzZXINCisJJHNlbGYtPntjc3ZfeHN9ID0gVGV4dDo6Q1NWX1hTLT5uZXcoICRzZWxmLT57Y3N2X2F0dHJ9ICk7DQorCXVubGVzcyAoICRzZWxmLT57Y3N2X3hzfSApIHsNCisJCUNhcnA6OmNyb2FrKCJGYWlsZWQgdG8gY3JlYXRlIFRleHQ6OkNTVl9YUyBwYXJzZXIiKTsNCisJfQ0KKw0KKwkjIEhhbmRsZSBhdXRvbWF0aWMgZmllbGRzDQorCWlmICggX1NUUklORygkc2VsZi0+e2ZpZWxkc30pIGFuZCBsYygkc2VsZi0+e2ZpZWxkc30pIGVxICdhdXRvJyApIHsNCisJCSMgR3JhYiB0aGUgZmlyc3QgbGluZQ0KKwkJbXkgJGxpbmUgPSAkc2VsZi0+X2dldGxpbmU7DQorCQl1bmxlc3MgKCBkZWZpbmVkICRsaW5lICkgew0KKwkJCUNhcnA6OmNyb2FrKCJGYWlsZWQgdG8gZ2V0IGhlYWRlciBsaW5lIGZyb20gQ1NWIik7DQorCQl9DQorDQorCQkjIFBhcnNlIHRoZSBsaW5lIGludG8gY29sdW1ucw0KKwkJdW5sZXNzICggJHNlbGYtPntjc3ZfeHN9LT5wYXJzZSgkbGluZSkgKSB7DQorCQkJQ2FycDo6Y3JvYWsoDQorCQkJCSJGYWlsZWQgdG8gcGFyc2UgaGVhZGVyIGxpbmUgZnJvbSBDU1Y6ICINCisJCQkJLiAkc2VsZi0+e2Nzdl94c30tPmVycm9yX2lucHV0DQorCQkJKTsNCisJCX0NCisNCisJCSMgVHVybiB0aGUgYXJyYXkgcmVmIGludG8gYSBoYXNoIGlmIG5lZWRlZA0KKwkJbXkgQGNvbHMgPSAkc2VsZi0+e2Nzdl94c30tPmZpZWxkczsNCisJCSRzZWxmLT57ZmllbGRzfSA9IFxAY29sczsNCisJfQ0KKw0KKwkjIENoZWNrIGZpZWxkcw0KKwlpZiAoIGV4aXN0cyAkc2VsZi0+e2ZpZWxkc30gYW5kICEgX0FSUkFZKCRzZWxmLT57ZmllbGRzfSkgKSB7DQorCQlDYXJwOjpjcm9haygiUGFyc2U6OkNTViBmaWVsZHMgcGFyYW0gaXMgbm90IGFuIGFycmF5IHJlZmVyZW5jZSBvZiBzdHJpbmdzIik7DQorCX0NCisNCisJIyBDaGVjayBmaWx0ZXINCisJaWYgKCBleGlzdHMgJHNlbGYtPntmaWx0ZXJ9IGFuZCAhIF9DT0RFTElLRSgkc2VsZi0+e2ZpbHRlcn0pICkgew0KKwkJQ2FycDo6Y3JvYWsoIlBhcnNlOjpDU1YgZmlsdGVyIHBhcmFtIGlzIG5vdCBjYWxsYWJsZSIpOw0KKwl9DQorDQorCSRzZWxmOw0KK30NCisNCisNCisNCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjIE1haW4gTWV0aG9kcw0KKw0KKz1wb2QNCisNCis9aGVhZDIgZmV0Y2gNCisNCitPbmNlIGEgTDxQYXJzZTo6Q1NWPiBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCwgdGhlIEM8ZmV0Y2g+IG1ldGhvZCBpcw0KK3VzZWQgdG8gcGFyc2UgYW5kIHJldHVybiB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBDU1YgZmlsZS4NCisNCitSZXR1cm5zIGFuIEM8QVJSQVk+LCBDPEhBU0g+IG9yIHRoZSBvdXRwdXQgb2YgdGhlIGZpbHRlciwgYmFzZWQgb24gdGhlDQorY29uZmlndXJhdGlvbiBvZiB0aGUgb2JqZWN0LCBvciBDPHVuZGVmPiBpbiBhIHZhcmlldHkgb2Ygc2l0dWF0aW9ucy4NCisNCitSZXR1cm5pbmcgQzx1bmRlZj4gbWVhbnMgZWl0aGVyIHNvbWUgcGFydCBvZiB0aGUgcGFyc2luZyBhbmQgZmlsdGVyaW5nDQorcHJvY2VzcyBoYXMgcmVzdWx0ZWQgaW4gYW4gZXJyb3IsIEI8b3I+IHRoYXQgdGhlIGVuZCBvZiBmaWxlIGhhcyBiZWVuDQorcmVhY2hlZC4NCisNCitPbiByZWNlaXZpbmcgQzx1bmRlZj4sIHlvdSBzaG91bGQgdGhlIEM8ZXJyc3RyPiBtZXRob2QuIElmIGl0IGlzIGEgbnVsbA0KK3N0cmluZyB5b3UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgZmlsZS4gT3RoZXJ3aXNlIHRoZSBlcnJvciBtZXNzYWdlIHdpbGwNCitiZSByZXR1cm5lZC4gVGh1cywgdGhlIGJhc2ljIHVzYWdlIG9mIEw8UGFyc2U6OkNTVj4gd2lsbCBsb29rIGxpa2UgdGhlDQorZm9sbG93aW5nLg0KKw0KKyAgbXkgJHBhcnNlciA9IFBhcnNlOjpDU1YtPm5ldygNCisgICAgICBmaWxlID0+ICdmaWxlLmNzdicsDQorICAgICAgKTsNCisgIHdoaWxlICggbXkgJHZhbHVlID0gJHBhcnNlci0+ZmV0Y2ggKSB7DQorICAgICAgIyBEbyBzb21ldGhpbmcuLi4NCisgIH0NCisgIGlmICggJHBhcnNlci0+ZXJyc3RyICkgew0KKyAgICAgICMgSGFuZGxlIGVycm9ycy4uLg0KKyAgfQ0KKw0KKz1jdXQNCisNCitzdWIgZmV0Y2ggew0KKwlteSAkc2VsZiA9IHNoaWZ0Ow0KKw0KKwkjIFRoZSBmaWx0ZXIgY2FuIHNraXAgcm93cywNCisJIyBpdGVyYXRlIHRpbGwgd2UgZ2V0IHNvbWV0aGluZy4NCisJd2hpbGUgKCBkZWZpbmVkKG15ICRsaW5lID0gJHNlbGYtPl9nZXRsaW5lKSApIHsNCisJCSMgUGFyc2UgdGhlIGxpbmUgaW50byBjb2x1bW5zDQorCQl1bmxlc3MgKCAkc2VsZi0+e2Nzdl94c30tPnBhcnNlKCRsaW5lKSApIHsNCisJCQkkc2VsZi0+e2VycnN0cn0gPSAiRmFpbGVkIHRvIHBhcnNlIHJvdyAkc2VsZi0+e3Jvd30iOw0KKwkJCXJldHVybiB1bmRlZjsNCisJCX0NCisNCisJCSMgVHVybiB0aGUgYXJyYXkgcmVmIGludG8gYSBoYXNoIGlmIG5lZWRlZA0KKwkJbXkgJHJ2ICAgPSB1bmRlZjsNCisJCW15ICRmICAgID0gJHNlbGYtPntmaWVsZHN9Ow0KKwkJbXkgQGNvbHMgPSAkc2VsZi0+e2Nzdl94c30tPmZpZWxkczsNCisJCWlmICggJGYgKSB7DQorCQkJJHJ2ID0ge307DQorCQkJZm9yZWFjaCAoIDAgLi4gJCMkZiApIHsNCisJCQkJJHJ2LT57ICRmLT5bJF9dIH0gPSAkY29sc1skX107DQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQkkcnYgPSBcQGNvbHM7DQorCQl9DQorDQorCQkjIEp1c3QgcmV0dXJuIGZvciBzaW1wbGUgdXNlcw0KKwkJcmV0dXJuICRydiB1bmxlc3MgJHNlbGYtPntmaWx0ZXJ9Ow0KKw0KKwkJIyBGaWx0ZXIgaWYgbmVlZGVkDQorCQlsb2NhbCAkXyA9ICRydjsNCisJCSRydiA9IGV2YWwgeyAkc2VsZi0+e2ZpbHRlcn0tPigpIH07DQorCQlpZiAoICRAICkgew0KKwkJCSMgSGFuZGxlIGZpbHRlciBlcnJvcnMNCisJCQkkc2VsZi0+e2VycnN0cn0gPSAiRmlsdGVyIGVycm9yOiAkQCI7DQorCQkJJHNlbGYtPntlcnJzdHJ9ID1+IHMvXiguKylhdCBsaW5lLiskLyQxLzsNCisJCQlyZXR1cm4gdW5kZWY7DQorCQl9DQorDQorCQkjIEZpbHRlciByZXR1cm5zIHVuZGVmIHRvIGRyb3AgYSByZWNvcmQNCisJCW5leHQgdW5sZXNzIGRlZmluZWQgJHJ2Ow0KKw0KKwkJIyBXZSBoYXZlIGEgZ29vZCByZWNvcmQsIHJldHVybiBpdA0KKwkJcmV0dXJuICRydjsNCisJfQ0KKw0KKwlyZXR1cm4gdW5kZWY7DQorfQ0KKw0KK3N1YiBfZ2V0bGluZSB7DQorCW15ICRzZWxmID0gc2hpZnQ7DQorCSRzZWxmLT57ZXJyc3RyfSA9ICcnOw0KKw0KKwkjIEZldGNoIHRoZSBuZXh0IGZpbGUgbGluZQ0KKwlteSAkaGFuZGxlID0gJHNlbGYtPntoYW5kbGV9Ow0KKwlteSAkbGluZSAgID0gPCRoYW5kbGU+Ow0KKwl1bmxlc3MgKCBkZWZpbmVkICRsaW5lICkgew0KKwkJJHNlbGYtPntlcnJzdHJ9ID0gJGhhbmRsZS0+ZW9mID8gJycgOiAkITsNCisJCXJldHVybiB1bmRlZjsNCisJfQ0KKw0KKwkjIFBhcnNlIHRoZSBsaW5lIGludG8gY29sdW1ucw0KKwkkc2VsZi0+e3Jvd30rKzsNCisJcmV0dXJuICRsaW5lOw0KK30NCisNCis9cG9kDQorDQorPWhlYWQyIHJvdw0KKw0KK1RoZSBDPHJvdz4gbWV0aG9kIHJldHVybnMgdGhlIGN1cnJlbnQgcm93IG9mIHRoZSBDU1YgZmlsZS4NCisNCitUaGlzIGlzIGEgb25lLWJhc2VkIGNvdW50LCBzbyB3aGVuIHlvdSBmaXJzdCBjcmVhdGUgdGhlIHBhcnNlciwNCit0aGUgdmFsdWUgb2YgQzxyb3c+IHdpbGwgYmUgemVybyAodW5sZXNzIHlvdSBhcmUgdXNpbmcNCitDPGZpZWxkcyA9PiAnYXV0byc+IGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSAxKS4NCisNCis9Y3V0DQorDQorc3ViIHJvdyB7DQorCSRfWzBdLT57cm93fTsNCit9DQorDQorPXBvZA0KKw0KKz1oZWFkMiBjb21iaW5lDQorDQorICAkc3RhdHVzID0gJGNzdi0+Y29tYmluZShAY29sdW1ucyk7DQorDQorVGhlIEM8Y29tYmluZT4gbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UsIGFuZCBpcyBwYXNzZWQgdGhyb3VnaA0KK3RvIHRoZSB1bmRlcmx5aW5nIEw8VGV4dDo6Q1NWX1hTPiBvYmplY3QuDQorDQorPWN1dA0KKw0KK3N1YiBjb21iaW5lIHsNCisJc2hpZnQtPmNvbWJpbmUoQF8pOw0KK30NCisNCis9cG9kDQorDQorPWhlYWQyIHN0cmluZw0KKw0KKyAgJGxpbmUgPSAkY3ZzLT5zdHJpbmc7DQorDQorVGhlIEM8c3RyaW5nPiBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSwgYW5kIGlzIHBhc3NlZCB0aHJvdWdoDQordG8gdGhlIHVuZGVybHlpbmcgTDxUZXh0OjpDU1ZfWFM+IG9iamVjdC4NCisNCis9Y3V0DQorDQorc3ViIHN0cmluZyB7DQorCXNoaWZ0LT5zdHJpbmcoQF8pOw0KK30NCisNCis9cG9kDQorDQorPWhlYWQyIHByaW50DQorDQorICAkc3RhdHVzID0gJGN2cy0+cHJpbnQoJGlvLCAkY29sdW1ucyk7DQorDQorVGhlIEM8cHJpbnQ+IG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhIGNvbnZlbmllbmNlLCBhbmQgaXMgcGFzc2VkIHRocm91Z2gNCit0byB0aGUgdW5kZXJseWluZyBMPFRleHQ6OkNTVl9YUz4gb2JqZWN0Lg0KKw0KKz1jdXQNCisNCitzdWIgcHJpbnQgew0KKwlzaGlmdC0+cHJpbnQoQF8pOw0KK30NCisNCis9cG9kDQorDQorPWhlYWQyIGVycnN0cg0KKw0KK09uIGVycm9yLCB0aGUgQzxlcnJzdHI+IG1ldGhvZCByZXR1cm5zIHRoZSBlcnJvciB0aGF0IG9jY3VyZWQuDQorDQorSWYgdGhlIGxhc3QgYWN0aW9uIHdhcyBOT1QgYW4gZXJyb3IsIHJldHVybnMgdGhlIG51bGwgc3RyaW5nIEM8Jyc+Lg0KKw0KKz1jdXQNCisNCitzdWIgZXJyc3RyIHsNCisJJF9bMF0tPntlcnJzdHJ9Ow0KK30NCisNCisxOw0KKw0KKz1wb2QNCisNCis9aGVhZDEgU1VQUE9SVA0KKw0KK0J1Z3Mgc2hvdWxkIGJlIGFsd2F5cyBiZSByZXBvcnRlZCB2aWEgdGhlIENQQU4gYnVnIHRyYWNrZXIgYXQNCisNCitMPGh0dHA6Ly9ydC5jcGFuLm9yZy9Ob0F1dGgvUmVwb3J0QnVnLmh0bWw/UXVldWU9UGFyc2UtQ1NWPg0KKw0KK0ZvciBvdGhlciBpc3N1ZXMsIG9yIGNvbW1lcmNpYWwgZW5oYW5jZW1lbnQgb3Igc3VwcG9ydCwgY29udGFjdCB0aGUgYXV0aG9yLg0KKw0KKz1oZWFkMSBBVVRIT1JTDQorDQorQWRhbSBLZW5uZWR5IEU8bHQ+YWRhbWtAY3Bhbi5vcmdFPGd0Pg0KKw0KKz1oZWFkMSBTRUUgQUxTTw0KKw0KK0w8VGV4dDo6Q1NWX1hTPiwgTDxodHRwOi8vYWxpLmFzLz4NCisNCis9aGVhZDEgQ09QWVJJR0hUDQorDQorQ29weXJpZ2h0IDIwMDYgQWRhbSBLZW5uZWR5Lg0KKw0KK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQ0KK2l0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuDQorDQorVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgaW4gdGhlDQorTElDRU5TRSBmaWxlIGluY2x1ZGVkIHdpdGggdGhpcyBtb2R1bGUuDQorDQorPWN1dA0KZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1BhcnNlL1JlY0Rlc2NlbnQucG0gYi9tY3UvdG9vbHMvcGVybC9QYXJzZS9SZWNEZXNjZW50LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOGFhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9QYXJzZS9SZWNEZXNjZW50LnBtCkBAIC0wLDAgKzEsNjQxNyBAQAorIyBHRU5FUkFURSBSRUNVUlNJVkUgREVTQ0VOVCBQQVJTRVIgT0JKRUNUUyBGUk9NIEEgR1JBTU1BUgorCit1c2UgNS4wMDY7Cit1c2Ugc3RyaWN0OworCitwYWNrYWdlIFBhcnNlOjpSZWNEZXNjZW50OworCit1c2UgVGV4dDo6QmFsYW5jZWQgcXcgKCBleHRyYWN0X2NvZGVibG9jayBleHRyYWN0X2JyYWNrZXRlZCBleHRyYWN0X3F1b3RlbGlrZSBleHRyYWN0X2RlbGltaXRlZCApOworCit1c2UgdmFycyBxdyAoICRza2lwICk7CisKKyAgICpkZWZza2lwICA9IFwgJ1xzKic7ICMgREVGQVVMVCBTRVBBUkFUT1IgSVMgT1BUSU9OQUwgV0hJVEVTUEFDRQorICAgJHNraXAgID0gJ1xzKic7ICAgICAgIyBVTklWRVJTQUwgU0VQQVJBVE9SIElTIE9QVElPTkFMIFdISVRFU1BBQ0UKK215ICRNQVhSRVAgID0gMTAwXzAwMF8wMDA7ICAjIFJFUEVUSVRJT05TIE1BVENIIEFUIE1PU1QgMTAwLDAwMCwwMDAgVElNRVMKKworCisjaWZuZGVmIFJVTlRJTUUKK3N1YiBpbXBvcnQgICMgSU1QTEVNRU5UIFBSRUNPTVBJTEVSIEJFSEFWSU9VUiBVTkRFUjoKKyAgICAgICAgIyAgICBwZXJsIC1NUGFyc2U6OlJlY0Rlc2NlbnQgLSA8Z3JhbW1hcmZpbGU+IDxjbGFzc25hbWU+Cit7CisgICAgbG9jYWwgKl9kaWUgPSBzdWIgeyBwcmludCBAXywgIlxuIjsgZXhpdCB9OworCisgICAgbXkgKCRwYWNrYWdlLCAkZmlsZSwgJGxpbmUpID0gY2FsbGVyOworCisgICAgaWYgKCRmaWxlIGVxICctJyAmJiAkbGluZSA9PSAwKQorICAgIHsKKyAgICAgICAgX2RpZSgiVXNhZ2U6IHBlcmwgLU1Mb2NhbFRlc3QgLSA8Z3JhbW1hcmZpbGU+IDxjbGFzc25hbWU+IikKKyAgICAgICAgICAgIHVubGVzcyBAQVJHViA9PSAyOworCisgICAgICAgIG15ICgkc291cmNlZmlsZSwgJGNsYXNzKSA9IEBBUkdWOworCisgICAgICAgIGxvY2FsICpJTjsKKyAgICAgICAgb3BlbiBJTiwgJHNvdXJjZWZpbGUKKyAgICAgICAgICAgIG9yIF9kaWUocXF7Q2FuJ3Qgb3BlbiBncmFtbWFyIGZpbGUgIiRzb3VyY2VmaWxlIn0pOworICAgICAgICBsb2NhbCAkLzsgIworICAgICAgICBteSAkZ3JhbW1hciA9IDxJTj47CisgICAgICAgIGNsb3NlIElOOworCisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50LT5QcmVjb21waWxlKCRncmFtbWFyLCAkY2xhc3MsICRzb3VyY2VmaWxlKTsKKyAgICAgICAgZXhpdDsKKyAgICB9Cit9CisKK3N1YiBTYXZlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAlb3B0OworICAgIGlmICgnSEFTSCcgZXEgcmVmICRfWzBdKSB7CisgICAgICAgICVvcHQgPSAoJW9wdCwgJXskX1swXX0pOworICAgICAgICBzaGlmdDsKKyAgICB9CisgICAgbXkgKCRjbGFzcykgPSBAXzsKKyAgICAkc2VsZi0+e3NhdmluZ30gPSAxOworICAgICRzZWxmLT5QcmVjb21waWxlKHVuZGVmLCRjbGFzcyk7CisgICAgJHNlbGYtPntzYXZpbmd9ID0gMDsKK30KKworc3ViIFByZWNvbXBpbGUKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICVvcHQgPSAoIC1zdGFuZGFsb25lID0+IDAgKTsKKyAgICBpZiAoJ0hBU0gnIGVxIHJlZiAkX1swXSkgeworICAgICAgICAlb3B0ID0gKCVvcHQsICV7JF9bMF19KTsKKyAgICAgICAgc2hpZnQ7CisgICAgfQorICAgIG15ICgkZ3JhbW1hciwgJGNsYXNzLCAkc291cmNlZmlsZSkgPSBAXzsKKworICAgICRjbGFzcyA9fiAvXihcdys6OikqXHcrJC8gb3IgY3JvYWsoIkJhZCBjbGFzcyBuYW1lOiAkY2xhc3MiKTsKKworICAgIG15ICRtb2R1bGVmaWxlID0gJGNsYXNzOworICAgICRtb2R1bGVmaWxlID1+IHMvLio6Oi8vOworICAgICRtb2R1bGVmaWxlIC49ICIucG0iOworCisgICAgbXkgJHJ1bnRpbWVfcGFja2FnZSA9ICdQYXJzZTo6UmVjRGVzY2VudDo6X1J1bnRpbWUnOworICAgIG15ICRjb2RlOworCisgICAgbG9jYWwgKk9VVDsKKyAgICBvcGVuIE9VVCwgIj4iLCAkbW9kdWxlZmlsZQorICAgICAgb3IgY3JvYWsoIkNhbid0IHdyaXRlIHRvIG5ldyBtb2R1bGUgZmlsZSAnJG1vZHVsZWZpbGUnIik7CisKKyAgICBwcmludCBTVERFUlIgInByZWNvbXBpbGluZyBncmFtbWFyIGZyb20gZmlsZSAnJHNvdXJjZWZpbGUnXG4iLAorICAgICAgInRvIGNsYXNzICRjbGFzcyBpbiBtb2R1bGUgZmlsZSAnJG1vZHVsZWZpbGUnXG4iCisgICAgICBpZiAkZ3JhbW1hciAmJiAkc291cmNlZmlsZTsKKworICAgICMgTWFrZSB0aGUgcmVzdWx0aW5nIHByZS1jb21waWxlZCBwYXJzZXIgc3RhbmQtYWxvbmUgYnkKKyAgICAjIGluY2x1ZGluZyB0aGUgY29udGVudHMgb2YgUGFyc2U6OlJlY0Rlc2NlbnQgYXMKKyAgICAjIFBhcnNlOjpSZWNEZXNjZW50OjpSdW50aW1lIGluIHRoZSByZXN1bHRpbmcgcHJlY29tcGlsZWQKKyAgICAjIHBhcnNlci4KKyAgICBpZiAoJG9wdHstc3RhbmRhbG9uZX0pIHsKKyAgICAgICAgbG9jYWwgKklOOworICAgICAgICBvcGVuIElOLCAnPCcsICRQYXJzZTo6UmVjRGVzY2VudDo6X0ZJTEVOQU1FCisgICAgICAgICAgb3IgY3JvYWsoIkNhbid0IG9wZW4gJFBhcnNlOjpSZWNEZXNjZW50OjpfRklMRU5BTUUgZm9yIHN0YW5kYWxvbmUgcHJlLWNvbXBpbGF0aW9uOiAkIVxuIik7CisgICAgICAgIG15ICRleGNsdWRlID0gMDsKKyAgICAgICAgcHJpbnQgT1VUICJ7XG4iOworICAgICAgICB3aGlsZSAoPElOPikgeworICAgICAgICAgICAgaWYgKCRfID1+IC9eXHMqI1xzKmlmbmRlZlxzK1JVTlRJTUVccyokLykgeworICAgICAgICAgICAgICAgICsrJGV4Y2x1ZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJGV4Y2x1ZGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoJF8gPX4gL15ccyojXHMqZW5kaWZccyQvKSB7CisgICAgICAgICAgICAgICAgICAgIC0tJGV4Y2x1ZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoJF8gPX4gbS9eX19FTkRfXy8pIHsKKyAgICAgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy9QYXJzZTo6UmVjRGVzY2VudC8kcnVudGltZV9wYWNrYWdlL2dzOworICAgICAgICAgICAgICAgIHByaW50IE9VVCAkXzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZSBJTjsKKyAgICAgICAgcHJpbnQgT1VUICJ9XG4iOworICAgIH0KKworICAgICRzZWxmID0gUGFyc2U6OlJlY0Rlc2NlbnQtPm5ldygkZ3JhbW1hciwgICMgJGdyYW1tYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAjICRjb21waWxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzICAgICAjICRuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgfHwgY3JvYWsoIkNhbid0IGNvbXBpbGUgYmFkIGdyYW1tYXIiKQorICAgICAgaWYgJGdyYW1tYXI7CisKKyAgICAkc2VsZi0+e19wcmVjb21waWxlZH0gPSAxOworCisgICAgZm9yZWFjaCAoIGtleXMgJXskc2VsZi0+e3J1bGVzfX0gKSB7CisgICAgICAgICRzZWxmLT57cnVsZXN9eyRffXtjaGFuZ2VkfSA9IDE7CisgICAgfQorCisKKyAgICBwcmludCBPVVQgInBhY2thZ2UgJGNsYXNzO1xuIjsKKyAgICBpZiAobm90ICRvcHR7LXN0YW5kYWxvbmV9KSB7CisgICAgICAgIHByaW50IE9VVCAidXNlIFBhcnNlOjpSZWNEZXNjZW50O1xuIjsKKyAgICB9CisKKyAgICBwcmludCBPVVQgInsgbXkgXCRFUlJPUlM7XG5cbiI7CisKKyAgICAkY29kZSA9ICRzZWxmLT5fY29kZSgpOworICAgIGlmICgkb3B0ey1zdGFuZGFsb25lfSkgeworICAgICAgICAkY29kZSA9fiBzL1BhcnNlOjpSZWNEZXNjZW50LyRydW50aW1lX3BhY2thZ2UvZ3M7CisgICAgfQorICAgIHByaW50IE9VVCAkY29kZTsKKworICAgIHByaW50IE9VVCAifVxucGFja2FnZSAkY2xhc3M7IHN1YiBuZXcgeyAiOworICAgIHByaW50IE9VVCAibXkgIjsKKworICAgIHJlcXVpcmUgRGF0YTo6RHVtcGVyOworICAgICRjb2RlID0gRGF0YTo6RHVtcGVyLT5EdW1wKFskc2VsZl0sIFtxdyhzZWxmKV0pOworICAgIGlmICgkb3B0ey1zdGFuZGFsb25lfSkgeworICAgICAgICAkY29kZSA9fiBzL1BhcnNlOjpSZWNEZXNjZW50LyRydW50aW1lX3BhY2thZ2UvZ3M7CisgICAgfQorICAgIHByaW50IE9VVCAkY29kZTsKKworICAgIHByaW50IE9VVCAifSI7CisKKyAgICBjbG9zZSBPVVQKKyAgICAgIG9yIGNyb2FrKCJDYW4ndCB3cml0ZSB0byBuZXcgbW9kdWxlIGZpbGUgJyRtb2R1bGVmaWxlJyIpOworfQorI2VuZGlmCisKK3BhY2thZ2UgUGFyc2U6OlJlY0Rlc2NlbnQ6OkxpbmVDb3VudGVyOworCisKK3N1YiBUSUVTQ0FMQVIgICAjICgkY2xhc3NuYW1lLCBcJHRleHQsICR0aGlzcGFyc2VyLCAkcHJldmZsYWcpCit7CisgICAgYmxlc3MgeworICAgICAgICB0ZXh0ICAgID0+ICRfWzFdLAorICAgICAgICBwYXJzZXIgID0+ICRfWzJdLAorICAgICAgICBwcmV2ICAgID0+ICRfWzNdPzE6MCwKKyAgICAgICAgICB9LCAkX1swXTsKK30KKworc3ViIEZFVENICit7CisgICAgbXkgJHBhcnNlciA9ICRfWzBdLT57cGFyc2VyfTsKKyAgICBteSAkY2FjaGUgPSAkcGFyc2VyLT57bGluZWNvdW50ZXJfY2FjaGV9OworICAgIG15ICRmcm9tID0gJHBhcnNlci0+e2Z1bGx0ZXh0bGVufS1sZW5ndGgoJHskX1swXS0+e3RleHR9fSktJF9bMF0tPntwcmV2fQorOworCisgICAgdW5sZXNzIChleGlzdHMgJGNhY2hlLT57JGZyb219KQorICAgIHsKKyAgICAgICAgJHBhcnNlci0+e2xhc3RsaW5lbnVtfSA9ICRwYXJzZXItPntvZmZzZXRsaW5lbnVtfQorICAgICAgICAgIC0gUGFyc2U6OlJlY0Rlc2NlbnQ6Ol9saW5lY291bnQoc3Vic3RyKCRwYXJzZXItPntmdWxsdGV4dH0sJGZyb20pKQorICAgICAgICAgICsgMTsKKyAgICAgICAgJGNhY2hlLT57JGZyb219ID0gJHBhcnNlci0+e2xhc3RsaW5lbnVtfTsKKyAgICB9CisgICAgcmV0dXJuICRjYWNoZS0+eyRmcm9tfTsKK30KKworc3ViIFNUT1JFCit7CisgICAgbXkgJHBhcnNlciA9ICRfWzBdLT57cGFyc2VyfTsKKyAgICAkcGFyc2VyLT57b2Zmc2V0bGluZW51bX0gLT0gJHBhcnNlci0+e2xhc3RsaW5lbnVtfSAtICRfWzFdOworICAgIHJldHVybiB1bmRlZjsKK30KKworc3ViIHJlc3luYyAgICMgKCRsaW5lY291bnRlcikKK3sKKyAgICBteSAkc2VsZiA9IHRpZWQoJF9bMF0pOworICAgIGRpZSAiVHJpZWQgdG8gYWx0ZXIgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBMaW5lQ291bnRlclxuIgorICAgICAgICB1bmxlc3MgJHNlbGYgPX4gL1BhcnNlOjpSZWNEZXNjZW50OjpMaW5lQ291bnRlci87CisKKyAgICBteSAkcGFyc2VyID0gJHNlbGYtPntwYXJzZXJ9OworICAgIG15ICRhcHBhcmVudGx5ID0gJHBhcnNlci0+e29mZnNldGxpbmVudW19CisgICAgICAgICAgICAgLSBQYXJzZTo6UmVjRGVzY2VudDo6X2xpbmVjb3VudCgkeyRzZWxmLT57dGV4dH19KQorICAgICAgICAgICAgICsgMTsKKworICAgICRwYXJzZXItPntvZmZzZXRsaW5lbnVtfSArPSAkcGFyc2VyLT57bGFzdGxpbmVudW19IC0gJGFwcGFyZW50bHk7CisgICAgcmV0dXJuIDE7Cit9CisKK3BhY2thZ2UgUGFyc2U6OlJlY0Rlc2NlbnQ6OkNvbENvdW50ZXI7CisKK3N1YiBUSUVTQ0FMQVIgICAjICgkY2xhc3NuYW1lLCBcJHRleHQsICR0aGlzcGFyc2VyLCAkcHJldmZsYWcpCit7CisgICAgYmxlc3MgeworICAgICAgICB0ZXh0ICAgID0+ICRfWzFdLAorICAgICAgICBwYXJzZXIgID0+ICRfWzJdLAorICAgICAgICBwcmV2ICAgID0+ICRfWzNdPzE6MCwKKyAgICAgICAgICB9LCAkX1swXTsKK30KKworc3ViIEZFVENICit7CisgICAgbXkgJHBhcnNlciA9ICRfWzBdLT57cGFyc2VyfTsKKyAgICBteSAkbWlzc2luZyA9ICRwYXJzZXItPntmdWxsdGV4dGxlbn0tbGVuZ3RoKCR7JF9bMF0tPnt0ZXh0fX0pLSRfWzBdLT57cHJldn0rMTsKKyAgICBzdWJzdHIoJHBhcnNlci0+e2Z1bGx0ZXh0fSwwLCRtaXNzaW5nKSA9fiBtL14oLiopXFovbTsKKyAgICByZXR1cm4gbGVuZ3RoKCQxKTsKK30KKworc3ViIFNUT1JFCit7CisgICAgZGllICJDYW4ndCBzZXQgY29sdW1uIG51bWJlciB2aWEgXCR0aGlzY29sdW1uXG4iOworfQorCisKK3BhY2thZ2UgUGFyc2U6OlJlY0Rlc2NlbnQ6Ok9mZnNldENvdW50ZXI7CisKK3N1YiBUSUVTQ0FMQVIgICAjICgkY2xhc3NuYW1lLCBcJHRleHQsICR0aGlzcGFyc2VyLCAkcHJldikKK3sKKyAgICBibGVzcyB7CisgICAgICAgIHRleHQgICAgPT4gJF9bMV0sCisgICAgICAgIHBhcnNlciAgPT4gJF9bMl0sCisgICAgICAgIHByZXYgICAgPT4gJF9bM10/LTE6MCwKKyAgICAgICAgICB9LCAkX1swXTsKK30KKworc3ViIEZFVENICit7CisgICAgbXkgJHBhcnNlciA9ICRfWzBdLT57cGFyc2VyfTsKKyAgICByZXR1cm4gJHBhcnNlci0+e2Z1bGx0ZXh0bGVufS1sZW5ndGgoJHskX1swXS0+e3RleHR9fSkrJF9bMF0tPntwcmV2fTsKK30KKworc3ViIFNUT1JFCit7CisgICAgZGllICJDYW4ndCBzZXQgY3VycmVudCBvZmZzZXQgdmlhIFwkdGhpc29mZnNldCBvciBcJHByZXZvZmZzZXRcbiI7Cit9CisKKworCitwYWNrYWdlIFBhcnNlOjpSZWNEZXNjZW50OjpSdWxlOworCitzdWIgbmV3ICgkJCQkJCkKK3sKKyAgICBteSAkY2xhc3MgPSByZWYoJF9bMF0pIHx8ICRfWzBdOworICAgIG15ICRuYW1lICA9ICRfWzFdOworICAgIG15ICRvd25lciA9ICRfWzJdOworICAgIG15ICRsaW5lICA9ICRfWzNdOworICAgIG15ICRyZXBsYWNlID0gJF9bNF07CisKKyAgICBpZiAoZGVmaW5lZCAkb3duZXItPnsicnVsZXMifXskbmFtZX0pCisgICAgeworICAgICAgICBteSAkc2VsZiA9ICRvd25lci0+eyJydWxlcyJ9eyRuYW1lfTsKKyAgICAgICAgaWYgKCRyZXBsYWNlICYmICEkc2VsZi0+eyJjaGFuZ2VkIn0pCisgICAgICAgIHsKKyAgICAgICAgICAgICRzZWxmLT5yZXNldDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJHNlbGY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAkb3duZXItPnsicnVsZXMifXskbmFtZX0gPQorICAgICAgICAgICAgYmxlc3MKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAibmFtZSIgICAgID0+ICRuYW1lLAorICAgICAgICAgICAgICAgICJwcm9kcyIgICAgPT4gW10sCisgICAgICAgICAgICAgICAgImNhbGxzIiAgICA9PiBbXSwKKyAgICAgICAgICAgICAgICAiY2hhbmdlZCIgID0+IDAsCisgICAgICAgICAgICAgICAgImxpbmUiICAgICA9PiAkbGluZSwKKyAgICAgICAgICAgICAgICAiaW1wY291bnQiID0+IDAsCisgICAgICAgICAgICAgICAgIm9wY291bnQiICA9PiAwLAorICAgICAgICAgICAgICAgICJ2YXJzIiAgICAgPT4gIiIsCisgICAgICAgICAgICB9LCAkY2xhc3M7CisgICAgfQorfQorCitzdWIgcmVzZXQoJCkKK3sKKyAgICBAeyRfWzBdLT57InByb2RzIn19ID0gKCk7CisgICAgQHskX1swXS0+eyJjYWxscyJ9fSA9ICgpOworICAgICRfWzBdLT57ImNoYW5nZWQifSAgPSAwOworICAgICRfWzBdLT57ImltcGNvdW50In0gID0gMDsKKyAgICAkX1swXS0+eyJvcGNvdW50In0gID0gMDsKKyAgICAkX1swXS0+eyJ2YXJzIn0gID0gIiI7Cit9CisKK3N1YiBERVNUUk9ZIHt9CisKK3N1YiBoYXNsZWZ0bW9zdCgkJCkKK3sKKyAgICBteSAoJHNlbGYsICRyZWYpID0gQF87CisKKyAgICBteSAkcHJvZDsKKyAgICBmb3JlYWNoICRwcm9kICggQHskc2VsZi0+eyJwcm9kcyJ9fSApCisgICAgeworICAgICAgICByZXR1cm4gMSBpZiAkcHJvZC0+aGFzbGVmdG1vc3QoJHJlZik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N1YiBsZWZ0bW9zdHN1YnJ1bGVzKCQpCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSBAc3VicnVsZXMgPSAoKTsKKworICAgIG15ICRwcm9kOworICAgIGZvcmVhY2ggJHByb2QgKCBAeyRzZWxmLT57InByb2RzIn19ICkKKyAgICB7CisgICAgICAgIHB1c2ggQHN1YnJ1bGVzLCAkcHJvZC0+bGVmdG1vc3RzdWJydWxlKCk7CisgICAgfQorCisgICAgcmV0dXJuIEBzdWJydWxlczsKK30KKworc3ViIGV4cGVjdGVkKCQpCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSBAZXhwZWN0ZWQgPSAoKTsKKworICAgIG15ICRwcm9kOworICAgIGZvcmVhY2ggJHByb2QgKCBAeyRzZWxmLT57InByb2RzIn19ICkKKyAgICB7CisgICAgICAgIG15ICRuZXh0ID0gJHByb2QtPmV4cGVjdGVkKCk7CisgICAgICAgIHVubGVzcyAoISAkbmV4dCBvciBfY29udGFpbnMoJG5leHQsQGV4cGVjdGVkKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2ggQGV4cGVjdGVkLCAkbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBqb2luICcsIG9yICcsIEBleHBlY3RlZDsKK30KKworc3ViIF9jb250YWlucygkQCkKK3sKKyAgICBteSAkdGFyZ2V0ID0gc2hpZnQ7CisgICAgbXkgJGl0ZW07CisgICAgZm9yZWFjaCAkaXRlbSAoIEBfICkgeyByZXR1cm4gMSBpZiAkdGFyZ2V0IGVxICRpdGVtOyB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N1YiBhZGRjYWxsKCQkKQoreworICAgIG15ICggJHNlbGYsICRzdWJydWxlICkgPSBAXzsKKyAgICB1bmxlc3MgKCBfY29udGFpbnMoJHN1YnJ1bGUsIEB7JHNlbGYtPnsiY2FsbHMifX0pICkKKyAgICB7CisgICAgICAgIHB1c2ggQHskc2VsZi0+eyJjYWxscyJ9fSwgJHN1YnJ1bGU7CisgICAgfQorfQorCitzdWIgYWRkcHJvZCgkJCkKK3sKKyAgICBteSAoICRzZWxmLCAkcHJvZCApID0gQF87CisgICAgcHVzaCBAeyRzZWxmLT57InByb2RzIn19LCAkcHJvZDsKKyAgICAkc2VsZi0+eyJjaGFuZ2VkIn0gPSAxOworICAgICRzZWxmLT57ImltcGNvdW50In0gPSAwOworICAgICRzZWxmLT57Im9wY291bnQifSA9IDA7CisgICAgJHByb2QtPnsibnVtYmVyIn0gPSAkI3skc2VsZi0+eyJwcm9kcyJ9fTsKKyAgICByZXR1cm4gJHByb2Q7Cit9CisKK3N1YiBhZGR2YXIKK3sKKyAgICBteSAoICRzZWxmLCAkdmFyLCAkcGFyc2VyICkgPSBAXzsKKyAgICBpZiAoJHZhciA9fiAvXEFccypsb2NhbFxzKyhbJUBcJF1cdyspLykKKyAgICB7CisgICAgICAgICRwYXJzZXItPntsb2NhbHZhcnN9IC49ICIgJDEiOworICAgICAgICAkc2VsZi0+eyJ2YXJzIn0gLj0gIiR2YXI7XG4iIH0KKyAgICBlbHNlCisgICAgICAgIHsgJHNlbGYtPnsidmFycyJ9IC49ICJteSAkdmFyO1xuIiB9CisgICAgJHNlbGYtPnsiY2hhbmdlZCJ9ID0gMTsKKyAgICByZXR1cm4gMTsKK30KKworc3ViIGFkZGF1dG9zY29yZQoreworICAgIG15ICggJHNlbGYsICRjb2RlICkgPSBAXzsKKyAgICAkc2VsZi0+eyJhdXRvc2NvcmUifSA9ICRjb2RlOworICAgICRzZWxmLT57ImNoYW5nZWQifSA9IDE7CisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBuZXh0b3BlcmF0b3IoJCkKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRwcm9kY291bnQgPSBzY2FsYXIgQHskc2VsZi0+eyJwcm9kcyJ9fTsKKyAgICBteSAkb3Bjb3VudCA9ICsrJHNlbGYtPnsib3Bjb3VudCJ9OworICAgIHJldHVybiAiX29wZXJhdG9yXyR7b3Bjb3VudH1fb2ZfcHJvZHVjdGlvbl8ke3Byb2Rjb3VudH1fb2ZfcnVsZV8kc2VsZi0+e25hbWV9IjsKK30KKworc3ViIG5leHRpbXBsaWNpdCgkKQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHByb2Rjb3VudCA9IHNjYWxhciBAeyRzZWxmLT57InByb2RzIn19OworICAgIG15ICRpbXBjb3VudCA9ICsrJHNlbGYtPnsiaW1wY291bnQifTsKKyAgICByZXR1cm4gIl9hbHRlcm5hdGlvbl8ke2ltcGNvdW50fV9vZl9wcm9kdWN0aW9uXyR7cHJvZGNvdW50fV9vZl9ydWxlXyRzZWxmLT57bmFtZX0iOworfQorCisKK3N1YiBjb2RlCit7CisgICAgbXkgKCRzZWxmLCAkbmFtZXNwYWNlLCAkcGFyc2VyLCAkY2hlY2spID0gQF87CisKK2V2YWwgJ3VuZGVmICYnIC4gJG5hbWVzcGFjZSAuICc6OicgLiAkc2VsZi0+eyJuYW1lIn0gdW5sZXNzICRwYXJzZXItPntzYXZpbmd9OworCisgICAgbXkgJGNvZGUgPQorJworIyBBUkdTIEFSRTogKCRwYXJzZXIsICR0ZXh0OyAkcmVwZWF0aW5nLCAkX25vYWN0aW9ucywgJF9pdGVtcG9zLCBcQGFyZ3MpCitzdWIgJyAuICRuYW1lc3BhY2UgLiAnOjonIC4gJHNlbGYtPnsibmFtZSJ9IC4gICcKK3sKKwlteSAkdGhpc3BhcnNlciA9ICRfWzBdOworCXVzZSB2YXJzIHF7JHRyYWNlbGV2ZWx9OworCWxvY2FsICR0cmFjZWxldmVsID0gKCR0cmFjZWxldmVsfHwwKSsxOworCSRFUlJPUlMgPSAwOworICAgIG15ICR0aGlzcnVsZSA9ICR0aGlzcGFyc2VyLT57InJ1bGVzIn17IicgLiAkc2VsZi0+eyJuYW1lIn0gLiAnIn07CisKKyAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlKHF7VHJ5aW5nIHJ1bGU6IFsnIC4gJHNlbGYtPnsibmFtZSJ9IC4gJ119LAorICAgICAgICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZWZpcnN0KCRfWzFdKSwKKyAgICAgICAgICAgICAgICAgIHF7JyAuICRzZWxmLT57Im5hbWUifSAuICd9LAorICAgICAgICAgICAgICAgICAgJHRyYWNlbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQgJDo6UkRfVFJBQ0U7CisKKyAgICAnIC4gKCRwYXJzZXItPntkZWZlcnJhYmxlfQorICAgICAgICA/ICdteSAkZGVmX2F0ID0gQHskdGhpc3BhcnNlci0+e2RlZmVycmVkfX07JworICAgICAgICA6ICcnKSAuCisgICAgJworICAgIG15ICRlcnJfYXQgPSBAeyR0aGlzcGFyc2VyLT57ZXJyb3JzfX07CisKKyAgICBteSAkc2NvcmU7CisgICAgbXkgJHNjb3JlX3JldHVybjsKKyAgICBteSAkX3RvazsKKyAgICBteSAkcmV0dXJuID0gdW5kZWY7CisgICAgbXkgJF9tYXRjaGVkPTA7CisgICAgbXkgJGNvbW1pdD0wOworICAgIG15IEBpdGVtID0gKCk7CisgICAgbXkgJWl0ZW0gPSAoKTsKKyAgICBteSAkcmVwZWF0aW5nID0gICRfWzJdOworICAgIG15ICRfbm9hY3Rpb25zID0gJF9bM107CisgICAgbXkgJF9pdGVtcG9zID0gJF9bNF07CisgICAgbXkgQGFyZyA9ICAgIGRlZmluZWQgJF9bNV0gPyBAeyAmeyRfWzVdfSB9IDogKCk7CisgICAgbXkgJWFyZyA9ICAgICgkI2FyZyAmIDAxKSA/IEBhcmcgOiAoQGFyZywgdW5kZWYpOworICAgIG15ICR0ZXh0OworICAgIG15ICRsYXN0c2VwOworICAgIG15ICRjdXJyZW50X21hdGNoOworICAgIG15ICRleHBlY3RhdGlvbiA9IG5ldyBQYXJzZTo6UmVjRGVzY2VudDo6RXhwZWN0YXRpb24ocXsnIC4gJHNlbGYtPmV4cGVjdGVkKCkgLiAnfSk7CisgICAgJGV4cGVjdGF0aW9uLT5hdCgkX1sxXSk7CisgICAgJy4gKCRwYXJzZXItPntfY2hlY2t9e3RoaXNvZmZzZXR9PycKKyAgICBteSAkdGhpc29mZnNldDsKKyAgICB0aWUgJHRoaXNvZmZzZXQsIHF7UGFyc2U6OlJlY0Rlc2NlbnQ6Ok9mZnNldENvdW50ZXJ9LCBcJHRleHQsICR0aGlzcGFyc2VyOworICAgICc6JycpIC4gKCRwYXJzZXItPntfY2hlY2t9e3ByZXZvZmZzZXR9PycKKyAgICBteSAkcHJldm9mZnNldDsKKyAgICB0aWUgJHByZXZvZmZzZXQsIHF7UGFyc2U6OlJlY0Rlc2NlbnQ6Ok9mZnNldENvdW50ZXJ9LCBcJHRleHQsICR0aGlzcGFyc2VyLCAxOworICAgICc6JycpIC4gKCRwYXJzZXItPntfY2hlY2t9e3RoaXNjb2x1bW59PycKKyAgICBteSAkdGhpc2NvbHVtbjsKKyAgICB0aWUgJHRoaXNjb2x1bW4sIHF7UGFyc2U6OlJlY0Rlc2NlbnQ6OkNvbENvdW50ZXJ9LCBcJHRleHQsICR0aGlzcGFyc2VyOworICAgICc6JycpIC4gKCRwYXJzZXItPntfY2hlY2t9e3ByZXZjb2x1bW59PycKKyAgICBteSAkcHJldmNvbHVtbjsKKyAgICB0aWUgJHByZXZjb2x1bW4sIHF7UGFyc2U6OlJlY0Rlc2NlbnQ6OkNvbENvdW50ZXJ9LCBcJHRleHQsICR0aGlzcGFyc2VyLCAxOworICAgICc6JycpIC4gKCRwYXJzZXItPntfY2hlY2t9e3ByZXZsaW5lfT8nCisgICAgbXkgJHByZXZsaW5lOworICAgIHRpZSAkcHJldmxpbmUsIHF7UGFyc2U6OlJlY0Rlc2NlbnQ6OkxpbmVDb3VudGVyfSwgXCR0ZXh0LCAkdGhpc3BhcnNlciwgMTsKKyAgICAnOicnKSAuICcKKyAgICBteSAkdGhpc2xpbmU7CisgICAgdGllICR0aGlzbGluZSwgcXtQYXJzZTo6UmVjRGVzY2VudDo6TGluZUNvdW50ZXJ9LCBcJHRleHQsICR0aGlzcGFyc2VyOworCisgICAgJy4gJHNlbGYtPnt2YXJzfSAuJworJzsKKworICAgIG15ICRwcm9kOworICAgIGZvcmVhY2ggJHByb2QgKCBAeyRzZWxmLT57InByb2RzIn19ICkKKyAgICB7CisgICAgICAgICRwcm9kLT5hZGRzY29yZSgkc2VsZi0+e2F1dG9zY29yZX0sMCwwKSBpZiAkc2VsZi0+e2F1dG9zY29yZX07CisgICAgICAgIG5leHQgdW5sZXNzICRwcm9kLT5jaGVja2xlZnRtb3N0KCk7CisgICAgICAgICRjb2RlIC49ICRwcm9kLT5jb2RlKCRuYW1lc3BhY2UsJHNlbGYsJHBhcnNlcik7CisKKyAgICAgICAgJGNvZGUgLj0gJHBhcnNlci0+e2RlZmVycmFibGV9CisgICAgICAgICAgICAgICAgPyAnICAgICBzcGxpY2UKKyAgICAgICAgICAgICAgICBAeyR0aGlzcGFyc2VyLT57ZGVmZXJyZWR9fSwgJGRlZl9hdCB1bmxlc3MgJF9tYXRjaGVkOworICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgIDogJyc7CisgICAgfQorCisgICAgJGNvZGUgLj0KKycKKyAgICB1bmxlc3MgKCAkX21hdGNoZWQgfHwgZGVmaW5lZCgkc2NvcmUpICkKKyAgICB7CisgICAgICAgICcgLigkcGFyc2VyLT57ZGVmZXJyYWJsZX0KKyAgICAgICAgICAgID8gJyAgICAgc3BsaWNlIEB7JHRoaXNwYXJzZXItPntkZWZlcnJlZH19LCAkZGVmX2F0OworICAgICAgICAgICAgICAnCisgICAgICAgICAgICA6ICcnKSAuICcKKworICAgICAgICAkX1sxXSA9ICR0ZXh0OyAgIyBOT1QgU1VSRSBUSElTIElTIE5FRURFRAorICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlKHF7PDwnLlBhcnNlOjpSZWNEZXNjZW50OjpfbWF0Y2h0cmFjZW1lc3NhZ2UoJHNlbGYsMSkuJyBydWxlPj59LAorICAgICAgICAgICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZWZpcnN0KCRfWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgIHF7JyAuICRzZWxmLT57Im5hbWUifSAuJ30sCisgICAgICAgICAgICAgICAgICAgICAkdHJhY2VsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZCAkOjpSRF9UUkFDRTsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICBpZiAoIWRlZmluZWQoJHJldHVybikgJiYgZGVmaW5lZCgkc2NvcmUpKQorICAgIHsKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxez4+QWNjZXB0ZWQgc2NvcmVkIHByb2R1Y3Rpb248PH0sICIiLAorICAgICAgICAgICAgICAgICAgICAgIHF7JyAuICRzZWxmLT57Im5hbWUifSAuJ30sCisgICAgICAgICAgICAgICAgICAgICAgJHRyYWNlbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkICQ6OlJEX1RSQUNFOworICAgICAgICAkcmV0dXJuID0gJHNjb3JlX3JldHVybjsKKyAgICB9CisgICAgc3BsaWNlIEB7JHRoaXNwYXJzZXItPntlcnJvcnN9fSwgJGVycl9hdDsKKyAgICAkcmV0dXJuID0gJGl0ZW1bJCNpdGVtXSB1bmxlc3MgZGVmaW5lZCAkcmV0dXJuOworICAgIGlmIChkZWZpbmVkICQ6OlJEX1RSQUNFKQorICAgIHsKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxez4+Jy5QYXJzZTo6UmVjRGVzY2VudDo6X21hdGNodHJhY2VtZXNzYWdlKCRzZWxmKS4nIHJ1bGU8PCAocmV0dXJuIHZhbHVlOiBbfSAuCisgICAgICAgICAgICAgICAgICAgICAgJHJldHVybiAuIHF7XSl9LCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICBxeycgLiAkc2VsZi0+eyJuYW1lIn0gLid9LAorICAgICAgICAgICAgICAgICAgICAgICR0cmFjZWxldmVsKTsKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxeyhjb25zdW1lZDogW30gLgorICAgICAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VtYXgoc3Vic3RyKCRfWzFdLDAsLWxlbmd0aCgkdGV4dCkpKSAuIHF7XSl9LAorICAgICAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VmaXJzdCgkdGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgLCBxeycgLiAkc2VsZi0+eyJuYW1lIn0gLid9LAorICAgICAgICAgICAgICAgICAgICAgICR0cmFjZWxldmVsKQorICAgIH0KKyAgICAkX1sxXSA9ICR0ZXh0OworICAgIHJldHVybiAkcmV0dXJuOworfQorJzsKKworICAgIHJldHVybiAkY29kZTsKK30KKworbXkgQGxlZnQ7CitzdWIgaXNsZWZ0cmVjKCQkKQoreworICAgIG15ICgkc2VsZiwgJHJ1bGVzKSA9IEBfOworICAgIG15ICRyb290ID0gJHNlbGYtPnsibmFtZSJ9OworICAgIEBsZWZ0ID0gJHNlbGYtPmxlZnRtb3N0c3VicnVsZXMoKTsKKyAgICBteSAkbmV4dDsKKyAgICBmb3JlYWNoICRuZXh0ICggQGxlZnQgKQorICAgIHsKKyAgICAgICAgbmV4dCB1bmxlc3MgZGVmaW5lZCAkcnVsZXMtPnskbmV4dH07ICMgU0tJUCBOT04tRVhJU1RFTlQgUlVMRVMKKyAgICAgICAgcmV0dXJuIDEgaWYgJG5leHQgZXEgJHJvb3Q7CisgICAgICAgIG15ICRjaGlsZDsKKyAgICAgICAgZm9yZWFjaCAkY2hpbGQgKCAkcnVsZXMtPnskbmV4dH0tPmxlZnRtb3N0c3VicnVsZXMoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2goQGxlZnQsICRjaGlsZCkKKyAgICAgICAgICAgIGlmICEgX2NvbnRhaW5zKCRjaGlsZCwgQGxlZnQpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworcGFja2FnZSBQYXJzZTo6UmVjRGVzY2VudDo6UHJvZHVjdGlvbjsKKworc3ViIGRlc2NyaWJlICgkOyQpCit7CisgICAgcmV0dXJuIGpvaW4gJyAnLCBtYXAgeyAkXy0+ZGVzY3JpYmUoJF9bMV0pIG9yICgpIH0gQHskX1swXS0+e2l0ZW1zfX07Cit9CisKK3N1YiBuZXcgKCQkOyQkKQoreworICAgIG15ICgkc2VsZiwgJGxpbmUsICR1bmNvbW1pdCwgJGVycm9yKSA9IEBfOworICAgIG15ICRjbGFzcyA9IHJlZigkc2VsZikgfHwgJHNlbGY7CisKKyAgICBibGVzcworICAgIHsKKyAgICAgICAgIml0ZW1zIiAgICA9PiBbXSwKKyAgICAgICAgInVuY29tbWl0IiA9PiAkdW5jb21taXQsCisgICAgICAgICJlcnJvciIgICAgPT4gJGVycm9yLAorICAgICAgICAibGluZSIgICAgID0+ICRsaW5lLAorICAgICAgICBzdHJjb3VudCAgID0+IDAsCisgICAgICAgIHBhdGNvdW50ICAgPT4gMCwKKyAgICAgICAgZGlyY291bnQgICA9PiAwLAorICAgICAgICBhY3Rjb3VudCAgID0+IDAsCisgICAgfSwgJGNsYXNzOworfQorCitzdWIgZXhwZWN0ZWQgKCQpCit7CisgICAgbXkgJGl0ZW1jb3VudCA9IHNjYWxhciBAeyRfWzBdLT57Iml0ZW1zIn19OworICAgIHJldHVybiAoJGl0ZW1jb3VudCkgPyAkX1swXS0+eyJpdGVtcyJ9WzBdLT5kZXNjcmliZSgxKSA6ICcnOworfQorCitzdWIgaGFzbGVmdG1vc3QgKCQkKQoreworICAgIG15ICgkc2VsZiwgJHJlZikgPSBAXzsKKyAgICByZXR1cm4gJHskc2VsZi0+eyJpdGVtcyJ9fVswXSBlcSAkcmVmICBpZiBzY2FsYXIgQHskc2VsZi0+eyJpdGVtcyJ9fTsKKyAgICByZXR1cm4gMDsKK30KKworc3ViIGlzZW1wdHkoJCkKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIHJldHVybiAwID09IEB7JHNlbGYtPnsiaXRlbXMifX07Cit9CisKK3N1YiBsZWZ0bW9zdHN1YnJ1bGUoJCkKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKCAkI3skc2VsZi0+eyJpdGVtcyJ9fSA+PSAwICkKKyAgICB7CisgICAgICAgIG15ICRzdWJydWxlID0gJHNlbGYtPnsiaXRlbXMifVswXS0+aXNzdWJydWxlKCk7CisgICAgICAgIHJldHVybiAkc3VicnVsZSBpZiBkZWZpbmVkICRzdWJydWxlOworICAgIH0KKworICAgIHJldHVybiAoKTsKK30KKworc3ViIGNoZWNrbGVmdG1vc3QoJCkKK3sKKyAgICBteSBAaXRlbXMgPSBAeyRfWzBdLT57Iml0ZW1zIn19OworICAgIGlmIChAaXRlbXM9PTEgJiYgcmVmKCRpdGVtc1swXSkgPX4gL1xBUGFyc2U6OlJlY0Rlc2NlbnQ6OkVycm9yLworICAgICAgICAmJiAkaXRlbXNbMF0tPntjb21taXRvbmx5fSApCisgICAgeworICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3dhcm4oMiwiTG9uZSA8ZXJyb3I/PiBpbiBwcm9kdWN0aW9uIHRyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzIDxlcnJvcj8+IDxyZWplY3Q+Iik7CisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfaGludCgiQSBwcm9kdWN0aW9uIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbCA8ZXJyb3I/PiBkaXJlY3RpdmUgd291bGQKKyAgICAgICAgICAgICAgICAgICAgICBub3JtYWxseSBzdWNjZWVkICh3aXRoIHRoZSB2YWx1ZSB6ZXJvKSBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBydWxlIGlzIG5vdCAnY29tbWl0ZWQnIHdoZW4gaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICB0cmllZC4gU2luY2UgeW91IGFsbW9zdCBjZXJ0YWlubHkgd2FudGVkCisgICAgICAgICAgICAgICAgICAgICAgJzxlcnJvcj8+IDxyZWplY3Q+JyBQYXJzZTo6UmVjRGVzY2VudAorICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGl0IGZvciB5b3UuIik7CisgICAgICAgIHB1c2ggQHskX1swXS0+e2l0ZW1zfX0sCisgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6VW5jb25kUmVqZWN0LT5uZXcoMCwwLCc8cmVqZWN0PicpOworICAgIH0KKyAgICBlbHNpZiAoQGl0ZW1zPT0xICYmICgkaXRlbXNbMF0tPmRlc2NyaWJlfHwiIikgPX4gLzxydWxldmFyfDxhdXRvc2NvcmUvKQorICAgIHsKKyAgICAgICAgIyBEbyBub3RoaW5nCisgICAgfQorICAgIGVsc2lmIChAaXRlbXMgJiYKKyAgICAgICAgKCByZWYoJGl0ZW1zWzBdKSA9fiAvXEFQYXJzZTo6UmVjRGVzY2VudDo6VW5jb25kUmVqZWN0LworICAgICAgICB8fCAoJGl0ZW1zWzBdLT5kZXNjcmliZXx8IiIpID1+IC88YXV0b3Njb3JlLworICAgICAgICApKQorICAgIHsKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol93YXJuKDEsIk9wdGltaXppbmcgYXdheSBwcm9kdWN0aW9uOiBbIi4gJF9bMF0tPmRlc2NyaWJlIC4iXSIpOworICAgICAgICBteSAkd2hhdCA9ICRpdGVtc1swXS0+ZGVzY3JpYmUgPX4gLzxydWxldmFyLworICAgICAgICAgICAgICAgID8gImEgPHJ1bGV2YXI+ICh3aGljaCBhY3RzIGxpa2UgYW4gdW5jb25kaXRpb25hbCA8cmVqZWN0PiBkdXJpbmcgcGFyc2luZykiCisgICAgICAgICAgICAgOiAkaXRlbXNbMF0tPmRlc2NyaWJlID1+IC88YXV0b3Njb3JlLworICAgICAgICAgICAgICAgID8gImFuIDxhdXRvc2NvcmU+ICh3aGljaCBhY3RzIGxpa2UgYW4gdW5jb25kaXRpb25hbCA8cmVqZWN0PiBkdXJpbmcgcGFyc2luZykiCisgICAgICAgICAgICAgICAgOiAiYW4gdW5jb25kaXRpb25hbCA8cmVqZWN0PiI7CisgICAgICAgIG15ICRjYXZlYXQgPSAkaXRlbXNbMF0tPmRlc2NyaWJlID1+IC88cnVsZXZhci8KKyAgICAgICAgICAgICAgICA/ICIgYWZ0ZXIgdGhlIHNwZWNpZmllZCB2YXJpYWJsZSB3YXMgc2V0IHVwIgorICAgICAgICAgICAgICAgIDogIiI7CisgICAgICAgIG15ICRhZHZpY2UgPSBAaXRlbXMgPiAxCisgICAgICAgICAgICAgICAgPyAiSG93ZXZlciwgdGhlcmUgd2VyZSBhbHNvIG90aGVyICh1c2VsZXNzKSBpdGVtcyBhZnRlciB0aGUgbGVhZGluZyAiCisgICAgICAgICAgICAgICAgICAuICRpdGVtc1swXS0+ZGVzY3JpYmUKKyAgICAgICAgICAgICAgICAgIC4gIiwgc28geW91IG1heSBoYXZlIGJlZW4gZXhwZWN0aW5nIHNvbWUgb3RoZXIgYmVoYXZpb3VyLiIKKyAgICAgICAgICAgICAgICA6ICJZb3UgY2FuIHNhZmVseSBpZ25vcmUgdGhpcyBtZXNzYWdlLiI7CisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfaGludCgiVGhlIHByb2R1Y3Rpb24gc3RhcnRzIHdpdGggJHdoYXQuIFRoYXQgbWVhbnMgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0aW9uIGNhbiBuZXZlciBzdWNjZXNzZnVsbHkgbWF0Y2gsIHNvIGl0IHdhcworICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplZCBvdXQgb2YgdGhlIGZpbmFsIHBhcnNlciRjYXZlYXQuICRhZHZpY2UiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdWIgY2hhbmdlc3NraXAoJCkKK3sKKyAgICBteSAkaXRlbTsKKyAgICBmb3JlYWNoICRpdGVtIChAeyRfWzBdLT57Iml0ZW1zIn19KQorICAgIHsKKyAgICAgICAgaWYgKHJlZigkaXRlbSkgPX4gL1BhcnNlOjpSZWNEZXNjZW50OjooQWN0aW9ufERpcmVjdGl2ZSkvKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMSBpZiAkaXRlbS0+e2NvZGV9ID1+IC9cJHNraXBccyo9LzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3ViIGFkZGRpcmVjdGl2ZQoreworICAgIG15ICggJHNlbGYsICR3aGljaG9wLCAkbGluZSwgJG5hbWUgKSA9IEBfOworICAgIHB1c2ggQHskc2VsZi0+e29wfX0sCisgICAgICAgIHsgdHlwZT0+JHdoaWNob3AsIGxpbmU9PiRsaW5lLCBuYW1lPT4kbmFtZSwKKyAgICAgICAgICBvZmZzZXQ9PiBzY2FsYXIoQHskc2VsZi0+e2l0ZW1zfX0pIH07Cit9CisKK3N1YiBhZGRzY29yZQoreworICAgIG15ICggJHNlbGYsICRjb2RlLCAkbG9va2FoZWFkLCAkbGluZSApID0gQF87CisgICAgJHNlbGYtPmFkZGl0ZW0oUGFyc2U6OlJlY0Rlc2NlbnQ6OkRpcmVjdGl2ZS0+bmV3KAorICAgICAgICAgICAgICAgICAgImxvY2FsIFwkXlc7CisgICAgICAgICAgICAgICAgICAgbXkgXCR0aGlzc2NvcmUgPSBkbyB7ICRjb2RlIH0gKyAwOworICAgICAgICAgICAgICAgICAgIGlmICghZGVmaW5lZChcJHNjb3JlKSB8fCBcJHRoaXNzY29yZT5cJHNjb3JlKQorICAgICAgICAgICAgICAgICAgICB7IFwkc2NvcmU9XCR0aGlzc2NvcmU7IFwkc2NvcmVfcmV0dXJuPVwkaXRlbVstMV07IH0KKyAgICAgICAgICAgICAgICAgICB1bmRlZjsiLCAkbG9va2FoZWFkLCAkbGluZSwiPHNjb3JlOiAkY29kZT4iKSApCisgICAgICAgIHVubGVzcyAkc2VsZi0+e2l0ZW1zfVstMV0tPmRlc2NyaWJlID1+IC88c2NvcmUvOworICAgIHJldHVybiAxOworfQorCitzdWIgY2hlY2tfcGVuZGluZworeworICAgIG15ICggJHNlbGYsICRsaW5lICkgPSBAXzsKKyAgICBpZiAoJHNlbGYtPntvcH0pCisgICAgeworICAgICAgICB3aGlsZSAobXkgJG5leHQgPSBwb3AgQHskc2VsZi0+e29wfX0pCisgICAgICAgIHsKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol9lcnJvcigiSW5jb21wbGV0ZSA8JG5leHQtPnt0eXBlfW9wOi4uLj4uIiwgJGxpbmUpOworICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X2hpbnQoCisgICAgICAgICAgICAiVGhlIGN1cnJlbnQgcHJvZHVjdGlvbiBlbmRlZCB3aXRob3V0IGNvbXBsZXRpbmcgdGhlCisgICAgICAgICAgICAgPCRuZXh0LT57dHlwZX1vcDouLi4+IGRpcmVjdGl2ZSB0aGF0IHN0YXJ0ZWQgbmVhciBsaW5lCisgICAgICAgICAgICAgJG5leHQtPntsaW5lfS4gRGlkIHlvdSBmb3JnZXQgdGhlIGNsb3NpbmcgJz4nPyIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdWIgZW5kZGlyZWN0aXZlCit7CisgICAgbXkgKCAkc2VsZiwgJGxpbmUsICRtaW5yZXAsICRtYXhyZXAgKSA9IEBfOworICAgIHVubGVzcyAoJHNlbGYtPntvcH0pCisgICAgeworICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X2Vycm9yKCJVbm1hdGNoZWQgPiBmb3VuZC4iLCAkbGluZSk7CisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfaGludCgKKyAgICAgICAgICAgICJBICc+JyBhbmdsZSBicmFja2V0IHdhcyBlbmNvdW50ZXJlZCwgd2hpY2ggdHlwaWNhbGx5CisgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBlbmQgb2YgYSBkaXJlY3RpdmUuIEhvd2V2ZXIgbm8gc3VpdGFibGUKKyAgICAgICAgICAgICBwcmVjZWRpbmcgZGlyZWN0aXZlIHdhcyBlbmNvdW50ZXJlZC4gVHlwaWNhbGx5IHRoaXMKKyAgICAgICAgICAgICBpbmRpY2F0ZXMgZWl0aGVyIGEgZXh0cmEgJz4nIGluIHRoZSBncmFtbWFyLCBvciBhCisgICAgICAgICAgICAgcHJvYmxlbSBpbnNpZGUgdGhlIHByZXZpb3VzIGRpcmVjdGl2ZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBteSAkb3AgPSBwb3AgQHskc2VsZi0+e29wfX07CisgICAgbXkgJHNwYW4gPSBAeyRzZWxmLT57aXRlbXN9fSAtICRvcC0+e29mZnNldH07CisgICAgaWYgKCRvcC0+e3R5cGV9ID1+IC9sZWZ0fHJpZ2h0LykKKyAgICB7CisgICAgICAgIGlmICgkc3BhbiAhPSAzKQorICAgICAgICB7CisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfZXJyb3IoCisgICAgICAgICAgICAiSW5jb3JyZWN0IDwkb3AtPnt0eXBlfW9wOi4uLj4gc3BlY2lmaWNhdGlvbjoKKyAgICAgICAgICAgICBleHBlY3RlZCAzIGFyZ3MsIGJ1dCBmb3VuZCAkc3BhbiBpbnN0ZWFkIiwgJGxpbmUpOworICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X2hpbnQoCisgICAgICAgICAgICAiVGhlIDwkb3AtPnt0eXBlfW9wOi4uLj4gZGlyZWN0aXZlIHJlcXVpcmVzIGEKKyAgICAgICAgICAgICBzZXF1ZW5jZSBvZiBleGFjdGx5IHRocmVlIGVsZW1lbnRzLiBGb3IgZXhhbXBsZToKKyAgICAgICAgICAgICA8JG9wLT57dHlwZX1vcDpsZWZ0YXJnIC9vcC8gcmlnaHRhcmc+Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgIHB1c2ggQHskc2VsZi0+e2l0ZW1zfX0sCisgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6T3BlcmF0b3ItPm5ldygKKyAgICAgICAgICAgICAgICAkb3AtPnt0eXBlfSwgJG1pbnJlcCwgJG1heHJlcCwgc3BsaWNlKEB7JHNlbGYtPnsiaXRlbXMifX0sIC0zKSk7CisgICAgICAgICRzZWxmLT57aXRlbXN9Wy0xXS0+c2V0aGFzaG5hbWUoJHNlbGYpOworICAgICAgICAkc2VsZi0+e2l0ZW1zfVstMV17bmFtZX0gPSAkb3AtPntuYW1lfTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3ViIHByZXZ3YXNyZXR1cm4KK3sKKyAgICBteSAoICRzZWxmLCAkbGluZSApID0gQF87CisgICAgdW5sZXNzIChAeyRzZWxmLT57aXRlbXN9fSkKKyAgICB7CisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfZXJyb3IoCisgICAgICAgICAgICAiSW5jb3JyZWN0IDxyZXR1cm46Li4uPiBzcGVjaWZpY2F0aW9uOgorICAgICAgICAgICAgZXhwZWN0ZWQgaXRlbSBtaXNzaW5nIiwgJGxpbmUpOworICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X2hpbnQoCisgICAgICAgICAgICAiVGhlIDxyZXR1cm46Li4uPiBkaXJlY3RpdmUgcmVxdWlyZXMgYQorICAgICAgICAgICAgc2VxdWVuY2Ugb2YgYXQgbGVhc3Qgb25lIGl0ZW0uIEZvciBleGFtcGxlOgorICAgICAgICAgICAgPHJldHVybjogbGlzdD4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwdXNoIEB7JHNlbGYtPntpdGVtc319LAorICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6UmVzdWx0LT5uZXcoKTsKK30KKworc3ViIGFkZGl0ZW0KK3sKKyAgICBteSAoICRzZWxmLCAkaXRlbSApID0gQF87CisgICAgJGl0ZW0tPnNldGhhc2huYW1lKCRzZWxmKTsKKyAgICBwdXNoIEB7JHNlbGYtPnsiaXRlbXMifX0sICRpdGVtOworICAgIHJldHVybiAkaXRlbTsKK30KKworc3ViIF9kdXBsaWNhdGVfaXRlbXBvcworeworICAgIG15ICgkc3JjKSA9IEBfOworICAgIG15ICRkc3QgPSB7fTsKKworICAgIGZvcmVhY2ggKGtleXMgJSRzcmMpCisgICAgeworICAgICAgICAleyRkc3QtPnskX319ID0gJXskc3JjLT57JF99fTsKKyAgICB9CisgICAgJGRzdDsKK30KKworc3ViIF91cGRhdGVfaXRlbXBvcworeworICAgIG15ICgkZHN0LCAkc3JjLCAkdHlwZWtleXMsICRwb3NrZXlzKSA9IEBfOworCisgICAgbXkgQHR5cGVrZXlzID0gJ0FSUkFZJyBlcSByZWYgJHR5cGVrZXlzID8KKyAgICAgIEAkdHlwZWtleXMgOgorICAgICAga2V5cyAlJHNyYzsKKworICAgIGZvcmVhY2ggbXkgJGsgKGtleXMgJSRzcmMpCisgICAgeworICAgICAgICBpZiAoJ0FSUkFZJyBlcSByZWYgJHBvc2tleXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEB7JGRzdC0+eyRrfX17QCRwb3NrZXlzfSA9IEB7JHNyYy0+eyRrfX17QCRwb3NrZXlzfTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICV7JGRzdC0+eyRrfX0gPSAleyRzcmMtPnska319OworICAgICAgICB9CisgICAgfQorfQorCitzdWIgcHJlaXRlbXBvcworeworICAgIHJldHVybiBxCisgICAgeworICAgICAgICBwdXNoIEBpdGVtcG9zLCB7J29mZnNldCcgPT4geydmcm9tJz0+JHRoaXNvZmZzZXQsICd0byc9PnVuZGVmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdsaW5lJyAgID0+IHsnZnJvbSc9PiR0aGlzbGluZSwgICAndG8nPT51bmRlZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAnY29sdW1uJyA9PiB7J2Zyb20nPT4kdGhpc2NvbHVtbiwgJ3RvJz0+dW5kZWZ9IH07CisgICAgfQorfQorCitzdWIgaW5jaXRlbXBvcworeworICAgIHJldHVybiBxCisgICAgeworICAgICAgICAkaXRlbXBvc1skI2l0ZW1wb3NdeydvZmZzZXQnfXsnZnJvbSd9ICs9IGxlbmd0aCgkbGFzdHNlcCk7CisgICAgICAgICRpdGVtcG9zWyQjaXRlbXBvc117J2xpbmUnfXsnZnJvbSd9ICAgPSAkdGhpc2xpbmU7CisgICAgICAgICRpdGVtcG9zWyQjaXRlbXBvc117J2NvbHVtbid9eydmcm9tJ30gPSAkdGhpc2NvbHVtbjsKKyAgICB9Cit9CisKK3N1YiB1bmluY2l0ZW1wb3MKK3sKKyAgICAjIHRoZSBuZXh0IGluY2l0ZW1wb3Mgd2lsbCBwcm9wZXJseSBzZXQgdGhlc2UgdHdvIGZpZWxkcywgYnV0CisgICAgIyB7J29mZnNldCd9eydmcm9tJ30gbmVlZHMgdG8gYmUgZGVjcmVhc2VkIGJ5IGxlbmd0aCgkbGFzdHNlcCkKKyAgICAjICRpdGVtcG9zWyQjaXRlbXBvc117J2xpbmUnfXsnZnJvbSd9CisgICAgIyAkaXRlbXBvc1skI2l0ZW1wb3Ndeydjb2x1bW4nfXsnZnJvbSd9CisgICAgcmV0dXJuIHEKKyAgICB7CisgICAgICAgICRpdGVtcG9zWyQjaXRlbXBvc117J29mZnNldCd9eydmcm9tJ30gLT0gbGVuZ3RoKCRsYXN0c2VwKSBpZiBkZWZpbmVkICRsYXN0c2VwOworICAgIH0KK30KKworc3ViIHBvc3RpdGVtcG9zCit7CisgICAgcmV0dXJuIHEKKyAgICB7CisgICAgICAgICRpdGVtcG9zWyQjaXRlbXBvc117J29mZnNldCd9eyd0byd9ID0gJHByZXZvZmZzZXQ7CisgICAgICAgICRpdGVtcG9zWyQjaXRlbXBvc117J2xpbmUnfXsndG8nfSAgID0gJHByZXZsaW5lOworICAgICAgICAkaXRlbXBvc1skI2l0ZW1wb3Ndeydjb2x1bW4nfXsndG8nfSA9ICRwcmV2Y29sdW1uOworICAgIH0KK30KKworc3ViIGNvZGUoJCQkJCkKK3sKKyAgICBteSAoJHNlbGYsJG5hbWVzcGFjZSwkcnVsZSwkcGFyc2VyKSA9IEBfOworICAgIG15ICRjb2RlID0KKycKKyAgICB3aGlsZSAoISRfbWF0Y2hlZCcKKyAgICAuIChkZWZpbmVkICRzZWxmLT57InVuY29tbWl0In0gPyAnJyA6ICcgJiYgISRjb21taXQnKQorICAgIC4gJykKKyAgICB7CisgICAgICAgICcgLgorICAgICAgICAoJHNlbGYtPmNoYW5nZXNza2lwKCkKKyAgICAgICAgICAgID8gJ2xvY2FsICRza2lwID0gZGVmaW5lZCgkc2tpcCkgPyAkc2tpcCA6ICRQYXJzZTo6UmVjRGVzY2VudDo6c2tpcDsnCisgICAgICAgICAgICA6ICcnKSAuJworICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlKHF7VHJ5aW5nIHByb2R1Y3Rpb246IFsnCisgICAgICAgICAgICAgICAgICAgICAgLiAkc2VsZi0+ZGVzY3JpYmUgLiAnXX0sCisgICAgICAgICAgICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZWZpcnN0KCRfWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICBxeycgLiAkcnVsZSAtPntuYW1lfS4gJ30sCisgICAgICAgICAgICAgICAgICAgICAgJHRyYWNlbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkICQ6OlJEX1RSQUNFOworICAgICAgICBteSAkdGhpc3Byb2QgPSAkdGhpc3J1bGUtPnsicHJvZHMifVsnIC4gJHNlbGYtPnsibnVtYmVyIn0gLiAnXTsKKyAgICAgICAgJyAuIChkZWZpbmVkICRzZWxmLT57ImVycm9yIn0gPyAnJyA6ICckdGV4dCA9ICRfWzFdOycgKSAuICcKKyAgICAgICAgbXkgJF9zYXZldGV4dDsKKyAgICAgICAgQGl0ZW0gPSAocXsnIC4gJHJ1bGUtPnsibmFtZSJ9IC4gJ30pOworICAgICAgICAlaXRlbSA9IChfX1JVTEVfXyA9PiBxeycgLiAkcnVsZS0+eyJuYW1lIn0gLiAnfSk7CisgICAgICAgIG15ICRyZXBjb3VudCA9IDA7CisKKyc7CisgICAgJGNvZGUgLj0KKycgICAgICAgIG15IEBpdGVtcG9zID0gKHt9KTsKKycgICAgICAgICAgIGlmICRwYXJzZXItPntfY2hlY2t9e2l0ZW1wb3N9OworCisgICAgbXkgJGl0ZW07CisgICAgbXkgJGk7CisKKyAgICBmb3IgKCRpID0gMDsgJGkgPCBAeyRzZWxmLT57Iml0ZW1zIn19OyAkaSsrKQorICAgIHsKKyAgICAgICAgJGl0ZW0gPSAkeyRzZWxmLT57aXRlbXN9fVskaV07CisKKyAgICAgICAgJGNvZGUgLj0gcHJlaXRlbXBvcygpIGlmICRwYXJzZXItPntfY2hlY2t9e2l0ZW1wb3N9OworCisgICAgICAgICRjb2RlIC49ICRpdGVtLT5jb2RlKCRuYW1lc3BhY2UsJHJ1bGUsJHBhcnNlci0+e19jaGVja30pOworCisgICAgICAgICRjb2RlIC49IHBvc3RpdGVtcG9zKCkgaWYgJHBhcnNlci0+e19jaGVja317aXRlbXBvc307CisKKyAgICB9CisKKyAgICBpZiAoJHBhcnNlci0+e19BVVRPQUNUSU9OfSAmJiBkZWZpbmVkKCRpdGVtKSAmJiAhJGl0ZW0tPmlzYSgiUGFyc2U6OlJlY0Rlc2NlbnQ6OkFjdGlvbiIpKQorICAgIHsKKyAgICAgICAgJGNvZGUgLj0gJHBhcnNlci0+e19BVVRPQUNUSU9OfS0+Y29kZSgkbmFtZXNwYWNlLCRydWxlKTsKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol93YXJuKDEsIkF1dG9nZW5lcmF0aW5nIGFjdGlvbiBpbiBydWxlCisgICAgICAgICAgICAgICAgICAgICAgIFwiJHJ1bGUtPntuYW1lfVwiOgorICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnNlci0+e19BVVRPQUNUSU9OfXtjb2RlfSIpCisgICAgICAgIGFuZAorICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X2hpbnQoIlRoZSBcJDo6UkRfQVVUT0FDVElPTiB3YXMgZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICBzbyBhbnkgcHJvZHVjdGlvbiBub3QgZW5kaW5nIGluIGFuCisgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQgYWN0aW9uIGhhcyB0aGUgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICAgXCJhdXRvLWFjdGlvblwiIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRlZC4iKTsKKyAgICB9CisgICAgZWxzaWYgKCRwYXJzZXItPntfQVVUT1RSRUV9ICYmIGRlZmluZWQoJGl0ZW0pICYmICEkaXRlbS0+aXNhKCJQYXJzZTo6UmVjRGVzY2VudDo6QWN0aW9uIikpCisgICAgeworICAgICAgICBpZiAoJGk9PTEgJiYgJGl0ZW0tPmlzdGVybWluYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgICRjb2RlIC49ICRwYXJzZXItPntfQVVUT1RSRUV9e1RFUk1JTkFMfS0+Y29kZSgkbmFtZXNwYWNlLCRydWxlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICRjb2RlIC49ICRwYXJzZXItPntfQVVUT1RSRUV9e05PREV9LT5jb2RlKCRuYW1lc3BhY2UsJHJ1bGUpOworICAgICAgICB9CisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50Ojpfd2FybigxLCJBdXRvZ2VuZXJhdGluZyB0cmVlLWJ1aWxkaW5nIGFjdGlvbiBpbiBydWxlCisgICAgICAgICAgICAgICAgICAgICAgIFwiJHJ1bGUtPntuYW1lfVwiIikKKyAgICAgICAgYW5kCisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfaGludCgiVGhlIGRpcmVjdGl2ZSA8YXV0b3RyZWU+IHdhcyBzcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgc28gYW55IHByb2R1Y3Rpb24gbm90IGVuZGluZworICAgICAgICAgICAgICAgICAgICAgIGluIGFuIGV4cGxpY2l0IGFjdGlvbiBoYXMKKyAgICAgICAgICAgICAgICAgICAgICBzb21lIHBhcnNlLXRyZWUgYnVpbGRpbmcgY29kZQorICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQuIik7CisgICAgfQorCisgICAgJGNvZGUgLj0KKycKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxez4+Jy5QYXJzZTo6UmVjRGVzY2VudDo6X21hdGNodHJhY2VtZXNzYWdlKCRzZWxmKS4nIHByb2R1Y3Rpb246IFsnCisgICAgICAgICAgICAgICAgICAgICAgLiAkc2VsZi0+ZGVzY3JpYmUgLiAnXTw8fSwKKyAgICAgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlZmlyc3QoJHRleHQpLAorICAgICAgICAgICAgICAgICAgICAgIHF7JyAuICRydWxlLT57bmFtZX0gLiAnfSwKKyAgICAgICAgICAgICAgICAgICAgICAkdHJhY2VsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQgJDo6UkRfVFJBQ0U7CisKKycgLiAoICRwYXJzZXItPntfY2hlY2t9e2l0ZW1wb3N9ID8gJworICAgICAgICBpZiAoIGRlZmluZWQoJF9pdGVtcG9zKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpQcm9kdWN0aW9uOjpfdXBkYXRlX2l0ZW1wb3MoJF9pdGVtcG9zLCAkaXRlbXBvc1sgMV0sIHVuZGVmLCBbcXcoZnJvbSldKTsKKyAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpQcm9kdWN0aW9uOjpfdXBkYXRlX2l0ZW1wb3MoJF9pdGVtcG9zLCAkaXRlbXBvc1stMV0sIHVuZGVmLCBbcXcodG8pXSk7CisgICAgICAgIH0KKycgOiAnJyApIC4gJworCisgICAgICAgICRfbWF0Y2hlZCA9IDE7CisgICAgICAgIGxhc3Q7CisgICAgfQorCisnOworICAgIHJldHVybiAkY29kZTsKK30KKworMTsKKworcGFja2FnZSBQYXJzZTo6UmVjRGVzY2VudDo6QWN0aW9uOworCitzdWIgZGVzY3JpYmUgeyB1bmRlZiB9CisKK3N1YiBzZXRoYXNobmFtZSB7ICRfWzBdLT57aGFzaG5hbWV9ID0gJ19fQUNUSU9OJyAuICsrJF9bMV0tPnthY3Rjb3VudH0gLidfXyc7IH0KKworc3ViIG5ldworeworICAgIG15ICRjbGFzcyA9IHJlZigkX1swXSkgfHwgJF9bMF07CisgICAgYmxlc3MKKyAgICB7CisgICAgICAgICJjb2RlIiAgICAgID0+ICRfWzFdLAorICAgICAgICAibG9va2FoZWFkIiA9PiAkX1syXSwKKyAgICAgICAgImxpbmUiICAgICAgPT4gJF9bM10sCisgICAgfSwgJGNsYXNzOworfQorCitzdWIgaXNzdWJydWxlIHsgdW5kZWYgfQorc3ViIGlzdGVybWluYWwgeyAwIH0KKworc3ViIGNvZGUoJCQkJCkKK3sKKyAgICBteSAoJHNlbGYsICRuYW1lc3BhY2UsICRydWxlKSA9IEBfOworCisnCisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2UocXtUcnlpbmcgYWN0aW9ufSwKKyAgICAgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlZmlyc3QoJHRleHQpLAorICAgICAgICAgICAgICAgICAgICAgIHF7JyAuICRydWxlLT57bmFtZX0gLiAnfSwKKyAgICAgICAgICAgICAgICAgICAgICAkdHJhY2VsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQgJDo6UkRfVFJBQ0U7CisgICAgICAgICcgLiAoJHNlbGYtPnsibG9va2FoZWFkIn0gPyAnJF9zYXZldGV4dCA9ICR0ZXh0OycgOiAnJyApIC4nCisKKyAgICAgICAgJF90b2sgPSAoJF9ub2FjdGlvbnMpID8gMCA6IGRvICcgLiAkc2VsZi0+eyJjb2RlIn0gLiAnOworICAgICAgICAnIC4gKCRzZWxmLT57Imxvb2thaGVhZCJ9PDA/J2lmJzondW5sZXNzJykgLiAnIChkZWZpbmVkICRfdG9rKQorICAgICAgICB7CisgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlKHF7PDwnLlBhcnNlOjpSZWNEZXNjZW50OjpfbWF0Y2h0cmFjZW1lc3NhZ2UoJHNlbGYsMSkuJyBhY3Rpb24+PiAocmV0dXJuIHZhbHVlOiBbdW5kZWZdKX0pCisgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQgJDo6UkRfVFJBQ0U7CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9CisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2UocXs+PicuUGFyc2U6OlJlY0Rlc2NlbnQ6Ol9tYXRjaHRyYWNlbWVzc2FnZSgkc2VsZikuJyBhY3Rpb248PCAocmV0dXJuIHZhbHVlOiBbfQorICAgICAgICAgICAgICAgICAgICAgIC4gJF90b2sgLiBxe10pfSwKKyAgICAgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlZmlyc3QoJHRleHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZCAkOjpSRF9UUkFDRTsKKyAgICAgICAgcHVzaCBAaXRlbSwgJF90b2s7CisgICAgICAgICcgLiAoJHNlbGYtPntsaW5lfT49MCA/ICckaXRlbXsnLiAkc2VsZi0+e2hhc2huYW1lfSAuJ309JF90b2s7JyA6ICcnICkgLicKKyAgICAgICAgJyAuICgkc2VsZi0+eyJsb29rYWhlYWQifSA/ICckdGV4dCA9ICRfc2F2ZXRleHQ7JyA6ICcnICkgLicKKycKK30KKworCisxOworCitwYWNrYWdlIFBhcnNlOjpSZWNEZXNjZW50OjpEaXJlY3RpdmU7CisKK3N1YiBzZXRoYXNobmFtZSB7ICRfWzBdLT57aGFzaG5hbWV9ID0gJ19fRElSRUNUSVZFJyAuICsrJF9bMV0tPntkaXJjb3VudH0gLiAgJ19fJzsgfQorCitzdWIgaXNzdWJydWxlIHsgdW5kZWYgfQorc3ViIGlzdGVybWluYWwgeyAwIH0KK3N1YiBkZXNjcmliZSB7ICRfWzFdID8gJycgOiAkX1swXS0+e25hbWV9IH0KKworc3ViIG5ldyAoJCQkJCQpCit7CisgICAgbXkgJGNsYXNzID0gcmVmKCRfWzBdKSB8fCAkX1swXTsKKyAgICBibGVzcworICAgIHsKKyAgICAgICAgImNvZGUiICAgICAgPT4gJF9bMV0sCisgICAgICAgICJsb29rYWhlYWQiID0+ICRfWzJdLAorICAgICAgICAibGluZSIgICAgICA9PiAkX1szXSwKKyAgICAgICAgIm5hbWUiICAgICAgPT4gJF9bNF0sCisgICAgfSwgJGNsYXNzOworfQorCitzdWIgY29kZSgkJCQkKQoreworICAgIG15ICgkc2VsZiwgJG5hbWVzcGFjZSwgJHJ1bGUpID0gQF87CisKKycKKyAgICAgICAgJyAuICgkc2VsZi0+eyJsb29rYWhlYWQifSA/ICckX3NhdmV0ZXh0ID0gJHRleHQ7JyA6ICcnICkgLicKKworICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlKHF7VHJ5aW5nIGRpcmVjdGl2ZTogWycKKyAgICAgICAgICAgICAgICAgICAgLiAkc2VsZi0+ZGVzY3JpYmUgLiAnXX0sCisgICAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VmaXJzdCgkdGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgcXsnIC4gJHJ1bGUtPntuYW1lfSAuICd9LAorICAgICAgICAgICAgICAgICAgICAgICR0cmFjZWxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZCAkOjpSRF9UUkFDRTsgJyAuJworICAgICAgICAkX3RvayA9IGRvIHsgJyAuICRzZWxmLT57ImNvZGUifSAuICcgfTsKKyAgICAgICAgaWYgKGRlZmluZWQoJF90b2spKQorICAgICAgICB7CisgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlKHF7Pj4nLlBhcnNlOjpSZWNEZXNjZW50OjpfbWF0Y2h0cmFjZW1lc3NhZ2UoJHNlbGYpLicgZGlyZWN0aXZlPDwgKHJldHVybiB2YWx1ZTogW30KKyAgICAgICAgICAgICAgICAgICAgICAgIC4gJF90b2sgLiBxe10pfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VmaXJzdCgkdGV4dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZCAkOjpSRF9UUkFDRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2UocXs8PCcuUGFyc2U6OlJlY0Rlc2NlbnQ6Ol9tYXRjaHRyYWNlbWVzc2FnZSgkc2VsZiwxKS4nIGRpcmVjdGl2ZT4+fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VmaXJzdCgkdGV4dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZCAkOjpSRF9UUkFDRTsKKyAgICAgICAgfQorICAgICAgICAnIC4gKCRzZWxmLT57Imxvb2thaGVhZCJ9ID8gJyR0ZXh0ID0gJF9zYXZldGV4dCBhbmQgJyA6ICcnICkgLicKKyAgICAgICAgbGFzdCAnCisgICAgICAgIC4gKCRzZWxmLT57Imxvb2thaGVhZCJ9PDA/J2lmJzondW5sZXNzJykgLiAnIGRlZmluZWQgJF90b2s7CisgICAgICAgIHB1c2ggQGl0ZW0sICRpdGVteycuJHNlbGYtPntoYXNobmFtZX0uJ309JF90b2s7CisgICAgICAgICcgLiAoJHNlbGYtPnsibG9va2FoZWFkIn0gPyAnJHRleHQgPSAkX3NhdmV0ZXh0OycgOiAnJyApIC4nCisnCit9CisKKzE7CisKK3BhY2thZ2UgUGFyc2U6OlJlY0Rlc2NlbnQ6OlVuY29uZFJlamVjdDsKKworc3ViIGlzc3VicnVsZSB7IHVuZGVmIH0KK3N1YiBpc3Rlcm1pbmFsIHsgMCB9CitzdWIgZGVzY3JpYmUgeyAkX1sxXSA/ICcnIDogJF9bMF0tPntuYW1lfSB9CitzdWIgc2V0aGFzaG5hbWUgeyAkX1swXS0+e2hhc2huYW1lfSA9ICdfX0RJUkVDVElWRScgLiArKyRfWzFdLT57ZGlyY291bnR9IC4gICdfXyc7IH0KKworc3ViIG5ldyAoJCQkOyQpCit7CisgICAgbXkgJGNsYXNzID0gcmVmKCRfWzBdKSB8fCAkX1swXTsKKyAgICBibGVzcworICAgIHsKKyAgICAgICAgImxvb2thaGVhZCIgPT4gJF9bMV0sCisgICAgICAgICJsaW5lIiAgICAgID0+ICRfWzJdLAorICAgICAgICAibmFtZSIgICAgICA9PiAkX1szXSwKKyAgICB9LCAkY2xhc3M7Cit9CisKKyMgTUFSSywgWU9VIE1BWSBXQU5UIFRPIE9QVElNSVpFIFRISVMuCisKKworc3ViIGNvZGUoJCQkJCkKK3sKKyAgICBteSAoJHNlbGYsICRuYW1lc3BhY2UsICRydWxlKSA9IEBfOworCisnCisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2UocXs+PlJlamVjdGluZyBwcm9kdWN0aW9uPDwgKGZvdW5kICcKKyAgICAgICAgICAgICAgICAgICAgIC4gJHNlbGYtPmRlc2NyaWJlIC4gJyl9LAorICAgICAgICAgICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZWZpcnN0KCR0ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICBxeycgLiAkcnVsZS0+e25hbWV9IC4gJ30sCisgICAgICAgICAgICAgICAgICAgICAgJHRyYWNlbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkICQ6OlJEX1RSQUNFOworICAgICAgICB1bmRlZiAkcmV0dXJuOworICAgICAgICAnIC4gKCRzZWxmLT57Imxvb2thaGVhZCJ9ID8gJyRfc2F2ZXRleHQgPSAkdGV4dDsnIDogJycgKSAuJworCisgICAgICAgICRfdG9rID0gdW5kZWY7CisgICAgICAgICcgLiAoJHNlbGYtPnsibG9va2FoZWFkIn0gPyAnJHRleHQgPSAkX3NhdmV0ZXh0IGFuZCAnIDogJycgKSAuJworICAgICAgICBsYXN0ICcKKyAgICAgICAgLiAoJHNlbGYtPnsibG9va2FoZWFkIn08MD8naWYnOid1bmxlc3MnKSAuICcgZGVmaW5lZCAkX3RvazsKKycKK30KKworMTsKKworcGFja2FnZSBQYXJzZTo6UmVjRGVzY2VudDo6RXJyb3I7CisKK3N1YiBpc3N1YnJ1bGUgeyB1bmRlZiB9CitzdWIgaXN0ZXJtaW5hbCB7IDAgfQorc3ViIGRlc2NyaWJlIHsgJF9bMV0gPyAnJyA6ICRfWzBdLT57Y29tbWl0b25seX0gPyAnPGVycm9yPzouLi4+JyA6ICc8ZXJyb3IuLi4+JyB9CitzdWIgc2V0aGFzaG5hbWUgeyAkX1swXS0+e2hhc2huYW1lfSA9ICdfX0RJUkVDVElWRScgLiArKyRfWzFdLT57ZGlyY291bnR9IC4gICdfXyc7IH0KKworc3ViIG5ldyAoJCQkJCQpCit7CisgICAgbXkgJGNsYXNzID0gcmVmKCRfWzBdKSB8fCAkX1swXTsKKyAgICBibGVzcworICAgIHsKKyAgICAgICAgIm1zZyIgICAgICAgID0+ICRfWzFdLAorICAgICAgICAibG9va2FoZWFkIiAgPT4gJF9bMl0sCisgICAgICAgICJjb21taXRvbmx5IiA9PiAkX1szXSwKKyAgICAgICAgImxpbmUiICAgICAgID0+ICRfWzRdLAorICAgIH0sICRjbGFzczsKK30KKworc3ViIGNvZGUoJCQkJCkKK3sKKyAgICBteSAoJHNlbGYsICRuYW1lc3BhY2UsICRydWxlKSA9IEBfOworCisgICAgbXkgJGFjdGlvbiA9ICcnOworCisgICAgaWYgKCRzZWxmLT57Im1zZyJ9KSAgIyBFUlJPUiBNRVNTQUdFIFNVUFBMSUVECisgICAgeworICAgICAgICAjV0FTOiAkYWN0aW9uIC49ICJQYXJzZTo6UmVjRGVzY2VudDo6X2Vycm9yKHFxeyRzZWxmLT57bXNnfX0iIC4gICcsJHRoaXNsaW5lKTsnOworICAgICAgICAkYWN0aW9uIC49ICdwdXNoIEB7JHRoaXNwYXJzZXItPntlcnJvcnN9fSwgW3FxeycuJHNlbGYtPnttc2d9Lid9LCR0aGlzbGluZV07JzsKKworICAgIH0KKyAgICBlbHNlICAgICAgIyBHRU5FUkFURSBFUlJPUiBNRVNTQUdFIERVUklORyBQQVJTRQorICAgIHsKKyAgICAgICAgJGFjdGlvbiAuPSAnCisgICAgICAgIG15ICRydWxlID0gJGl0ZW1bMF07CisgICAgICAgICAgICRydWxlID1+IHMvXy8gL2c7CisgICAgICAgICNXQVM6IFBhcnNlOjpSZWNEZXNjZW50OjpfZXJyb3IoIkludmFsaWQgJHJ1bGU6ICIgLiAkZXhwZWN0YXRpb24tPm1lc3NhZ2UoKSAsJHRoaXNsaW5lKTsKKyAgICAgICAgcHVzaCBAeyR0aGlzcGFyc2VyLT57ZXJyb3JzfX0sIFsiSW52YWxpZCAkcnVsZTogIiAuICRleHBlY3RhdGlvbi0+bWVzc2FnZSgpICwkdGhpc2xpbmVdOworICAgICAgICAnOworICAgIH0KKworICAgIG15ICRkaXIgPQorICAgICAgICAgIG5ldyBQYXJzZTo6UmVjRGVzY2VudDo6RGlyZWN0aXZlKCdpZiAoJyAuCisgICAgICAgICgkc2VsZi0+eyJjb21taXRvbmx5In0gPyAnJGNvbW1pdCcgOiAnMScpIC4KKyAgICAgICAgIikgeyBkbyB7JGFjdGlvbn0gdW5sZXNzICIuJyAkX25vYWN0aW9uczsgdW5kZWYgfSBlbHNlIHswfScsCisgICAgICAgICAgICAgICAgICAgICRzZWxmLT57Imxvb2thaGVhZCJ9LDAsJHNlbGYtPmRlc2NyaWJlKTsKKyAgICAkZGlyLT57aGFzaG5hbWV9ID0gJHNlbGYtPntoYXNobmFtZX07CisgICAgcmV0dXJuICRkaXItPmNvZGUoJG5hbWVzcGFjZSwgJHJ1bGUsIDApOworfQorCisxOworCitwYWNrYWdlIFBhcnNlOjpSZWNEZXNjZW50OjpUb2tlbjsKKworc3ViIHNldGhhc2huYW1lIHsgJF9bMF0tPntoYXNobmFtZX0gPSAnX19QQVRURVJOJyAuICsrJF9bMV0tPntwYXRjb3VudH0gLiAnX18nOyB9CisKK3N1YiBpc3N1YnJ1bGUgeyB1bmRlZiB9CitzdWIgaXN0ZXJtaW5hbCB7IDEgfQorc3ViIGRlc2NyaWJlICgkKSB7IHNoaWZ0LT57J2Rlc2NyaXB0aW9uJ319CisKKworIyBBUkdTIEFSRTogJHNlbGYsICRwYXR0ZXJuLCAkbGVmdF9kZWxpbSwgJG1vZGlmaWVycywgJGxvb2thaGVhZCwgJGxpbmVudW0KK3N1YiBuZXcgKCQkJCQkJCkKK3sKKyAgICBteSAkY2xhc3MgPSByZWYoJF9bMF0pIHx8ICRfWzBdOworICAgIG15ICRwYXR0ZXJuID0gJF9bMV07CisgICAgbXkgJHBhdCA9ICRfWzFdOworICAgIG15ICRsZGVsID0gJF9bMl07CisgICAgbXkgJHJkZWwgPSAkbGRlbDsKKyAgICAkcmRlbCA9fiB0ci97Wyg8L31dKT4vOworCisgICAgbXkgJG1vZCA9ICRfWzNdOworCisgICAgbXkgJGRlc2M7CisKKyAgICBpZiAoJGxkZWwgZXEgJy8nKSB7ICRkZXNjID0gIiRsZGVsJHBhdHRlcm4kcmRlbCRtb2QiIH0KKyAgICBlbHNlICAgICAgICAgIHsgJGRlc2MgPSAibSRsZGVsJHBhdHRlcm4kcmRlbCRtb2QiIH0KKyAgICAkZGVzYyA9fiBzL1xcL1xcXFwvZzsKKyAgICAkZGVzYyA9fiBzL1wkJC9cXFwkL2c7CisgICAgJGRlc2MgPX4gcy99L1xcfS9nOworICAgICRkZXNjID1+IHMvey9cXHsvZzsKKworICAgIGlmICghZXZhbCAibm8gc3RyaWN0OworICAgICAgICAgICBsb2NhbCBcJFNJR3tfX1dBUk5fX30gPSBzdWIgezB9OworICAgICAgICAgICAnJyA9fiBtJGxkZWwkcGF0dGVybiRyZGVsJG1vZCIgYW5kICRAKQorICAgIHsKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol93YXJuKDMsICJUb2tlbiBwYXR0ZXJuIFwibSRsZGVsJHBhdHRlcm4kcmRlbCRtb2RcIgorICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBub3QgYmUgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24iLAorICAgICAgICAgICAgICAgICAgICAgICAkX1s1XSk7CisgICAgICAgICRAID1+IHMvIGF0IFwoZXZhbC4qLy4vOworICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X2hpbnQoJEApOworICAgIH0KKworICAgICMgUVVJRVRMWSBQUkVWRU5UIChXRUxMLUlOVEVOVElPTkVEKSBDQUxBTUlUWQorICAgICRtb2QgPX4gcy9bZ2NdLy9nOworICAgICRwYXR0ZXJuID1+IHMvKFxBfFteXFxdKVxcRy8kMS9nOworCisgICAgYmxlc3MKKyAgICB7CisgICAgICAgICJwYXR0ZXJuIiAgID0+ICRwYXR0ZXJuLAorICAgICAgICAibGRlbGltIiAgICAgID0+ICRsZGVsLAorICAgICAgICAicmRlbGltIiAgICAgID0+ICRyZGVsLAorICAgICAgICAibW9kIiAgICAgICAgID0+ICRtb2QsCisgICAgICAgICJsb29rYWhlYWQiICAgPT4gJF9bNF0sCisgICAgICAgICJsaW5lIiAgICAgICAgPT4gJF9bNV0sCisgICAgICAgICJkZXNjcmlwdGlvbiIgPT4gJGRlc2MsCisgICAgfSwgJGNsYXNzOworfQorCisKK3N1YiBjb2RlKCQkJCQkKQoreworICAgIG15ICgkc2VsZiwgJG5hbWVzcGFjZSwgJHJ1bGUsICRjaGVjaykgPSBAXzsKKyAgICBteSAkbGRlbCA9ICRzZWxmLT57ImxkZWxpbSJ9OworICAgIG15ICRyZGVsID0gJHNlbGYtPnsicmRlbGltIn07CisgICAgbXkgJHNkZWwgPSAkbGRlbDsKKyAgICBteSAkbW9kICA9ICRzZWxmLT57Im1vZCJ9OworCisgICAgJHNkZWwgPX4gcy9bW3soPF0ve30vOworCitteSAkY29kZSA9ICcKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxe1RyeWluZyB0ZXJtaW5hbDogWycgLiAkc2VsZi0+ZGVzY3JpYmUKKyAgICAgICAgICAgICAgICAgICAgICAuICddfSwgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZWZpcnN0KCR0ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICBxeycgLiAkcnVsZS0+e25hbWV9IC4gJ30sCisgICAgICAgICAgICAgICAgICAgICAgJHRyYWNlbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkICQ6OlJEX1RSQUNFOworICAgICAgICB1bmRlZiAkbGFzdHNlcDsKKyAgICAgICAgJGV4cGVjdGF0aW9uLT5pcyhxeycgLiAoJHJ1bGUtPmhhc2xlZnRtb3N0KCRzZWxmKSA/ICcnCisgICAgICAgICAgICAgICAgOiAkc2VsZi0+ZGVzY3JpYmUgKSAuICd9KS0+YXQoJHRleHQpOworICAgICAgICAnIC4gKCRzZWxmLT57Imxvb2thaGVhZCJ9ID8gJyRfc2F2ZXRleHQgPSAkdGV4dDsnIDogJycgKSAuICcKKworICAgICAgICAnIC4gKCRzZWxmLT57Imxvb2thaGVhZCJ9PDA/J2lmJzondW5sZXNzJykKKyAgICAgICAgLiAnICgkdGV4dCA9fiBzL1xBKCRza2lwKS8kbGFzdHNlcD0kMSBhbmQgIiIvZSBhbmQgJworICAgICAgICAuICgkY2hlY2stPntpdGVtcG9zfT8gJ2RvIHsnLlBhcnNlOjpSZWNEZXNjZW50OjpQcm9kdWN0aW9uOjppbmNpdGVtcG9zKCkuJyAxfSBhbmQgJyA6ICcnKQorICAgICAgICAuICcgICR0ZXh0ID1+IG0nIC4gJGxkZWwgLiAnXEEoPzonIC4gJHNlbGYtPnsicGF0dGVybiJ9IC4gJyknIC4gJHJkZWwgLiAkbW9kIC4gJykKKyAgICAgICAgeworICAgICAgICAgICAgJy4oJHNlbGYtPnsibG9va2FoZWFkIn0gPyAnJHRleHQgPSAkX3NhdmV0ZXh0OycgOiAnJHRleHQgPSAkbGFzdHNlcCAuICR0ZXh0IGlmIGRlZmluZWQgJGxhc3RzZXA7JykgLgorICAgICAgICAgICAgKCRjaGVjay0+e2l0ZW1wb3N9ID8gUGFyc2U6OlJlY0Rlc2NlbnQ6OlByb2R1Y3Rpb246OnVuaW5jaXRlbXBvcygpIDogJycpIC4gJworICAgICAgICAgICAgJGV4cGVjdGF0aW9uLT5mYWlsZWQoKTsKKyAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2UocXs8PERpZG5cJ3QgbWF0Y2ggdGVybWluYWw+Pn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VmaXJzdCgkdGV4dCkpCisgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQgJDo6UkRfVFJBQ0U7CisKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKyAgICAgICAgJGN1cnJlbnRfbWF0Y2ggPSBzdWJzdHIoJHRleHQsICQtWzBdLCAkK1swXSAtICQtWzBdKTsKKyAgICAgICAgc3Vic3RyKCR0ZXh0LDAsbGVuZ3RoKCRjdXJyZW50X21hdGNoKSxxe30pOworICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlKHF7Pj5NYXRjaGVkIHRlcm1pbmFsPDwgKHJldHVybiB2YWx1ZTogW30KKyAgICAgICAgICAgICAgICAgICAgICAgIC4gJGN1cnJlbnRfbWF0Y2ggLiBxe10pfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZWZpcnN0KCR0ZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZCAkOjpSRF9UUkFDRTsKKyAgICAgICAgcHVzaCBAaXRlbSwgJGl0ZW17Jy4kc2VsZi0+e2hhc2huYW1lfS4nfT0kY3VycmVudF9tYXRjaDsKKyAgICAgICAgJyAuICgkc2VsZi0+eyJsb29rYWhlYWQifSA/ICckdGV4dCA9ICRfc2F2ZXRleHQ7JyA6ICcnICkgLicKKyc7CisKKyAgICByZXR1cm4gJGNvZGU7Cit9CisKKzE7CisKK3BhY2thZ2UgUGFyc2U6OlJlY0Rlc2NlbnQ6OkxpdGVyYWw7CisKK3N1YiBzZXRoYXNobmFtZSB7ICRfWzBdLT57aGFzaG5hbWV9ID0gJ19fU1RSSU5HJyAuICsrJF9bMV0tPntzdHJjb3VudH0gLiAnX18nOyB9CisKK3N1YiBpc3N1YnJ1bGUgeyB1bmRlZiB9CitzdWIgaXN0ZXJtaW5hbCB7IDEgfQorc3ViIGRlc2NyaWJlICgkKSB7IHNoaWZ0LT57J2Rlc2NyaXB0aW9uJ30gfQorCitzdWIgbmV3ICgkJCQkKQoreworICAgIG15ICRjbGFzcyA9IHJlZigkX1swXSkgfHwgJF9bMF07CisKKyAgICBteSAkcGF0dGVybiA9ICRfWzFdOworCisgICAgbXkgJGRlc2MgPSAkcGF0dGVybjsKKyAgICAkZGVzYz1+cy9cXC9cXFxcL2c7CisgICAgJGRlc2M9fnMvfS9cXH0vZzsKKyAgICAkZGVzYz1+cy97L1xcey9nOworCisgICAgYmxlc3MKKyAgICB7CisgICAgICAgICJwYXR0ZXJuIiAgICAgPT4gJHBhdHRlcm4sCisgICAgICAgICJsb29rYWhlYWQiICAgPT4gJF9bMl0sCisgICAgICAgICJsaW5lIiAgICAgICAgPT4gJF9bM10sCisgICAgICAgICJkZXNjcmlwdGlvbiIgPT4gIickZGVzYyciLAorICAgIH0sICRjbGFzczsKK30KKworCitzdWIgY29kZSgkJCQkKQoreworICAgIG15ICgkc2VsZiwgJG5hbWVzcGFjZSwgJHJ1bGUsICRjaGVjaykgPSBAXzsKKworbXkgJGNvZGUgPSAnCisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2UocXtUcnlpbmcgdGVybWluYWw6IFsnIC4gJHNlbGYtPmRlc2NyaWJlCisgICAgICAgICAgICAgICAgICAgICAgLiAnXX0sCisgICAgICAgICAgICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZWZpcnN0KCR0ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICBxeycgLiAkcnVsZS0+e25hbWV9IC4gJ30sCisgICAgICAgICAgICAgICAgICAgICAgJHRyYWNlbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkICQ6OlJEX1RSQUNFOworICAgICAgICB1bmRlZiAkbGFzdHNlcDsKKyAgICAgICAgJGV4cGVjdGF0aW9uLT5pcyhxeycgLiAoJHJ1bGUtPmhhc2xlZnRtb3N0KCRzZWxmKSA/ICcnCisgICAgICAgICAgICAgICAgOiAkc2VsZi0+ZGVzY3JpYmUgKSAuICd9KS0+YXQoJHRleHQpOworICAgICAgICAnIC4gKCRzZWxmLT57Imxvb2thaGVhZCJ9ID8gJyRfc2F2ZXRleHQgPSAkdGV4dDsnIDogJycgKSAuICcKKworICAgICAgICAnIC4gKCRzZWxmLT57Imxvb2thaGVhZCJ9PDA/J2lmJzondW5sZXNzJykKKyAgICAgICAgLiAnICgkdGV4dCA9fiBzL1xBKCRza2lwKS8kbGFzdHNlcD0kMSBhbmQgIiIvZSBhbmQgJworICAgICAgICAuICgkY2hlY2stPntpdGVtcG9zfT8gJ2RvIHsnLlBhcnNlOjpSZWNEZXNjZW50OjpQcm9kdWN0aW9uOjppbmNpdGVtcG9zKCkuJyAxfSBhbmQgJyA6ICcnKQorICAgICAgICAuICcgICR0ZXh0ID1+IG0vXEEnIC4gcXVvdGVtZXRhKCRzZWxmLT57InBhdHRlcm4ifSkgLiAnLykKKyAgICAgICAgeworICAgICAgICAgICAgJy4oJHNlbGYtPnsibG9va2FoZWFkIn0gPyAnJHRleHQgPSAkX3NhdmV0ZXh0OycgOiAnJHRleHQgPSAkbGFzdHNlcCAuICR0ZXh0IGlmIGRlZmluZWQgJGxhc3RzZXA7JykuJworICAgICAgICAgICAgJy4gKCRjaGVjay0+e2l0ZW1wb3N9ID8gUGFyc2U6OlJlY0Rlc2NlbnQ6OlByb2R1Y3Rpb246OnVuaW5jaXRlbXBvcygpIDogJycpIC4gJworICAgICAgICAgICAgJGV4cGVjdGF0aW9uLT5mYWlsZWQoKTsKKyAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2UocXF7PDxEaWRuXCd0IG1hdGNoIHRlcm1pbmFsPj59LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlZmlyc3QoJHRleHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQgJDo6UkRfVFJBQ0U7CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9CisgICAgICAgICRjdXJyZW50X21hdGNoID0gc3Vic3RyKCR0ZXh0LCAkLVswXSwgJCtbMF0gLSAkLVswXSk7CisgICAgICAgIHN1YnN0cigkdGV4dCwwLGxlbmd0aCgkY3VycmVudF9tYXRjaCkscXt9KTsKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxez4+TWF0Y2hlZCB0ZXJtaW5hbDw8IChyZXR1cm4gdmFsdWU6IFt9CisgICAgICAgICAgICAgICAgICAgICAgICAuICRjdXJyZW50X21hdGNoIC4gcXtdKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VmaXJzdCgkdGV4dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZCAkOjpSRF9UUkFDRTsKKyAgICAgICAgcHVzaCBAaXRlbSwgJGl0ZW17Jy4kc2VsZi0+e2hhc2huYW1lfS4nfT0kY3VycmVudF9tYXRjaDsKKyAgICAgICAgJyAuICgkc2VsZi0+eyJsb29rYWhlYWQifSA/ICckdGV4dCA9ICRfc2F2ZXRleHQ7JyA6ICcnICkgLicKKyc7CisKKyAgICByZXR1cm4gJGNvZGU7Cit9CisKKzE7CisKK3BhY2thZ2UgUGFyc2U6OlJlY0Rlc2NlbnQ6OkludGVycExpdDsKKworc3ViIHNldGhhc2huYW1lIHsgJF9bMF0tPntoYXNobmFtZX0gPSAnX19TVFJJTkcnIC4gKyskX1sxXS0+e3N0cmNvdW50fSAuICdfXyc7IH0KKworc3ViIGlzc3VicnVsZSB7IHVuZGVmIH0KK3N1YiBpc3Rlcm1pbmFsIHsgMSB9CitzdWIgZGVzY3JpYmUgKCQpIHsgc2hpZnQtPnsnZGVzY3JpcHRpb24nfSB9CisKK3N1YiBuZXcgKCQkJCQpCit7CisgICAgbXkgJGNsYXNzID0gcmVmKCRfWzBdKSB8fCAkX1swXTsKKworICAgIG15ICRwYXR0ZXJuID0gJF9bMV07CisgICAgJHBhdHRlcm4gPX4gcyMvI1xcLyNnOworCisgICAgbXkgJGRlc2MgPSAkcGF0dGVybjsKKyAgICAkZGVzYz1+cy9cXC9cXFxcL2c7CisgICAgJGRlc2M9fnMvfS9cXH0vZzsKKyAgICAkZGVzYz1+cy97L1xcey9nOworCisgICAgYmxlc3MKKyAgICB7CisgICAgICAgICJwYXR0ZXJuIiAgID0+ICRwYXR0ZXJuLAorICAgICAgICAibG9va2FoZWFkIiA9PiAkX1syXSwKKyAgICAgICAgImxpbmUiICAgICAgPT4gJF9bM10sCisgICAgICAgICJkZXNjcmlwdGlvbiIgPT4gIickZGVzYyciLAorICAgIH0sICRjbGFzczsKK30KKworc3ViIGNvZGUoJCQkJCkKK3sKKyAgICBteSAoJHNlbGYsICRuYW1lc3BhY2UsICRydWxlLCAkY2hlY2spID0gQF87CisKK215ICRjb2RlID0gJworICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlKHF7VHJ5aW5nIHRlcm1pbmFsOiBbJyAuICRzZWxmLT5kZXNjcmliZQorICAgICAgICAgICAgICAgICAgICAgIC4gJ119LAorICAgICAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VmaXJzdCgkdGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgcXsnIC4gJHJ1bGUtPntuYW1lfSAuICd9LAorICAgICAgICAgICAgICAgICAgICAgICR0cmFjZWxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZCAkOjpSRF9UUkFDRTsKKyAgICAgICAgdW5kZWYgJGxhc3RzZXA7CisgICAgICAgICRleHBlY3RhdGlvbi0+aXMocXsnIC4gKCRydWxlLT5oYXNsZWZ0bW9zdCgkc2VsZikgPyAnJworICAgICAgICAgICAgICAgIDogJHNlbGYtPmRlc2NyaWJlICkgLiAnfSktPmF0KCR0ZXh0KTsKKyAgICAgICAgJyAuICgkc2VsZi0+eyJsb29rYWhlYWQifSA/ICckX3NhdmV0ZXh0ID0gJHRleHQ7JyA6ICcnICkgLiAnCisKKyAgICAgICAgJyAuICgkc2VsZi0+eyJsb29rYWhlYWQifTwwPydpZic6J3VubGVzcycpCisgICAgICAgIC4gJyAoJHRleHQgPX4gcy9cQSgkc2tpcCkvJGxhc3RzZXA9JDEgYW5kICIiL2UgYW5kICcKKyAgICAgICAgLiAoJGNoZWNrLT57aXRlbXBvc30/ICdkbyB7Jy5QYXJzZTo6UmVjRGVzY2VudDo6UHJvZHVjdGlvbjo6aW5jaXRlbXBvcygpLicgMX0gYW5kICcgOiAnJykKKyAgICAgICAgLiAnICBkbyB7ICRfdG9rID0gIicgLiAkc2VsZi0+eyJwYXR0ZXJuIn0gLiAnIjsgMSB9IGFuZAorICAgICAgICAgICAgIHN1YnN0cigkdGV4dCwwLGxlbmd0aCgkX3RvaykpIGVxICRfdG9rIGFuZAorICAgICAgICAgICAgIGRvIHsgc3Vic3RyKCR0ZXh0LDAsbGVuZ3RoKCRfdG9rKSkgPSAiIjsgMTsgfQorICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgICcuKCRzZWxmLT57Imxvb2thaGVhZCJ9ID8gJyR0ZXh0ID0gJF9zYXZldGV4dDsnIDogJyR0ZXh0ID0gJGxhc3RzZXAgLiAkdGV4dCBpZiBkZWZpbmVkICRsYXN0c2VwOycpLicKKyAgICAgICAgICAgICcuICgkY2hlY2stPntpdGVtcG9zfSA/IFBhcnNlOjpSZWNEZXNjZW50OjpQcm9kdWN0aW9uOjp1bmluY2l0ZW1wb3MoKSA6ICcnKSAuICcKKyAgICAgICAgICAgICRleHBlY3RhdGlvbi0+ZmFpbGVkKCk7CisgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlKHF7PDxEaWRuXCd0IG1hdGNoIHRlcm1pbmFsPj59LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlZmlyc3QoJHRleHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQgJDo6UkRfVFJBQ0U7CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9CisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2UocXs+Pk1hdGNoZWQgdGVybWluYWw8PCAocmV0dXJuIHZhbHVlOiBbfQorICAgICAgICAgICAgICAgICAgICAgICAgLiAkX3RvayAuIHF7XSl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlZmlyc3QoJHRleHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQgJDo6UkRfVFJBQ0U7CisgICAgICAgIHB1c2ggQGl0ZW0sICRpdGVteycuJHNlbGYtPntoYXNobmFtZX0uJ309JF90b2s7CisgICAgICAgICcgLiAoJHNlbGYtPnsibG9va2FoZWFkIn0gPyAnJHRleHQgPSAkX3NhdmV0ZXh0OycgOiAnJyApIC4nCisnOworCisgICAgcmV0dXJuICRjb2RlOworfQorCisxOworCitwYWNrYWdlIFBhcnNlOjpSZWNEZXNjZW50OjpTdWJydWxlOworCitzdWIgaXNzdWJydWxlICgkKSB7IHJldHVybiAkX1swXS0+eyJzdWJydWxlIn0gfQorc3ViIGlzdGVybWluYWwgeyAwIH0KK3N1YiBzZXRoYXNobmFtZSB7fQorCitzdWIgZGVzY3JpYmUgKCQpCit7CisgICAgbXkgJGRlc2MgPSAkX1swXS0+eyJpbXBsaWNpdCJ9IHx8ICRfWzBdLT57InN1YnJ1bGUifTsKKyAgICAkZGVzYyA9ICI8bWF0Y2hydWxlOiRkZXNjPiIgaWYgJF9bMF0tPnsibWF0Y2hydWxlIn07CisgICAgcmV0dXJuICRkZXNjOworfQorCitzdWIgY2FsbHN5bnRheCgkJCkKK3sKKyAgICBpZiAoJF9bMF0tPnsibWF0Y2hydWxlIn0pCisgICAgeworICAgICAgICByZXR1cm4gIiZ7JyRfWzFdJy5xcXskX1swXS0+e3N1YnJ1bGV9fX0iOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gJF9bMV0uJF9bMF0tPnsic3VicnVsZSJ9OworICAgIH0KK30KKworc3ViIG5ldyAoJCQkJDskJCQpCit7CisgICAgbXkgJGNsYXNzID0gcmVmKCRfWzBdKSB8fCAkX1swXTsKKyAgICBibGVzcworICAgIHsKKyAgICAgICAgInN1YnJ1bGUiICAgPT4gJF9bMV0sCisgICAgICAgICJsb29rYWhlYWQiID0+ICRfWzJdLAorICAgICAgICAibGluZSIgICAgICA9PiAkX1szXSwKKyAgICAgICAgImltcGxpY2l0IiAgPT4gJF9bNF0gfHwgdW5kZWYsCisgICAgICAgICJtYXRjaHJ1bGUiID0+ICRfWzVdLAorICAgICAgICAiYXJnY29kZSIgICA9PiAkX1s2XSB8fCB1bmRlZiwKKyAgICB9LCAkY2xhc3M7Cit9CisKKworc3ViIGNvZGUoJCQkJCkKK3sKKyAgICBteSAoJHNlbGYsICRuYW1lc3BhY2UsICRydWxlLCAkY2hlY2spID0gQF87CisKKycKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxe1RyeWluZyBzdWJydWxlOiBbJyAuICRzZWxmLT57InN1YnJ1bGUifSAuICddfSwKKyAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VmaXJzdCgkdGV4dCksCisgICAgICAgICAgICAgICAgICBxeycgLiAkcnVsZS0+eyJuYW1lIn0gLiAnfSwKKyAgICAgICAgICAgICAgICAgICR0cmFjZWxldmVsKQorICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkICQ6OlJEX1RSQUNFOworICAgICAgICBpZiAoMSkgeyBubyBzdHJpY3QgcXd7cmVmc307CisgICAgICAgICRleHBlY3RhdGlvbi0+aXMoJyAuICgkcnVsZS0+aGFzbGVmdG1vc3QoJHNlbGYpID8gJ3F7fScKKyAgICAgICAgICAgICAgICAjIFdBUyA6ICdxcXsnLiRzZWxmLT5kZXNjcmliZS4nfScgKSAuICcpLT5hdCgkdGV4dCk7CisgICAgICAgICAgICAgICAgOiAncXsnLiRzZWxmLT5kZXNjcmliZS4nfScgKSAuICcpLT5hdCgkdGV4dCk7CisgICAgICAgICcgLiAoJHNlbGYtPnsibG9va2FoZWFkIn0gPyAnJF9zYXZldGV4dCA9ICR0ZXh0OycgOiAnJyApCisgICAgICAgIC4gKCRzZWxmLT57Imxvb2thaGVhZCJ9PDA/J2lmJzondW5sZXNzJykKKyAgICAgICAgLiAnIChkZWZpbmVkICgkX3RvayA9ICcKKyAgICAgICAgLiAkc2VsZi0+Y2FsbHN5bnRheCgkbmFtZXNwYWNlLic6OicpCisgICAgICAgIC4gJygkdGhpc3BhcnNlciwkdGV4dCwkcmVwZWF0aW5nLCcKKyAgICAgICAgLiAoJHNlbGYtPnsibG9va2FoZWFkIn0/JzEnOickX25vYWN0aW9ucycpCisgICAgICAgIC4gKCRjaGVjay0+eyJpdGVtcG9zIn0/JywkaXRlbXBvc1skI2l0ZW1wb3NdJzonLHVuZGVmJykKKyAgICAgICAgLiAoJHNlbGYtPnthcmdjb2RlfSA/ICIsc3ViIHsgcmV0dXJuICRzZWxmLT57YXJnY29kZX0gfSIKKyAgICAgICAgICAgICAgICAgICA6ICcsc3ViIHsgXFxAYXJnIH0nKQorICAgICAgICAuICcpKSkKKyAgICAgICAgeworICAgICAgICAgICAgJy4oJHNlbGYtPnsibG9va2FoZWFkIn0gPyAnJHRleHQgPSAkX3NhdmV0ZXh0OycgOiAnJykuJworICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxezw8Jy5QYXJzZTo6UmVjRGVzY2VudDo6X21hdGNodHJhY2VtZXNzYWdlKCRzZWxmLDEpLicgc3VicnVsZTogWycKKyAgICAgICAgICAgIC4gJHNlbGYtPntzdWJydWxlfSAuICddPj59LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlZmlyc3QoJHRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBxeycgLiAkcnVsZS0+eyJuYW1lIn0gLid9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAkdHJhY2VsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkICQ6OlJEX1RSQUNFOworICAgICAgICAgICAgJGV4cGVjdGF0aW9uLT5mYWlsZWQoKTsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxez4+Jy5QYXJzZTo6UmVjRGVzY2VudDo6X21hdGNodHJhY2VtZXNzYWdlKCRzZWxmKS4nIHN1YnJ1bGU6IFsnCisgICAgICAgICAgICAgICAgICAgIC4gJHNlbGYtPntzdWJydWxlfSAuICddPDwgKHJldHVybiB2YWx1ZTogW30KKyAgICAgICAgICAgICAgICAgICAgLiAkX3RvayAuIHF7XX0sCisKKyAgICAgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlZmlyc3QoJHRleHQpLAorICAgICAgICAgICAgICAgICAgICAgIHF7JyAuICRydWxlLT57Im5hbWUifSAuJ30sCisgICAgICAgICAgICAgICAgICAgICAgJHRyYWNlbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkICQ6OlJEX1RSQUNFOworICAgICAgICAkaXRlbXtxeycgLiAkc2VsZi0+e3N1YnJ1bGV9IC4gJ319ID0gJF90b2s7CisgICAgICAgIHB1c2ggQGl0ZW0sICRfdG9rOworICAgICAgICAnIC4gKCRzZWxmLT57Imxvb2thaGVhZCJ9ID8gJyR0ZXh0ID0gJF9zYXZldGV4dDsnIDogJycgKSAuJworICAgICAgICB9CisnCit9CisKK3BhY2thZ2UgUGFyc2U6OlJlY0Rlc2NlbnQ6OlJlcGV0aXRpb247CisKK3N1YiBpc3N1YnJ1bGUgKCQpIHsgcmV0dXJuICRfWzBdLT57InN1YnJ1bGUifSB9CitzdWIgaXN0ZXJtaW5hbCB7IDAgfQorc3ViIHNldGhhc2huYW1lIHsgIH0KKworc3ViIGRlc2NyaWJlICgkKQoreworICAgIG15ICRkZXNjID0gJF9bMF0tPnsiZXhwZWN0ZWQifSB8fCAkX1swXS0+eyJzdWJydWxlIn07CisgICAgJGRlc2MgPSAiPG1hdGNocnVsZTokZGVzYz4iIGlmICRfWzBdLT57Im1hdGNocnVsZSJ9OworICAgIHJldHVybiAkZGVzYzsKK30KKworc3ViIGNhbGxzeW50YXgoJCQpCit7CisgICAgaWYgKCRfWzBdLT57bWF0Y2hydWxlfSkKKyAgICAgICAgeyByZXR1cm4gInN1YiB7IGdvdG8gJnsnJy5xcXskX1sxXSRfWzBdLT57c3VicnVsZX19fSB9IjsgfQorICAgIGVsc2UKKyAgICAgICAgeyByZXR1cm4gIlxcJiRfWzFdJF9bMF0tPntzdWJydWxlfSI7IH0KK30KKworc3ViIG5ldyAoJCQkJCQkJCQkJCkKK3sKKyAgICBteSAoJHNlbGYsICRzdWJydWxlLCAkcmVwc3BlYywgJG1pbiwgJG1heCwgJGxvb2thaGVhZCwgJGxpbmUsICRwYXJzZXIsICRtYXRjaHJ1bGUsICRhcmdjb2RlKSA9IEBfOworICAgIG15ICRjbGFzcyA9IHJlZigkc2VsZikgfHwgJHNlbGY7CisgICAgKCRtYXgsICRtaW4pID0gKCAkbWluLCAkbWF4KSBpZiAoJG1heDwkbWluKTsKKworICAgIG15ICRkZXNjOworICAgIGlmICgkc3VicnVsZT1+L1xBX2FsdGVybmF0aW9uX1xkK19vZl9wcm9kdWN0aW9uX1xkK19vZl9ydWxlLykKKyAgICAgICAgeyAkZGVzYyA9ICRwYXJzZXItPnsicnVsZXMifXskc3VicnVsZX0tPmV4cGVjdGVkIH0KKworICAgIGlmICgkbG9va2FoZWFkKQorICAgIHsKKyAgICAgICAgaWYgKCRtaW4+MCkKKyAgICAgICAgeworICAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpTdWJydWxlKCRzdWJydWxlLCRsb29rYWhlYWQsJGxpbmUsJGRlc2MsJG1hdGNocnVsZSwkYXJnY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X2Vycm9yKCJOb3Qgc3ltYm9sIChcIiFcIikgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICBcIiRzdWJydWxlXCIgZG9lc24ndCBtYWtlCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5zZS4iLCRsaW5lKTsKKyAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfaGludCgiTG9va2FoZWFkIGZvciBuZWdhdGVkIG9wdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICAgIHJlcGV0aXRpb25zIChzdWNoIGFzCisgICAgICAgICAgICAgICAgICAgICAgIFwiISRzdWJydWxlKCRyZXBzcGVjKVwiIGNhbiBuZXZlcgorICAgICAgICAgICAgICAgICAgICAgICBzdWNjZWVkLCBzaW5jZSBvcHRpb25hbCBpdGVtcyBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggKHplcm8gdGltZXMgYXQgd29yc3QpLgorICAgICAgICAgICAgICAgICAgICAgICBEaWQgeW91IG1lYW4gYSBzaW5nbGUgXCIhJHN1YnJ1bGVcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZD8iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBibGVzcworICAgIHsKKyAgICAgICAgInN1YnJ1bGUiICAgPT4gJHN1YnJ1bGUsCisgICAgICAgICJyZXBzcGVjIiAgID0+ICRyZXBzcGVjLAorICAgICAgICAibWluIiAgICAgICA9PiAkbWluLAorICAgICAgICAibWF4IiAgICAgICA9PiAkbWF4LAorICAgICAgICAibG9va2FoZWFkIiA9PiAkbG9va2FoZWFkLAorICAgICAgICAibGluZSIgICAgICA9PiAkbGluZSwKKyAgICAgICAgImV4cGVjdGVkIiAgPT4gJGRlc2MsCisgICAgICAgICJhcmdjb2RlIiAgID0+ICRhcmdjb2RlIHx8IHVuZGVmLAorICAgICAgICAibWF0Y2hydWxlIiA9PiAkbWF0Y2hydWxlLAorICAgIH0sICRjbGFzczsKK30KKworc3ViIGNvZGUoJCQkJCkKK3sKKyAgICBteSAoJHNlbGYsICRuYW1lc3BhY2UsICRydWxlLCAkY2hlY2spID0gQF87CisKKyAgICBteSAoJHN1YnJ1bGUsICRyZXBzcGVjLCAkbWluLCAkbWF4LCAkbG9va2FoZWFkKSA9CisgICAgICAgIEB7JHNlbGZ9eyBxd3tzdWJydWxlIHJlcHNwZWMgbWluIG1heCBsb29rYWhlYWR9IH07CisKKycKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxe1RyeWluZyByZXBlYXRlZCBzdWJydWxlOiBbJyAuICRzZWxmLT5kZXNjcmliZSAuICddfSwKKyAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VmaXJzdCgkdGV4dCksCisgICAgICAgICAgICAgICAgICBxeycgLiAkcnVsZS0+eyJuYW1lIn0gLiAnfSwKKyAgICAgICAgICAgICAgICAgICR0cmFjZWxldmVsKQorICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkICQ6OlJEX1RSQUNFOworICAgICAgICAkZXhwZWN0YXRpb24tPmlzKCcgLiAoJHJ1bGUtPmhhc2xlZnRtb3N0KCRzZWxmKSA/ICdxe30nCisgICAgICAgICAgICAgICAgIyBXQVMgOiAncXF7Jy4kc2VsZi0+ZGVzY3JpYmUuJ30nICkgLiAnKS0+YXQoJHRleHQpOworICAgICAgICAgICAgICAgIDogJ3F7Jy4kc2VsZi0+ZGVzY3JpYmUuJ30nICkgLiAnKS0+YXQoJHRleHQpOworICAgICAgICAnIC4gKCRzZWxmLT57Imxvb2thaGVhZCJ9ID8gJyRfc2F2ZXRleHQgPSAkdGV4dDsnIDogJycgKSAuJworICAgICAgICB1bmxlc3MgKGRlZmluZWQgKCRfdG9rID0gJHRoaXNwYXJzZXItPl9wYXJzZXJlcGVhdCgkdGV4dCwgJworICAgICAgICAuICRzZWxmLT5jYWxsc3ludGF4KCRuYW1lc3BhY2UuJzo6JykKKyAgICAgICAgLiAnLCAnIC4gJG1pbiAuICcsICcgLiAkbWF4IC4gJywgJworICAgICAgICAuICgkc2VsZi0+eyJsb29rYWhlYWQifT8nMSc6JyRfbm9hY3Rpb25zJykKKyAgICAgICAgLiAoJGNoZWNrLT57Iml0ZW1wb3MifT8nLCRpdGVtcG9zWyQjaXRlbXBvc10nOicsdW5kZWYnKQorICAgICAgICAuICcsJGV4cGVjdGF0aW9uLCcKKyAgICAgICAgLiAoJHNlbGYtPnthcmdjb2RlfSA/ICJzdWIgeyByZXR1cm4gJHNlbGYtPnthcmdjb2RlfSB9IgorICAgICAgICAgICAgICAgICAgICAgICAgOiAnc3ViIHsgXFxAYXJnIH0nKQorICAgICAgICAuICcpKSkKKyAgICAgICAgeworICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxezw8Jy5QYXJzZTo6UmVjRGVzY2VudDo6X21hdGNodHJhY2VtZXNzYWdlKCRzZWxmLDEpLicgcmVwZWF0ZWQgc3VicnVsZTogWycKKyAgICAgICAgICAgIC4gJHNlbGYtPmRlc2NyaWJlIC4gJ10+Pn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VmaXJzdCgkdGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHF7JyAuICRydWxlLT57Im5hbWUifSAuJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICR0cmFjZWxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQgJDo6UkRfVFJBQ0U7CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9CisgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2UocXs+PicuUGFyc2U6OlJlY0Rlc2NlbnQ6Ol9tYXRjaHRyYWNlbWVzc2FnZSgkc2VsZikuJyByZXBlYXRlZCBzdWJydWxlOiBbJworICAgICAgICAgICAgICAgICAgICAuICRzZWxmLT57c3VicnVsZX0gLiAnXTw8ICh9CisgICAgICAgICAgICAgICAgICAgIC4gQCRfdG9rIC4gcXsgdGltZXMpfSwKKworICAgICAgICAgICAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2VmaXJzdCgkdGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgcXsnIC4gJHJ1bGUtPnsibmFtZSJ9IC4nfSwKKyAgICAgICAgICAgICAgICAgICAgICAkdHJhY2VsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQgJDo6UkRfVFJBQ0U7CisgICAgICAgICRpdGVte3F7JyAuICIkc2VsZi0+e3N1YnJ1bGV9KCRzZWxmLT57cmVwc3BlY30pIiAuICd9fSA9ICRfdG9rOworICAgICAgICBwdXNoIEBpdGVtLCAkX3RvazsKKyAgICAgICAgJyAuICgkc2VsZi0+eyJsb29rYWhlYWQifSA/ICckdGV4dCA9ICRfc2F2ZXRleHQ7JyA6ICcnICkgLicKKworJworfQorCitwYWNrYWdlIFBhcnNlOjpSZWNEZXNjZW50OjpSZXN1bHQ7CisKK3N1YiBpc3N1YnJ1bGUgeyAwIH0KK3N1YiBpc3Rlcm1pbmFsIHsgMCB9CitzdWIgZGVzY3JpYmUgeyAnJyB9CisKK3N1YiBuZXcKK3sKKyAgICBteSAoJGNsYXNzLCAkcG9zKSA9IEBfOworCisgICAgYmxlc3Mge30sICRjbGFzczsKK30KKworc3ViIGNvZGUoJCQkJCkKK3sKKyAgICBteSAoJHNlbGYsICRuYW1lc3BhY2UsICRydWxlKSA9IEBfOworCisgICAgJworICAgICAgICAkcmV0dXJuID0gJGl0ZW1bLTFdOworICAgICc7Cit9CisKK3BhY2thZ2UgUGFyc2U6OlJlY0Rlc2NlbnQ6Ok9wZXJhdG9yOworCitteSBAb3BlcnR5cGUgPSAoICIgbm9uLW9wdGlvbmFsIiwgIm4gb3B0aW9uYWwiICk7CisKK3N1YiBpc3N1YnJ1bGUgeyAwIH0KK3N1YiBpc3Rlcm1pbmFsIHsgMCB9CisKK3N1YiBkZXNjcmliZSB7ICRfWzBdLT57ImV4cGVjdGVkIn0gfQorc3ViIHNldGhhc2huYW1lIHsgJF9bMF0tPntoYXNobmFtZX0gPSAnX19ESVJFQ1RJVkUnIC4gKyskX1sxXS0+e2RpcmNvdW50fSAuICAnX18nOyB9CisKKworc3ViIG5ldworeworICAgIG15ICgkY2xhc3MsICR0eXBlLCAkbWlucmVwLCAkbWF4cmVwLCAkbGVmdGFyZywgJG9wLCAkcmlnaHRhcmcpID0gQF87CisKKyAgICBibGVzcworICAgIHsKKyAgICAgICAgInR5cGUiICAgICAgPT4gIiR7dHlwZX1vcCIsCisgICAgICAgICJsZWZ0YXJnIiAgID0+ICRsZWZ0YXJnLAorICAgICAgICAib3AiICAgICAgICA9PiAkb3AsCisgICAgICAgICJtaW4iICAgICAgID0+ICRtaW5yZXAsCisgICAgICAgICJtYXgiICAgICAgID0+ICRtYXhyZXAsCisgICAgICAgICJyaWdodGFyZyIgID0+ICRyaWdodGFyZywKKyAgICAgICAgImV4cGVjdGVkIiAgPT4gIjwke3R5cGV9b3A6ICIuJGxlZnRhcmctPmRlc2NyaWJlLiIgIi4kb3AtPmRlc2NyaWJlLiIgIi4kcmlnaHRhcmctPmRlc2NyaWJlLiI+IiwKKyAgICB9LCAkY2xhc3M7Cit9CisKK3N1YiBjb2RlKCQkJCQpCit7CisgICAgbXkgKCRzZWxmLCAkbmFtZXNwYWNlLCAkcnVsZSwgJGNoZWNrKSA9IEBfOworCisgICAgbXkgQGNvZGVhcmdzID0gQF9bMS4uJCNfXTsKKworICAgIG15ICgkbGVmdGFyZywgJG9wLCAkcmlnaHRhcmcpID0KKyAgICAgICAgQHskc2VsZn17IHF3e2xlZnRhcmcgb3AgcmlnaHRhcmd9IH07CisKKyAgICBteSAkY29kZSA9ICcKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxe1RyeWluZyBvcGVyYXRvcjogWycgLiAkc2VsZi0+ZGVzY3JpYmUgLiAnXX0sCisgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlZmlyc3QoJHRleHQpLAorICAgICAgICAgICAgICAgICAgcXsnIC4gJHJ1bGUtPnsibmFtZSJ9IC4gJ30sCisgICAgICAgICAgICAgICAgICAkdHJhY2VsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZCAkOjpSRF9UUkFDRTsKKyAgICAgICAgJGV4cGVjdGF0aW9uLT5pcygnIC4gKCRydWxlLT5oYXNsZWZ0bW9zdCgkc2VsZikgPyAncXt9JworICAgICAgICAgICAgICAgICMgV0FTIDogJ3FxeycuJHNlbGYtPmRlc2NyaWJlLid9JyApIC4gJyktPmF0KCR0ZXh0KTsKKyAgICAgICAgICAgICAgICA6ICdxeycuJHNlbGYtPmRlc2NyaWJlLid9JyApIC4gJyktPmF0KCR0ZXh0KTsKKworICAgICAgICAkX3RvayA9IHVuZGVmOworICAgICAgICBPUExPT1A6IHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgJHJlcGNvdW50ID0gMDsKKyAgICAgICAgICBteSBAaXRlbTsKKyAgICAgICAgICBteSAlaXRlbTsKKyc7CisKKyAgICAkY29kZSAuPSAnCisgICAgICAgICAgbXkgICRfaXRlbXBvcyA9ICRpdGVtcG9zWy0xXTsKKyAgICAgICAgICBteSAgJGl0ZW1wb3NmaXJzdDsKKycgaWYgJGNoZWNrLT57aXRlbXBvc307CisKKyAgICBpZiAoJHNlbGYtPnt0eXBlfSBlcSAibGVmdG9wIiApCisgICAgeworICAgICAgICAkY29kZSAuPSAnCisgICAgICAgICAgIyBNQVRDSCBMRUZUQVJHCisgICAgICAgICAgJyAuICRsZWZ0YXJnLT5jb2RlKEBjb2RlYXJncykgLiAnCisKKyc7CisKKyAgICAgICAgJGNvZGUgLj0gJworICAgICAgICAgIGlmIChkZWZpbmVkKCRfaXRlbXBvcykgYW5kICFkZWZpbmVkKCRpdGVtcG9zZmlyc3QpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJGl0ZW1wb3NmaXJzdCA9IFBhcnNlOjpSZWNEZXNjZW50OjpQcm9kdWN0aW9uOjpfZHVwbGljYXRlX2l0ZW1wb3MoJF9pdGVtcG9zKTsKKyAgICAgICAgICB9CisnIGlmICRjaGVjay0+e2l0ZW1wb3N9OworCisgICAgICAgICRjb2RlIC49ICcKKyAgICAgICAgICAkcmVwY291bnQrKzsKKworICAgICAgICAgIG15ICRzYXZldGV4dCA9ICR0ZXh0OworICAgICAgICAgIG15ICRiYWNrdHJhY2s7CisKKyAgICAgICAgICAjIE1BVENIIChPUCBSSUdIVEFSRykocykKKyAgICAgICAgICB3aGlsZSAoJHJlcGNvdW50IDwgJyAuICRzZWxmLT57bWF4fSAuICcpCisgICAgICAgICAgeworICAgICAgICAgICAgJGJhY2t0cmFjayA9IDA7CisgICAgICAgICAgICAnIC4gJG9wLT5jb2RlKEBjb2RlYXJncykgLiAnCisgICAgICAgICAgICAnIC4gKCRvcC0+aXN0ZXJtaW5hbCgpID8gJ3BvcCBAaXRlbTsnIDogJyRiYWNrdHJhY2s9MTsnICkgLiAnCisgICAgICAgICAgICAnIC4gKHJlZigkb3ApIGVxICdQYXJzZTo6UmVjRGVzY2VudDo6VG9rZW4nCisgICAgICAgICAgICAgICAgPyAnaWYgKGRlZmluZWQgJDEpIHtwdXNoIEBpdGVtLCAkaXRlbXsnLigkc2VsZi0+e25hbWV9fHwkc2VsZi0+e2hhc2huYW1lfSkuJ309JDE7ICRiYWNrdHJhY2s9MTt9JworICAgICAgICAgICAgICAgIDogIiIgKSAuICcKKyAgICAgICAgICAgICcgLiAkcmlnaHRhcmctPmNvZGUoQGNvZGVhcmdzKSAuICcKKyAgICAgICAgICAgICRzYXZldGV4dCA9ICR0ZXh0OworICAgICAgICAgICAgJHJlcGNvdW50Kys7CisgICAgICAgICAgfQorICAgICAgICAgICR0ZXh0ID0gJHNhdmV0ZXh0OworICAgICAgICAgIHBvcCBAaXRlbSBpZiAkYmFja3RyYWNrOworCisgICAgICAgICAgJzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgJGNvZGUgLj0gJworICAgICAgICAgIG15ICRzYXZldGV4dCA9ICR0ZXh0OworICAgICAgICAgIG15ICRiYWNrdHJhY2s7CisgICAgICAgICAgIyBNQVRDSCAoTEVGVEFSRyBPUCkocykKKyAgICAgICAgICB3aGlsZSAoJHJlcGNvdW50IDwgJyAuICRzZWxmLT57bWF4fSAuICcpCisgICAgICAgICAgeworICAgICAgICAgICAgJGJhY2t0cmFjayA9IDA7CisgICAgICAgICAgICAnIC4gJGxlZnRhcmctPmNvZGUoQGNvZGVhcmdzKSAuICcKKyc7CisgICAgICAgICRjb2RlIC49ICcKKyAgICAgICAgICAgIGlmIChkZWZpbmVkKCRfaXRlbXBvcykgYW5kICFkZWZpbmVkKCRpdGVtcG9zZmlyc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRpdGVtcG9zZmlyc3QgPSBQYXJzZTo6UmVjRGVzY2VudDo6UHJvZHVjdGlvbjo6X2R1cGxpY2F0ZV9pdGVtcG9zKCRfaXRlbXBvcyk7CisgICAgICAgICAgICB9CisnIGlmICRjaGVjay0+e2l0ZW1wb3N9OworCisgICAgICAgICRjb2RlIC49ICcKKyAgICAgICAgICAgICRyZXBjb3VudCsrOworICAgICAgICAgICAgJGJhY2t0cmFjayA9IDE7CisgICAgICAgICAgICAnIC4gJG9wLT5jb2RlKEBjb2RlYXJncykgLiAnCisgICAgICAgICAgICAkc2F2ZXRleHQgPSAkdGV4dDsKKyAgICAgICAgICAgICcgLiAoJG9wLT5pc3Rlcm1pbmFsKCkgPyAncG9wIEBpdGVtOycgOiAiIiApIC4gJworICAgICAgICAgICAgJyAuIChyZWYoJG9wKSBlcSAnUGFyc2U6OlJlY0Rlc2NlbnQ6OlRva2VuJyA/ICdkbyB7IHB1c2ggQGl0ZW0sICRpdGVteycuKCRzZWxmLT57bmFtZX18fCRzZWxmLT57aGFzaG5hbWV9KS4nfT0kMTsgfSBpZiBkZWZpbmVkICQxOycgOiAiIiApIC4gJworICAgICAgICAgIH0KKyAgICAgICAgICAkdGV4dCA9ICRzYXZldGV4dDsKKyAgICAgICAgICBwb3AgQGl0ZW0gaWYgJGJhY2t0cmFjazsKKworICAgICAgICAgICMgTUFUQ0ggUklHSFRBUkcKKyAgICAgICAgICAnIC4gJHJpZ2h0YXJnLT5jb2RlKEBjb2RlYXJncykgLiAnCisgICAgICAgICAgJHJlcGNvdW50Kys7CisgICAgICAgICAgJzsKKyAgICB9CisKKyAgICAkY29kZSAuPSAndW5sZXNzIChAaXRlbSkgeyB1bmRlZiAkX3RvazsgbGFzdCB9JyB1bmxlc3MgJHNlbGYtPnttaW59PT0wOworCisgICAgJGNvZGUgLj0gJworICAgICAgICAgICRfdG9rID0gWyBAaXRlbSBdOworJzsKKworCisgICAgJGNvZGUgLj0gJworICAgICAgICAgIGlmIChkZWZpbmVkICRpdGVtcG9zZmlyc3QpCisgICAgICAgICAgeworICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6UHJvZHVjdGlvbjo6X3VwZGF0ZV9pdGVtcG9zKAorICAgICAgICAgICAgICAgICAgJF9pdGVtcG9zLCAkaXRlbXBvc2ZpcnN0LCB1bmRlZiwgW3F3KGZyb20pXSk7CisgICAgICAgICAgfQorJyBpZiAkY2hlY2stPntpdGVtcG9zfTsKKworICAgICRjb2RlIC49ICcKKyAgICAgICAgICBsYXN0OworICAgICAgICB9ICMgZW5kIG9mIE9QTE9PUAorJzsKKworICAgICRjb2RlIC49ICcKKyAgICAgICAgdW5sZXNzICgkcmVwY291bnQ+PScuJHNlbGYtPnttaW59LicpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcnNlOjpSZWNEZXNjZW50OjpfdHJhY2UocXs8PCcuUGFyc2U6OlJlY0Rlc2NlbnQ6Ol9tYXRjaHRyYWNlbWVzc2FnZSgkc2VsZiwxKS4nIG9wZXJhdG9yOiBbJworICAgICAgICAgICAgICAgICAgICAgICAgICAuICRzZWxmLT5kZXNjcmliZQorICAgICAgICAgICAgICAgICAgICAgICAgICAuICddPj59LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlZmlyc3QoJHRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBxeycgLiAkcnVsZS0+eyJuYW1lIn0gLid9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAkdHJhY2VsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkICQ6OlJEX1RSQUNFOworICAgICAgICAgICAgJGV4cGVjdGF0aW9uLT5mYWlsZWQoKTsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol90cmFjZShxez4+Jy5QYXJzZTo6UmVjRGVzY2VudDo6X21hdGNodHJhY2VtZXNzYWdlKCRzZWxmKS4nIG9wZXJhdG9yOiBbJworICAgICAgICAgICAgICAgICAgICAgIC4gJHNlbGYtPmRlc2NyaWJlCisgICAgICAgICAgICAgICAgICAgICAgLiAnXTw8IChyZXR1cm4gdmFsdWU6IFt9CisgICAgICAgICAgICAgICAgICAgICAgLiBxcXtAeyRfdG9rfHxbXX19IC4gcXtdfSwKKyAgICAgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudDo6X3RyYWNlZmlyc3QoJHRleHQpLAorICAgICAgICAgICAgICAgICAgICAgIHF7JyAuICRydWxlLT57Im5hbWUifSAuJ30sCisgICAgICAgICAgICAgICAgICAgICAgJHRyYWNlbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkICQ6OlJEX1RSQUNFOworCisgICAgICAgIHB1c2ggQGl0ZW0sICRpdGVteycuKCRzZWxmLT57bmFtZX18fCRzZWxmLT57aGFzaG5hbWV9KS4nfT0kX3Rva3x8W107CisnOworCisgICAgcmV0dXJuICRjb2RlOworfQorCisKK3BhY2thZ2UgUGFyc2U6OlJlY0Rlc2NlbnQ6OkV4cGVjdGF0aW9uOworCitzdWIgbmV3ICgkKQoreworICAgIGJsZXNzIHsKKyAgICAgICAgImZhaWxlZCIgICAgICA9PiAwLAorICAgICAgICAiZXhwZWN0ZWQiICAgID0+ICIiLAorICAgICAgICAidW5leHBlY3RlZCIgICAgICA9PiAiIiwKKyAgICAgICAgImxhc3RleHBlY3RlZCIgICAgPT4gIiIsCisgICAgICAgICJsYXN0dW5leHBlY3RlZCIgID0+ICIiLAorICAgICAgICAiZGVmZXhwZWN0ZWQiICAgICA9PiAkX1sxXSwKKyAgICAgICAgICB9OworfQorCitzdWIgaXMgKCQkKQoreworICAgICRfWzBdLT57bGFzdGV4cGVjdGVkfSA9ICRfWzFdOyByZXR1cm4gJF9bMF07Cit9CisKK3N1YiBhdCAoJCQpCit7CisgICAgJF9bMF0tPntsYXN0dW5leHBlY3RlZH0gPSAkX1sxXTsgcmV0dXJuICRfWzBdOworfQorCitzdWIgZmFpbGVkICgkKQoreworICAgIHJldHVybiB1bmxlc3MgJF9bMF0tPntsYXN0ZXhwZWN0ZWR9OworICAgICRfWzBdLT57ZXhwZWN0ZWR9ICAgPSAkX1swXS0+e2xhc3RleHBlY3RlZH0gICB1bmxlc3MgJF9bMF0tPntmYWlsZWR9OworICAgICRfWzBdLT57dW5leHBlY3RlZH0gPSAkX1swXS0+e2xhc3R1bmV4cGVjdGVkfSB1bmxlc3MgJF9bMF0tPntmYWlsZWR9OworICAgICRfWzBdLT57ZmFpbGVkfSA9IDE7Cit9CisKK3N1YiBtZXNzYWdlICgkKQoreworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICAkc2VsZi0+e2V4cGVjdGVkfSA9ICRzZWxmLT57ZGVmZXhwZWN0ZWR9IHVubGVzcyAkc2VsZi0+e2V4cGVjdGVkfTsKKyAgICAkc2VsZi0+e2V4cGVjdGVkfSA9fiBzL18vIC9nOworICAgIGlmICghJHNlbGYtPnt1bmV4cGVjdGVkfSB8fCAkc2VsZi0+e3VuZXhwZWN0ZWR9ID1+IC9cQVxzKlxaL3MpCisgICAgeworICAgICAgICByZXR1cm4gIldhcyBleHBlY3RpbmcgJHNlbGYtPntleHBlY3RlZH0iOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAkc2VsZi0+e3VuZXhwZWN0ZWR9ID1+IC9ccyooLiopLzsKKyAgICAgICAgcmV0dXJuICJXYXMgZXhwZWN0aW5nICRzZWxmLT57ZXhwZWN0ZWR9IGJ1dCBmb3VuZCBcIiQxXCIgaW5zdGVhZCI7CisgICAgfQorfQorCisxOworCitwYWNrYWdlIFBhcnNlOjpSZWNEZXNjZW50OworCit1c2UgQ2FycDsKK3VzZSB2YXJzIHF3ICggJEFVVE9MT0FEICRWRVJTSU9OICRfRklMRU5BTUUpOworCitteSAkRVJST1JTID0gMDsKKworb3VyICRWRVJTSU9OID0gJzEuOTY3MDA2JzsKKyRWRVJTSU9OID0gZXZhbCAkVkVSU0lPTjsKKyRfRklMRU5BTUU9X19GSUxFX187CisKKyMgQlVJTERJTkcgQSBQQVJTRVIKKworbXkgJG5leHRuYW1lc3BhY2UgPSAibmFtZXNwYWNlMDAwMDAxIjsKKworc3ViIF9uZXh0bmFtZXNwYWNlKCkKK3sKKyAgICByZXR1cm4gIlBhcnNlOjpSZWNEZXNjZW50OjoiIC4gJG5leHRuYW1lc3BhY2UrKzsKK30KKworIyBBUkdTIEFSRTogJGNsYXNzLCAkZ3JhbW1hciwgJGNvbXBpbGluZywgJG5hbWVzcGFjZQorc3ViIG5ldyAoJCQkJCkKK3sKKyAgICBteSAkY2xhc3MgPSByZWYoJF9bMF0pIHx8ICRfWzBdOworICAgIGxvY2FsICRQYXJzZTo6UmVjRGVzY2VudDo6Y29tcGlsaW5nID0gJF9bMl07CisgICAgbXkgJG5hbWVfc3BhY2VfbmFtZSA9IGRlZmluZWQgJF9bM10KKyAgICAgICAgPyAiUGFyc2U6OlJlY0Rlc2NlbnQ6OiIuJF9bM10KKyAgICAgICAgOiBfbmV4dG5hbWVzcGFjZSgpOworICAgIG15ICRzZWxmID0KKyAgICB7CisgICAgICAgICJydWxlcyIgICAgID0+IHt9LAorICAgICAgICAibmFtZXNwYWNlIiA9PiAkbmFtZV9zcGFjZV9uYW1lLAorICAgICAgICAic3RhcnRjb2RlIiA9PiAnJywKKyAgICAgICAgImxvY2FsdmFycyIgPT4gJycsCisgICAgICAgICJfQVVUT0FDVElPTiIgPT4gdW5kZWYsCisgICAgICAgICJfQVVUT1RSRUUiICAgPT4gdW5kZWYsCisgICAgfTsKKworCisgICAgaWYgKCQ6OlJEX0FVVE9BQ1RJT04pIHsKKyAgICAgICAgbXkgJHNvdXJjZWNvZGUgPSAkOjpSRF9BVVRPQUNUSU9OOworICAgICAgICAkc291cmNlY29kZSA9ICJ7ICRzb3VyY2Vjb2RlIH0iCisgICAgICAgICAgICB1bmxlc3MgJHNvdXJjZWNvZGUgPX4gL1xBXHMqXHsuKlx9XHMqXFovOworICAgICAgICAkc2VsZi0+e19jaGVja317aXRlbXBvc30gPQorICAgICAgICAgICAgJHNvdXJjZWNvZGUgPX4gL1xAaXRlbXBvc1xifFwkaXRlbXBvc1xzKlxbLzsKKyAgICAgICAgJHNlbGYtPntfQVVUT0FDVElPTn0KKyAgICAgICAgICAgID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpBY3Rpb24oJHNvdXJjZWNvZGUsMCwtMSkKKyAgICB9CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgIHJldHVybiAkc2VsZi0+UmVwbGFjZSgkX1sxXSkKK30KKworc3ViIENvbXBpbGUoJCQkJCkgeworICAgIGRpZSAiQ29tcGlsYXRpb24gb2YgUGFyc2U6OlJlY0Rlc2NlbnQgZ3JhbW1hcnMgbm90IHlldCBpbXBsZW1lbnRlZFxuIjsKK30KKworc3ViIERFU1RST1kgeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICBteSAkbmFtZXNwYWNlID0gJHNlbGYtPntuYW1lc3BhY2V9OworICAgICRuYW1lc3BhY2UgPX4gcy9QYXJzZTo6UmVjRGVzY2VudDo6Ly87CisgICAgaWYgKCEkc2VsZi0+e19wcmVjb21waWxlZH0pIHsKKyAgICAgICAgZGVsZXRlICRQYXJzZTo6UmVjRGVzY2VudDo6eyRuYW1lc3BhY2UuJzo6J307CisgICAgfQorfQorCisjIEJVSUxESU5HIEEgR1JBTU1BUi4uLi4KKworIyBBUkdTIEFSRTogJHNlbGYsICRncmFtbWFyLCAkaXNpbXBsaWNpdCwgJGlzbGVmdG9wCitzdWIgUmVwbGFjZSAoJCQpCit7CisgICAgIyBzZXQgJHJlcGxhY2UgPSAxIGZvciBfZ2VuZXJhdGUKKyAgICBzcGxpY2UoQF8sIDIsIDAsIDEpOworCisgICAgcmV0dXJuIF9nZW5lcmF0ZShAXyk7Cit9CisKKyMgQVJHUyBBUkU6ICRzZWxmLCAkZ3JhbW1hciwgJGlzaW1wbGljaXQsICRpc2xlZnRvcAorc3ViIEV4dGVuZCAoJCQpCit7CisgICAgIyBzZXQgJHJlcGxhY2UgPSAwIGZvciBfZ2VuZXJhdGUKKyAgICBzcGxpY2UoQF8sIDIsIDAsIDApOworCisgICAgcmV0dXJuIF9nZW5lcmF0ZShAXyk7Cit9CisKK3N1YiBfbm9fcnVsZSAoJCQ7JCkKK3sKKyAgICBfZXJyb3IoIlJ1bGVsZXNzICRfWzBdIGF0IHN0YXJ0IG9mIGdyYW1tYXIuIiwkX1sxXSk7CisgICAgbXkgJGRlc2MgPSAkX1syXSA/ICJcIiRfWzJdXCIiIDogIiI7CisgICAgX2hpbnQoIllvdSBuZWVkIHRvIGRlZmluZSBhIHJ1bGUgZm9yIHRoZSAkX1swXSAkZGVzYworICAgICAgICAgICB0byBiZSBwYXJ0IG9mLiIpOworfQorCitteSAkTkVHTE9PS0FIRUFEICAgID0gJ1xHKFxzKlwuXC5cLlwhKSc7CitteSAkUE9TTE9PS0FIRUFEICAgID0gJ1xHKFxzKlwuXC5cLiknOworbXkgJFJVTEUgICAgICAgID0gJ1xHXHMqKFx3KylbIFx0XSo6JzsKK215ICRQUk9EICAgICAgICA9ICdcR1xzKihbfF0pJzsKK215ICRUT0tFTiAgICAgICA9IHF7XEdccyovKChcXFxcL3xcXFxcXFxcXHxbXi9dKSopLyhbY2dpbXNveF0qKX07CitteSAkTVRPS0VOICAgICAgPSBxe1xHXHMqKG1ccypbXlx3XHNdKX07CitteSAkTElURVJBTCAgICAgPSBxe1xHXHMqJygoXFxcXFsnXFxcXF18W14nXSkqKSd9OworbXkgJElOVEVSUExJVCAgICAgICA9IHF7XEdccyoiKChcXFxcWyJcXFxcXXxbXiJdKSopIn07CitteSAkU1VCUlVMRSAgICAgPSAnXEdccyooXHcrKSc7CitteSAkTUFUQ0hSVUxFICAgICAgID0gJ1xHKFxzKjxtYXRjaHJ1bGU6KSc7CitteSAkU0lNUExFUEFUICAgICAgID0gJygoXFxzKy9bXi9cXFxcXSooPzpcXFxcLlteL1xcXFxdKikqLyk/KSc7CitteSAkT1BUSU9OQUwgICAgICAgID0gJ1xHXCgoXD8pJy4kU0lNUExFUEFULidcKSc7CitteSAkQU5ZICAgICAgICAgPSAnXEdcKChzXD8pJy4kU0lNUExFUEFULidcKSc7CitteSAkTUFOWSAgICAgICAgPSAnXEdcKChzfFwuXC4pJy4kU0lNUExFUEFULidcKSc7CitteSAkRVhBQ1RMWSAgICAgPSAnXEdcKChbMS05XVxkKiknLiRTSU1QTEVQQVQuJ1wpJzsKK215ICRCRVRXRUVOICAgICA9ICdcR1woKFxkKylcLlwuKFsxLTldXGQqKScuJFNJTVBMRVBBVC4nXCknOworbXkgJEFUTEVBU1QgICAgID0gJ1xHXCgoXGQrKVwuXC4nLiRTSU1QTEVQQVQuJ1wpJzsKK215ICRBVE1PU1QgICAgICA9ICdcR1woXC5cLihbMS05XVxkKiknLiRTSU1QTEVQQVQuJ1wpJzsKK215ICRCQURSRVAgICAgICA9ICdcR1woKC0/XGQrKT9cLlwuKC0/XGQrKT8nLiRTSU1QTEVQQVQuJ1wpJzsKK215ICRBQ1RJT04gICAgICA9ICdcR1xzKlx7JzsKK215ICRJTVBMSUNJVFNVQlJVTEUgPSAnXEdccypcKCc7CitteSAkQ09NTUVOVCAgICAgPSAnXEdccyooIy4qKSc7CitteSAkQ09NTUlUTUsgICAgICAgID0gJ1xHXHMqPGNvbW1pdD4nOworbXkgJFVOQ09NTUlUTUsgICAgICA9ICdcR1xzKjx1bmNvbW1pdD4nOworbXkgJFFVT1RFTElLRU1LICAgICA9ICdcR1xzKjxwZXJsX3F1b3RlbGlrZT4nOworbXkgJENPREVCTE9DS01LICAgICA9ICdcR1xzKjxwZXJsX2NvZGVibG9jayg/OlxzKyhbXVsoKTw+e31dKykpPz4nOworbXkgJFZBUklBQkxFTUsgICAgICA9ICdcR1xzKjxwZXJsX3ZhcmlhYmxlPic7CitteSAkTk9DSEVDS01LICAgICAgID0gJ1xHXHMqPG5vY2hlY2s+JzsKK215ICRBVVRPQUNUSU9OUEFUTUsgPSAnXEdccyo8YXV0b2FjdGlvbjonOworbXkgJEFVVE9UUkVFTUsgICAgICA9ICdcR1xzKjxhdXRvdHJlZSg/OjpccyooW1x3Ol0rKVxzKik/Pic7CitteSAkQVVUT1NUVUJNSyAgICAgID0gJ1xHXHMqPGF1dG9zdHViPic7CitteSAkQVVUT1JVTEVNSyAgICAgID0gJ1xHXHMqPGF1dG9ydWxlOiguKj8pPic7CitteSAkUkVKRUNUTUsgICAgICAgID0gJ1xHXHMqPHJlamVjdD4nOworbXkgJENPTkRSRUpFQ1RNSyAgICA9ICdcR1xzKjxyZWplY3Q6JzsKK215ICRTQ09SRU1LICAgICA9ICdcR1xzKjxzY29yZTonOworbXkgJEFVVE9TQ09SRU1LICAgICA9ICdcR1xzKjxhdXRvc2NvcmU6JzsKK215ICRTS0lQTUsgICAgICA9ICdcR1xzKjxza2lwOic7CitteSAkT1BNSyAgICAgICAgPSAnXEdccyo8KGxlZnR8cmlnaHQpb3AoPzo9KFwnLio/XCcpKT86JzsKK215ICRFTkRESVJFQ1RJVkVNSyAgPSAnXEdccyo+JzsKK215ICRSRVNZTkNNSyAgICAgICAgPSAnXEdccyo8cmVzeW5jPic7CitteSAkUkVTWU5DUEFUTUsgICAgID0gJ1xHXHMqPHJlc3luYzonOworbXkgJFJVTEVWQVJQQVRNSyAgICA9ICdcR1xzKjxydWxldmFyOic7CitteSAkREVGRVJQQVRNSyAgICAgID0gJ1xHXHMqPGRlZmVyOic7CitteSAkVE9LRU5QQVRNSyAgICAgID0gJ1xHXHMqPHRva2VuOic7CitteSAkQVVUT0VSUk9STUsgICAgID0gJ1xHXHMqPGVycm9yKFw/Pyk+JzsKK215ICRNU0dFUlJPUk1LICAgICAgPSAnXEdccyo8ZXJyb3IoXD8/KTonOworbXkgJE5PQ0hFQ0sgICAgID0gJ1xHXHMqPG5vY2hlY2s+JzsKK215ICRXQVJOTUsgICAgICA9ICdcR1xzKjx3YXJuKCg/OjpccyooXGQrKVxzKik/KT4nOworbXkgJEhJTlRNSyAgICAgID0gJ1xHXHMqPGhpbnQ+JzsKK215ICRUUkFDRUJVSUxETUsgICAgPSAnXEdccyo8dHJhY2VfYnVpbGQoKD86OlxzKihcZCspXHMqKT8pPic7CitteSAkVFJBQ0VQQVJTRU1LICAgID0gJ1xHXHMqPHRyYWNlX3BhcnNlKCg/OjpccyooXGQrKVxzKik/KT4nOworbXkgJFVOQ09NTUlUUFJPRCAgICA9ICRQUk9ELidccyo8dW5jb21taXQnOworbXkgJEVSUk9SUFJPRCAgICAgICA9ICRQUk9ELidccyo8ZXJyb3InOworbXkgJExPTkVDT0xPTiAgICAgICA9ICdcR1xzKjonOworbXkgJE9USEVSICAgICAgID0gJ1xHXHMqKFteXHNdKyknOworCitteSBAbGluZXMgPSAwOworCitzdWIgX2dlbmVyYXRlCit7CisgICAgbXkgKCRzZWxmLCAkZ3JhbW1hciwgJHJlcGxhY2UsICRpc2ltcGxpY2l0LCAkaXNsZWZ0b3ApID0gKEBfLCAwKTsKKworICAgIG15ICRhZnRlcmVycm9yID0gMDsKKyAgICBteSAkbG9va2FoZWFkID0gMDsKKyAgICBteSAkbG9va2FoZWFkc3BlYyA9ICIiOworICAgIG15ICRtdXN0X3BvcF9saW5lczsKKyAgICBpZiAoISAkbGluZXNbLTFdKSB7CisgICAgICAgIHB1c2ggQGxpbmVzLCBfbGluZWNvdW50KCRncmFtbWFyKSA7CisgICAgICAgICRtdXN0X3BvcF9saW5lcyA9IDE7CisgICAgfQorICAgICRzZWxmLT57X2NoZWNrfXtpdGVtcG9zfSA9ICgkZ3JhbW1hciA9fiAvXEBpdGVtcG9zXGJ8XCRpdGVtcG9zXHMqXFsvKQorICAgICAgICB1bmxlc3MgJHNlbGYtPntfY2hlY2t9e2l0ZW1wb3N9OworICAgIGZvciAocXcodGhpc29mZnNldCB0aGlzY29sdW1uIHByZXZsaW5lIHByZXZvZmZzZXQgcHJldmNvbHVtbikpCisgICAgeworICAgICAgICAkc2VsZi0+e19jaGVja317JF99ID0KKyAgICAgICAgICAgICgkZ3JhbW1hciA9fiAvXCQkXy8pIHx8ICRzZWxmLT57X2NoZWNrfXtpdGVtcG9zfQorICAgICAgICAgICAgICAgIHVubGVzcyAkc2VsZi0+e19jaGVja317JF99OworICAgIH0KKyAgICBteSAkbGluZTsKKworICAgIG15ICRydWxlID0gdW5kZWY7CisgICAgbXkgJHByb2QgPSB1bmRlZjsKKyAgICBteSAkaXRlbSA9IHVuZGVmOworICAgIG15ICRsYXN0Z3JlZWR5ID0gJyc7CisgICAgcG9zICRncmFtbWFyID0gMDsKKyAgICBzdHVkeSAkZ3JhbW1hcjsKKworICAgIGxvY2FsICQ6OlJEX0hJTlQgID0gJDo6UkRfSElOVDsKKyAgICBsb2NhbCAkOjpSRF9XQVJOICA9ICQ6OlJEX1dBUk47CisgICAgbG9jYWwgJDo6UkRfVFJBQ0UgPSAkOjpSRF9UUkFDRTsKKyAgICBsb2NhbCAkOjpSRF9DSEVDSyA9ICQ6OlJEX0NIRUNLOworCisgICAgd2hpbGUgKHBvcyAkZ3JhbW1hciA8IGxlbmd0aCAkZ3JhbW1hcikKKyAgICB7CisgICAgICAgICRsaW5lID0gJGxpbmVzWy0xXSAtIF9saW5lY291bnQoJGdyYW1tYXIpICsgMTsKKyAgICAgICAgbXkgJGNvbW1pdG9ubHk7CisgICAgICAgIG15ICRjb2RlID0gIiI7CisgICAgICAgIG15IEBjb21wb25lbnRzID0gKCk7CisgICAgICAgIGlmICgkZ3JhbW1hciA9fiBtLyRDT01NRU5UL2djbykKKyAgICAgICAgeworICAgICAgICAgICAgX3BhcnNlKCJhIGNvbW1lbnQiLDAsJGxpbmUsIHN1YnN0cigkZ3JhbW1hciwgJC1bMF0sICQrWzBdIC0gJC1bMF0pICk7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRORUdMT09LQUhFQUQvZ2NvKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2UoImEgbmVnYXRpdmUgbG9va2FoZWFkIiwkYWZ0ZXJlcnJvciwkbGluZSwgc3Vic3RyKCRncmFtbWFyLCAkLVswXSwgJCtbMF0gLSAkLVswXSkgKTsKKyAgICAgICAgICAgICRsb29rYWhlYWQgPSAkbG9va2FoZWFkID8gLSRsb29rYWhlYWQgOiAtMTsKKyAgICAgICAgICAgICRsb29rYWhlYWRzcGVjIC49ICQxOworICAgICAgICAgICAgbmV4dDsgICAjIFNLSVAgTE9PS0FIRUFEIFJFU0VUIEFUIEVORCBPRiB3aGlsZSBMT09QCisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJFBPU0xPT0tBSEVBRC9nY28pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYXJzZSgiYSBwb3NpdGl2ZSBsb29rYWhlYWQiLCRhZnRlcmVycm9yLCRsaW5lLCBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKSApOworICAgICAgICAgICAgJGxvb2thaGVhZCA9ICRsb29rYWhlYWQgPyAkbG9va2FoZWFkIDogMTsKKyAgICAgICAgICAgICRsb29rYWhlYWRzcGVjIC49ICQxOworICAgICAgICAgICAgbmV4dDsgICAjIFNLSVAgTE9PS0FIRUFEIFJFU0VUIEFUIEVORCBPRiB3aGlsZSBMT09QCisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vKD89JEFDVElPTikvZ2NvCisgICAgICAgICAgICBhbmQgZG8geyAoJGNvZGUpID0gZXh0cmFjdF9jb2RlYmxvY2soJGdyYW1tYXIpOyAkY29kZSB9KQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2UoImFuIGFjdGlvbiIsICRhZnRlcmVycm9yLCAkbGluZSwgJGNvZGUpOworICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OkFjdGlvbigkY29kZSwkbG9va2FoZWFkLCRsaW5lKTsKKyAgICAgICAgICAgICRwcm9kIGFuZCAkcHJvZC0+YWRkaXRlbSgkaXRlbSkKKyAgICAgICAgICAgICAgICAgIG9yICAkc2VsZi0+X2FkZHN0YXJ0Y29kZSgkY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vKD89JElNUExJQ0lUU1VCUlVMRSkvZ2NvCisgICAgICAgICAgICBhbmQgZG8geyAoJGNvZGUpID0gZXh0cmFjdF9jb2RlYmxvY2soJGdyYW1tYXIsJ3soWycsdW5kZWYsJygnLDEpOworICAgICAgICAgICAgICAgICRjb2RlIH0pCisgICAgICAgIHsKKyAgICAgICAgICAgICRjb2RlID1+IHMvXEFccypcKHxcKVxaLy9nOworICAgICAgICAgICAgX3BhcnNlKCJhbiBpbXBsaWNpdCBzdWJydWxlIiwgJGFmdGVyZXJyb3IsICRsaW5lLAorICAgICAgICAgICAgICAgICIoICRjb2RlICkiKTsKKyAgICAgICAgICAgIG15ICRpbXBsaWNpdCA9ICRydWxlLT5uZXh0aW1wbGljaXQ7CisgICAgICAgICAgICByZXR1cm4gdW5kZWYKKyAgICAgICAgICAgICAgICBpZiAhJHNlbGYtPl9nZW5lcmF0ZSgiJGltcGxpY2l0IDogJGNvZGUiLCRyZXBsYWNlLDEpOworICAgICAgICAgICAgbXkgJHBvcyA9IHBvcyAkZ3JhbW1hcjsKKyAgICAgICAgICAgIHN1YnN0cigkZ3JhbW1hciwkcG9zLDAsJGltcGxpY2l0KTsKKyAgICAgICAgICAgIHBvcyAkZ3JhbW1hciA9ICRwb3M7OworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRFTkRESVJFQ1RJVkVNSy9nY28pCisgICAgICAgIHsKKworICAgICAgICAjIEVYVFJBQ1QgVFJBSUxJTkcgUkVQRVRJVElPTiBTUEVDSUZJRVIgKElGIEFOWSkKKworICAgICAgICAgICAgbXkgKCRtaW5yZXAsJG1heHJlcCkgPSAoMSwkTUFYUkVQKTsKKyAgICAgICAgICAgIGlmICgkZ3JhbW1hciA9fiBtL1xHWyhdL2djKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcygkZ3JhbW1hciktLTsKKworICAgICAgICAgICAgICAgIGlmICgkZ3JhbW1hciA9fiBtLyRPUFRJT05BTC9nY28pCisgICAgICAgICAgICAgICAgICAgIHsgKCRtaW5yZXAsICRtYXhyZXApID0gKDAsMSkgfQorICAgICAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRBTlkvZ2NvKQorICAgICAgICAgICAgICAgICAgICB7ICRtaW5yZXAgPSAwIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kRVhBQ1RMWS9nY28pCisgICAgICAgICAgICAgICAgICAgIHsgKCRtaW5yZXAsICRtYXhyZXApID0gKCQxLCQxKSB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJEJFVFdFRU4vZ2NvKQorICAgICAgICAgICAgICAgICAgICB7ICgkbWlucmVwLCAkbWF4cmVwKSA9ICgkMSwkMikgfQorICAgICAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRBVExFQVNUL2djbykKKyAgICAgICAgICAgICAgICAgICAgeyAkbWlucmVwID0gJDEgfQorICAgICAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRBVE1PU1QvZ2NvKQorICAgICAgICAgICAgICAgICAgICB7ICRtYXhyZXAgPSAkMSB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJE1BTlkvZ2NvKQorICAgICAgICAgICAgICAgICAgICB7IH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kQkFEUkVQL2djbykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9wYXJzZSgiYW4gaW52YWxpZCByZXBldGl0aW9uIHNwZWNpZmllciIsIDAsJGxpbmUsIHN1YnN0cigkZ3JhbW1hciwgJC1bMF0sICQrWzBdIC0gJC1bMF0pICk7CisgICAgICAgICAgICAgICAgICAgIF9lcnJvcigiSW5jb3JyZWN0IHNwZWNpZmljYXRpb24gb2YgYSByZXBlYXRlZCBkaXJlY3RpdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUpOworICAgICAgICAgICAgICAgICAgICBfaGludCgiUmVwZWF0ZWQgZGlyZWN0aXZlcyBjYW5ub3QgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBtYXhpbXVtIHJlcGV0aXRpb24gb2YgemVybywgbm9yIGNhbiB0aGV5IGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlIGNvbXBvbmVudHMgaW4gdGhlaXIgcmFuZ2VzLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHByb2QgJiYgJHByb2QtPmVuZGRpcmVjdGl2ZSgkbGluZSwkbWlucmVwLCRtYXhyZXApOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtL1xHXHMqPFtebV0vZ2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcygkZ3JhbW1hciktPTI7CisKKyAgICAgICAgICAgIGlmICgkZ3JhbW1hciA9fiBtLyRPUE1LL2djbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjICREQjo6c2luZ2xlPTE7CisgICAgICAgICAgICAgICAgX3BhcnNlKCJhICQxLWFzc29jaWF0aXZlIG9wZXJhdG9yIGRpcmVjdGl2ZSIsICRhZnRlcmVycm9yLCAkbGluZSwgIjwkMW9wOi4uLj4iKTsKKyAgICAgICAgICAgICAgICAkcHJvZC0+YWRkZGlyZWN0aXZlKCQxLCAkbGluZSwkMnx8JycpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJFVOQ09NTUlUTUsvZ2NvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYW4gdW5jb21taXQgbWFya2VyIiwgJGFmdGVyZXJyb3IsJGxpbmUsIHN1YnN0cigkZ3JhbW1hciwgJC1bMF0sICQrWzBdIC0gJC1bMF0pICk7CisgICAgICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OkRpcmVjdGl2ZSgnJGNvbW1pdD0wOzEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb29rYWhlYWQsJGxpbmUsIjx1bmNvbW1pdD4iKTsKKyAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCI8dW5jb21taXQ+IiwkbGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kUVVPVEVMSUtFTUsvZ2NvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYW4gcGVybCBxdW90ZWxpa2UgbWFya2VyIiwgJGFmdGVyZXJyb3IsJGxpbmUsIHN1YnN0cigkZ3JhbW1hciwgJC1bMF0sICQrWzBdIC0gJC1bMF0pICk7CisgICAgICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OkRpcmVjdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgJ215ICgkbWF0Y2gsQHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAoJG1hdGNoLCR0ZXh0LHVuZGVmLEByZXMpID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dDo6QmFsYW5jZWQ6OmV4dHJhY3RfcXVvdGVsaWtlKCR0ZXh0LCRza2lwKTsKKyAgICAgICAgICAgICAgICAgICAgICAkbWF0Y2ggPyBcQHJlcyA6IHVuZGVmOworICAgICAgICAgICAgICAgICAgICAnLCAkbG9va2FoZWFkLCRsaW5lLCI8cGVybF9xdW90ZWxpa2U+Iik7CisgICAgICAgICAgICAgICAgJHByb2QgYW5kICRwcm9kLT5hZGRpdGVtKCRpdGVtKQorICAgICAgICAgICAgICAgICAgICAgIG9yICBfbm9fcnVsZSgiPHBlcmxfcXVvdGVsaWtlPiIsJGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJENPREVCTE9DS01LL2djbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteSAkb3V0ZXIgPSAkMXx8Int9IjsKKyAgICAgICAgICAgICAgICBfcGFyc2UoImFuIHBlcmwgY29kZWJsb2NrIG1hcmtlciIsICRhZnRlcmVycm9yLCRsaW5lLCBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKSApOworICAgICAgICAgICAgICAgICRpdGVtID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpEaXJlY3RpdmUoCisgICAgICAgICAgICAgICAgICAgICdUZXh0OjpCYWxhbmNlZDo6ZXh0cmFjdF9jb2RlYmxvY2soJHRleHQsdW5kZWYsJHNraXAsXCcnLiRvdXRlci4nXCcpOworICAgICAgICAgICAgICAgICAgICAnLCAkbG9va2FoZWFkLCRsaW5lLCI8cGVybF9jb2RlYmxvY2s+Iik7CisgICAgICAgICAgICAgICAgJHByb2QgYW5kICRwcm9kLT5hZGRpdGVtKCRpdGVtKQorICAgICAgICAgICAgICAgICAgICAgIG9yICBfbm9fcnVsZSgiPHBlcmxfY29kZWJsb2NrPiIsJGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJFZBUklBQkxFTUsvZ2NvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYW4gcGVybCB2YXJpYWJsZSBtYXJrZXIiLCAkYWZ0ZXJlcnJvciwkbGluZSwgc3Vic3RyKCRncmFtbWFyLCAkLVswXSwgJCtbMF0gLSAkLVswXSkgKTsKKyAgICAgICAgICAgICAgICAkaXRlbSA9IG5ldyBQYXJzZTo6UmVjRGVzY2VudDo6RGlyZWN0aXZlKAorICAgICAgICAgICAgICAgICAgICAnVGV4dDo6QmFsYW5jZWQ6OmV4dHJhY3RfdmFyaWFibGUoJHRleHQsJHNraXApOworICAgICAgICAgICAgICAgICAgICAnLCAkbG9va2FoZWFkLCRsaW5lLCI8cGVybF92YXJpYWJsZT4iKTsKKyAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCI8cGVybF92YXJpYWJsZT4iLCRsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyROT0NIRUNLTUsvZ2NvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYSBkaXNhYmxlIGNoZWNraW5nIG1hcmtlciIsICRhZnRlcmVycm9yLCRsaW5lLCBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKSApOworICAgICAgICAgICAgICAgIGlmICgkcnVsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9lcnJvcigiPG5vY2hlY2s+IGRpcmVjdGl2ZSBub3QgYXQgc3RhcnQgb2YgZ3JhbW1hciIsICRsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgX2hpbnQoIlRoZSA8bm9jaGVjaz4gZGlyZWN0aXZlIGNhbiBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzcGVjaWZpZWQgYXQgdGhlIHN0YXJ0IG9mIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXIgKGJlZm9yZSB0aGUgZmlyc3QgcnVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZGVmaW5lZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwgJDo6UkRfQ0hFQ0sgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRBVVRPU1RVQk1LL2djbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGFyc2UoImFuIGF1dG9zdHViIG1hcmtlciIsICRhZnRlcmVycm9yLCRsaW5lLCBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKSApOworICAgICAgICAgICAgICAgICQ6OlJEX0FVVE9TVFVCID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kQVVUT1JVTEVNSy9nY28pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3BhcnNlKCJhbiBhdXRvcnVsZSBtYXJrZXIiLCAkYWZ0ZXJlcnJvciwkbGluZSwgc3Vic3RyKCRncmFtbWFyLCAkLVswXSwgJCtbMF0gLSAkLVswXSkgKTsKKyAgICAgICAgICAgICAgICAkOjpSRF9BVVRPU1RVQiA9ICQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJEFVVE9UUkVFTUsvZ2NvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG15ICRiYXNlID0gZGVmaW5lZCgkMSkgPyAkMSA6ICIiOworICAgICAgICAgICAgICAgIG15ICRjdXJyZW50X21hdGNoID0gc3Vic3RyKCRncmFtbWFyLCAkLVswXSwgJCtbMF0gLSAkLVswXSk7CisgICAgICAgICAgICAgICAgJGJhc2UgLj0gIjo6IiBpZiAkYmFzZSAmJiAkYmFzZSAhfiAvOjokLzsKKyAgICAgICAgICAgICAgICBfcGFyc2UoImFuIGF1dG90cmVlIG1hcmtlciIsICRhZnRlcmVycm9yLCRsaW5lLCAkY3VycmVudF9tYXRjaCk7CisgICAgICAgICAgICAgICAgaWYgKCRydWxlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2Vycm9yKCI8YXV0b3RyZWU+IGRpcmVjdGl2ZSBub3QgYXQgc3RhcnQgb2YgZ3JhbW1hciIsICRsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgX2hpbnQoIlRoZSA8YXV0b3RyZWU+IGRpcmVjdGl2ZSBjYW4gb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc3BlY2lmaWVkIGF0IHRoZSBzdGFydCBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyIChiZWZvcmUgdGhlIGZpcnN0IHJ1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGRlZmluZWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuZGVmICRzZWxmLT57X0FVVE9BQ1RJT059OworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19BVVRPVFJFRX17Tk9ERX0KKyAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpBY3Rpb24ocSh7Ymxlc3MgXCVpdGVtLCAnKS4kYmFzZS5xKCcuJGl0ZW1bMF19KSwwLC0xKTsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfQVVUT1RSRUV9e1RFUk1JTkFMfQorICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OkFjdGlvbihxKHtibGVzcyB7X19WQUxVRV9fPT4kaXRlbVsxXX0sICcpLiRiYXNlLnEoJy4kaXRlbVswXX0pLDAsLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJFJFSkVDVE1LL2djbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGFyc2UoImFuIHJlamVjdCBtYXJrZXIiLCAkYWZ0ZXJlcnJvciwkbGluZSwgc3Vic3RyKCRncmFtbWFyLCAkLVswXSwgJCtbMF0gLSAkLVswXSkgKTsKKyAgICAgICAgICAgICAgICAkaXRlbSA9IG5ldyBQYXJzZTo6UmVjRGVzY2VudDo6VW5jb25kUmVqZWN0KCRsb29rYWhlYWQsJGxpbmUsIjxyZWplY3Q+Iik7CisgICAgICAgICAgICAgICAgJHByb2QgYW5kICRwcm9kLT5hZGRpdGVtKCRpdGVtKQorICAgICAgICAgICAgICAgICAgICAgIG9yICBfbm9fcnVsZSgiPHJlamVjdD4iLCRsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyg/PSRDT05EUkVKRUNUTUspL2djbworICAgICAgICAgICAgICAgIGFuZCBkbyB7ICgkY29kZSkgPSBleHRyYWN0X2NvZGVibG9jaygkZ3JhbW1hciwneycsdW5kZWYsJzwnKTsKKyAgICAgICAgICAgICAgICAgICAgICAkY29kZSB9KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYSAoY29uZGl0aW9uYWwpIHJlamVjdCBtYXJrZXIiLCAkYWZ0ZXJlcnJvciwkbGluZSwgJGNvZGUgKTsKKyAgICAgICAgICAgICAgICAkY29kZSA9fiAvXEFccyo8cmVqZWN0OiguKik+XFovczsKKyAgICAgICAgICAgICAgICBteSAkY29uZCA9ICQxOworICAgICAgICAgICAgICAgICRpdGVtID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpEaXJlY3RpdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoJDEpID8gdW5kZWYgOiAxIiwgJGxvb2thaGVhZCwkbGluZSwiPHJlamVjdDokY29uZD4iKTsKKyAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCI8cmVqZWN0OiRjb25kPiIsJGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vKD89JFNDT1JFTUspL2djbworICAgICAgICAgICAgICAgIGFuZCBkbyB7ICgkY29kZSkgPSBleHRyYWN0X2NvZGVibG9jaygkZ3JhbW1hciwneycsdW5kZWYsJzwnKTsKKyAgICAgICAgICAgICAgICAgICAgICAkY29kZSB9KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYSBzY29yZSBtYXJrZXIiLCAkYWZ0ZXJlcnJvciwkbGluZSwgJGNvZGUgKTsKKyAgICAgICAgICAgICAgICAkY29kZSA9fiAvXEFccyo8c2NvcmU6KC4qKT5cWi9zOworICAgICAgICAgICAgICAgICRwcm9kIGFuZCAkcHJvZC0+YWRkc2NvcmUoJDEsICRsb29rYWhlYWQsICRsaW5lKQorICAgICAgICAgICAgICAgICAgICAgIG9yICBfbm9fcnVsZSgkY29kZSwkbGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8oPz0kQVVUT1NDT1JFTUspL2djbworICAgICAgICAgICAgICAgIGFuZCBkbyB7ICgkY29kZSkgPSBleHRyYWN0X2NvZGVibG9jaygkZ3JhbW1hciwneycsdW5kZWYsJzwnKTsKKyAgICAgICAgICAgICAgICAgICAgICRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICB9ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGFyc2UoImFuIGF1dG9zY29yZSBzcGVjaWZpZXIiLCAkYWZ0ZXJlcnJvciwkbGluZSwkY29kZSk7CisgICAgICAgICAgICAgICAgJGNvZGUgPX4gL1xBXHMqPGF1dG9zY29yZTooLiopPlxaL3M7CisKKyAgICAgICAgICAgICAgICAkcnVsZSBhbmQgJHJ1bGUtPmFkZGF1dG9zY29yZSgkMSwkc2VsZikKKyAgICAgICAgICAgICAgICAgICAgICBvciAgX25vX3J1bGUoJGNvZGUsJGxpbmUpOworCisgICAgICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OlVuY29uZFJlamVjdCgkbG9va2FoZWFkLCRsaW5lLCRjb2RlKTsKKyAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCRjb2RlLCRsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRSRVNZTkNNSy9nY28pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3BhcnNlKCJhIHJlc3luYyB0byBuZXdsaW5lIG1hcmtlciIsICRhZnRlcmVycm9yLCRsaW5lLCBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKSApOworICAgICAgICAgICAgICAgICRpdGVtID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpEaXJlY3RpdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpZiAoJHRleHQgPX4gcy8oXEFbXlxuXSpcbikvLykgeyAkcmV0dXJuID0gMDsgJDE7IH0gZWxzZSB7IHVuZGVmIH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9va2FoZWFkLCRsaW5lLCI8cmVzeW5jPiIpOworICAgICAgICAgICAgICAgICRwcm9kIGFuZCAkcHJvZC0+YWRkaXRlbSgkaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgICBvciAgX25vX3J1bGUoIjxyZXN5bmM+IiwkbGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8oPz0kUkVTWU5DUEFUTUspL2djbworICAgICAgICAgICAgICAgIGFuZCBkbyB7ICgkY29kZSkgPSBleHRyYWN0X2JyYWNrZXRlZCgkZ3JhbW1hciwnPCcpOworICAgICAgICAgICAgICAgICAgICAgICRjb2RlIH0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3BhcnNlKCJhIHJlc3luYyB3aXRoIHBhdHRlcm4gbWFya2VyIiwgJGFmdGVyZXJyb3IsJGxpbmUsICRjb2RlICk7CisgICAgICAgICAgICAgICAgJGNvZGUgPX4gL1xBXHMqPHJlc3luYzooLiopPlxaL3M7CisgICAgICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OkRpcmVjdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lmICgkdGV4dCA9fiBzLyhcQScuJDEuJykvLykgeyAkcmV0dXJuID0gMDsgJDE7IH0gZWxzZSB7IHVuZGVmIH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9va2FoZWFkLCRsaW5lLCRjb2RlKTsKKyAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCRjb2RlLCRsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyg/PSRTS0lQTUspL2djbworICAgICAgICAgICAgICAgIGFuZCBkbyB7ICgkY29kZSkgPSBleHRyYWN0X2NvZGVibG9jaygkZ3JhbW1hciwnPCcpOworICAgICAgICAgICAgICAgICAgICAgICRjb2RlIH0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3BhcnNlKCJhIHNraXAgbWFya2VyIiwgJGFmdGVyZXJyb3IsJGxpbmUsICRjb2RlICk7CisgICAgICAgICAgICAgICAgJGNvZGUgPX4gL1xBXHMqPHNraXA6KC4qKT5cWi9zOworICAgICAgICAgICAgICAgIGlmICgkcnVsZSkgeworICAgICAgICAgICAgICAgICAgICAkaXRlbSA9IG5ldyBQYXJzZTo6UmVjRGVzY2VudDo6RGlyZWN0aXZlKAorICAgICAgICAgICAgICAgICAgICAgICAgJ215ICRvbGRza2lwID0gJHNraXA7ICRza2lwPScuJDEuJzsgJG9sZHNraXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgJGxvb2thaGVhZCwkbGluZSwkY29kZSk7CisgICAgICAgICAgICAgICAgICAgICRwcm9kIGFuZCAkcHJvZC0+YWRkaXRlbSgkaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgICBvciAgX25vX3J1bGUoJGNvZGUsJGxpbmUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICNnbG9iYWwgPHNraXA+IGRpcmVjdGl2ZQorICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e3NraXB9ID0gJDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vKD89JFJVTEVWQVJQQVRNSykvZ2NvCisgICAgICAgICAgICAgICAgYW5kIGRvIHsgKCRjb2RlKSA9IGV4dHJhY3RfY29kZWJsb2NrKCRncmFtbWFyLCd7Jyx1bmRlZiwnPCcpOworICAgICAgICAgICAgICAgICAgICAgJGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgIH0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYSBydWxlIHZhcmlhYmxlIHNwZWNpZmllciIsICRhZnRlcmVycm9yLCRsaW5lLCRjb2RlKTsKKyAgICAgICAgICAgICAgICAkY29kZSA9fiAvXEFccyo8cnVsZXZhcjooLiopPlxaL3M7CisKKyAgICAgICAgICAgICAgICAkcnVsZSBhbmQgJHJ1bGUtPmFkZHZhcigkMSwkc2VsZikKKyAgICAgICAgICAgICAgICAgICAgICBvciAgX25vX3J1bGUoJGNvZGUsJGxpbmUpOworCisgICAgICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OlVuY29uZFJlamVjdCgkbG9va2FoZWFkLCRsaW5lLCRjb2RlKTsKKyAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCRjb2RlLCRsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyg/PSRBVVRPQUNUSU9OUEFUTUspL2djbworICAgICAgICAgICAgICAgIGFuZCBkbyB7ICgkY29kZSkgPSBleHRyYWN0X2NvZGVibG9jaygkZ3JhbW1hciwneycsdW5kZWYsJzwnKTsKKyAgICAgICAgICAgICAgICAgICAgICRjb2RlOworICAgICAgICAgICAgICAgICAgICAgICB9ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGFyc2UoImFuIGF1dG9hY3Rpb24gc3BlY2lmaWVyIiwgJGFmdGVyZXJyb3IsJGxpbmUsJGNvZGUpOworICAgICAgICAgICAgICAgICRjb2RlID1+IHMvXEFccyo8YXV0b2FjdGlvbjooLiopPlxaLyQxL3M7CisgICAgICAgICAgICAgICAgaWYgKCRjb2RlID1+IC9cQVxzKltee118W159XVxzKlxaLykgeworICAgICAgICAgICAgICAgICAgICAkY29kZSA9ICJ7ICRjb2RlIH0iCisgICAgICAgICAgICAgICAgfQorICAgICAgICAkc2VsZi0+e19jaGVja317aXRlbXBvc30gPQorICAgICAgICAgICAgJGNvZGUgPX4gL1xAaXRlbXBvc1xifFwkaXRlbXBvc1xzKlxbLzsKKyAgICAgICAgJHNlbGYtPntfQVVUT0FDVElPTn0KKyAgICAgICAgICAgID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpBY3Rpb24oJGNvZGUsMCwtJGxpbmUpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8oPz0kREVGRVJQQVRNSykvZ2NvCisgICAgICAgICAgICAgICAgYW5kIGRvIHsgKCRjb2RlKSA9IGV4dHJhY3RfY29kZWJsb2NrKCRncmFtbWFyLCd7Jyx1bmRlZiwnPCcpOworICAgICAgICAgICAgICAgICAgICAgJGNvZGU7CisgICAgICAgICAgICAgICAgICAgICAgIH0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYSBkZWZlcnJlZCBhY3Rpb24gc3BlY2lmaWVyIiwgJGFmdGVyZXJyb3IsJGxpbmUsJGNvZGUpOworICAgICAgICAgICAgICAgICRjb2RlID1+IHMvXEFccyo8ZGVmZXI6KC4qKT5cWi8kMS9zOworICAgICAgICAgICAgICAgIGlmICgkY29kZSA9fiAvXEFccypbXntdfFtefV1ccypcWi8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAkY29kZSA9ICJ7ICRjb2RlIH0iCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OkRpcmVjdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInB1c2ggXEB7XCR0aGlzcGFyc2VyLT57ZGVmZXJyZWR9fSwgc3ViICRjb2RlOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICRsb29rYWhlYWQsJGxpbmUsIjxkZWZlcjokY29kZT4iKTsKKyAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCI8ZGVmZXI6JGNvZGU+IiwkbGluZSk7CisKKyAgICAgICAgICAgICAgICAkc2VsZi0+e2RlZmVycmFibGV9ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyg/PSRUT0tFTlBBVE1LKS9nY28KKyAgICAgICAgICAgICAgICBhbmQgZG8geyAoJGNvZGUpID0gZXh0cmFjdF9jb2RlYmxvY2soJGdyYW1tYXIsJ3snLHVuZGVmLCc8Jyk7CisgICAgICAgICAgICAgICAgICAgICAkY29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgfSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3BhcnNlKCJhIHRva2VuIGNvbnN0cnVjdG9yIiwgJGFmdGVyZXJyb3IsJGxpbmUsJGNvZGUpOworICAgICAgICAgICAgICAgICRjb2RlID1+IHMvXEFccyo8dG9rZW46KC4qKT5cWi8kMS9zOworCisgICAgICAgICAgICAgICAgbXkgJHR5cGVzID0gZXZhbCAnbm8gc3RyaWN0OyBsb2NhbCAkU0lHe19fV0FSTl9ffSA9IHN1YiB7MH07IG15IEBhcnI9KCcuJGNvZGUuJyk7IEBhcnInIHx8ICgpOworICAgICAgICAgICAgICAgIGlmICghJHR5cGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2Vycm9yKCJJbmNvcnJlY3QgdG9rZW4gc3BlY2lmaWNhdGlvbjogXCIkQFwiIiwgJGxpbmUpOworICAgICAgICAgICAgICAgICAgICBfaGludCgiVGhlIDx0b2tlbjouLi4+IGRpcmVjdGl2ZSByZXF1aXJlcyBhIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIG9uZSBvciBtb3JlIHN0cmluZ3MgcmVwcmVzZW50aW5nIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcyBvZiB0aGUgc3BlY2lmaWVkIHRva2VuLiBGb3IgZXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0b2tlbjpOT1VOLFZFUkI+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICRpdGVtID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpEaXJlY3RpdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm8gc3RyaWN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXR1cm4gPSB7IHRleHQgPT4gJGl0ZW1bLTFdIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHskcmV0dXJuLT57dHlwZX19eycuJGNvZGUuJ30gPSAoMS4uJy4kdHlwZXMuJyk7JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb29rYWhlYWQsJGxpbmUsIjx0b2tlbjokY29kZT4iKTsKKyAgICAgICAgICAgICAgICAgICAgJHByb2QgYW5kICRwcm9kLT5hZGRpdGVtKCRpdGVtKQorICAgICAgICAgICAgICAgICAgICAgICAgICBvciAgX25vX3J1bGUoIjx0b2tlbjokY29kZT4iLCRsaW5lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kQ09NTUlUTUsvZ2NvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYW4gY29tbWl0IG1hcmtlciIsICRhZnRlcmVycm9yLCRsaW5lLCBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKSApOworICAgICAgICAgICAgICAgICRpdGVtID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpEaXJlY3RpdmUoJyRjb21taXQgPSAxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9va2FoZWFkLCRsaW5lLCI8Y29tbWl0PiIpOworICAgICAgICAgICAgICAgICRwcm9kIGFuZCAkcHJvZC0+YWRkaXRlbSgkaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgICBvciAgX25vX3J1bGUoIjxjb21taXQ+IiwkbGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kTk9DSEVDS01LL2djbykgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYW4gaGludCByZXF1ZXN0IiwgJGFmdGVyZXJyb3IsJGxpbmUsIHN1YnN0cigkZ3JhbW1hciwgJC1bMF0sICQrWzBdIC0gJC1bMF0pICk7CisgICAgICAgICQ6OlJEX0NIRUNLID0gMDsKKyAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJEhJTlRNSy9nY28pIHsKKyAgICAgICAgICAgICAgICBfcGFyc2UoImFuIGhpbnQgcmVxdWVzdCIsICRhZnRlcmVycm9yLCRsaW5lLCBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKSApOworICAgICAgICAkOjpSRF9ISU5UID0gJHNlbGYtPntfX0hJTlRfX30gPSAxOworICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kV0FSTk1LL2djbykgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYW4gd2FybmluZyByZXF1ZXN0IiwgJGFmdGVyZXJyb3IsJGxpbmUsIHN1YnN0cigkZ3JhbW1hciwgJC1bMF0sICQrWzBdIC0gJC1bMF0pICk7CisgICAgICAgICQ6OlJEX1dBUk4gPSAkc2VsZi0+e19fV0FSTl9ffSA9ICQxID8gJDIrMCA6IDE7CisgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRUUkFDRUJVSUxETUsvZ2NvKSB7CisgICAgICAgICAgICAgICAgX3BhcnNlKCJhbiBncmFtbWFyIGJ1aWxkIHRyYWNlIHJlcXVlc3QiLCAkYWZ0ZXJlcnJvciwkbGluZSwgc3Vic3RyKCRncmFtbWFyLCAkLVswXSwgJCtbMF0gLSAkLVswXSkgKTsKKyAgICAgICAgJDo6UkRfVFJBQ0UgPSAkMSA/ICQyKzAgOiAxOworICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kVFJBQ0VQQVJTRU1LL2djbykgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYW4gcGFyc2UgdHJhY2UgcmVxdWVzdCIsICRhZnRlcmVycm9yLCRsaW5lLCBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKSApOworICAgICAgICAkc2VsZi0+e19fVFJBQ0VfX30gPSAkMSA/ICQyKzAgOiAxOworICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kQVVUT0VSUk9STUsvZ2NvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRjb21taXRvbmx5ID0gJDE7CisgICAgICAgICAgICAgICAgX3BhcnNlKCJhbiBlcnJvciBtYXJrZXIiLCAkYWZ0ZXJlcnJvciwkbGluZSwgc3Vic3RyKCRncmFtbWFyLCAkLVswXSwgJCtbMF0gLSAkLVswXSkgKTsKKyAgICAgICAgICAgICAgICAkaXRlbSA9IG5ldyBQYXJzZTo6UmVjRGVzY2VudDo6RXJyb3IoJycsJGxvb2thaGVhZCwkMSwkbGluZSk7CisgICAgICAgICAgICAgICAgJHByb2QgYW5kICRwcm9kLT5hZGRpdGVtKCRpdGVtKQorICAgICAgICAgICAgICAgICAgICAgIG9yICBfbm9fcnVsZSgiPGVycm9yPiIsJGxpbmUpOworICAgICAgICAgICAgICAgICRhZnRlcmVycm9yID0gISRjb21taXRvbmx5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vKD89JE1TR0VSUk9STUspL2djbworICAgICAgICAgICAgICAgIGFuZCBkbyB7ICRjb21taXRvbmx5ID0gJDE7CisgICAgICAgICAgICAgICAgICAgICAoJGNvZGUpID0gZXh0cmFjdF9icmFja2V0ZWQoJGdyYW1tYXIsJzwnKTsKKyAgICAgICAgICAgICAgICAgICAgJGNvZGUgfSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGFyc2UoImFuIGVycm9yIG1hcmtlciIsICRhZnRlcmVycm9yLCRsaW5lLCRjb2RlKTsKKyAgICAgICAgICAgICAgICAkY29kZSA9fiAvXEFccyo8ZXJyb3JcPz86KC4qKT5cWi9zOworICAgICAgICAgICAgICAgICRpdGVtID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpFcnJvcigkMSwkbG9va2FoZWFkLCRjb21taXRvbmx5LCRsaW5lKTsKKyAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCIkY29kZSIsJGxpbmUpOworICAgICAgICAgICAgICAgICRhZnRlcmVycm9yID0gISRjb21taXRvbmx5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKGRvIHsgJGNvbW1pdG9ubHkgPSAkMTsKKyAgICAgICAgICAgICAgICAgICAgICgkY29kZSkgPSBleHRyYWN0X2JyYWNrZXRlZCgkZ3JhbW1hciwnPCcpOworICAgICAgICAgICAgICAgICAgICAkY29kZSB9KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgkY29kZSA9fiAvXjxbQS1aX10rPiQvKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2Vycm9yKCJUb2tlbiBpdGVtcyBhcmUgbm90IHlldAorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQ6IFwiJGNvZGVcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGluZSk7CisgICAgICAgICAgICAgICAgICAgIF9oaW50KCJJdGVtcyBsaWtlICRjb2RlIHRoYXQgY29uc2lzdCBvZiBhbmdsZQorICAgICAgICAgICAgICAgICAgICBicmFja2V0cyBlbmNsb3NpbmcgYSBzZXF1ZW5jZSBvZgorICAgICAgICAgICAgICAgICAgICB1cHBlcmNhc2UgY2hhcmFjdGVycyB3aWxsIGV2ZW50dWFsbHkKKyAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCB0byBzcGVjaWZ5IHByZS1sZXhlZCB0b2tlbnMKKyAgICAgICAgICAgICAgICAgICAgaW4gYSBncmFtbWFyLiBUaGF0IGZ1bmN0aW9uYWxpdHkgaXMgbm90CisgICAgICAgICAgICAgICAgICAgIHlldCBpbXBsZW1lbnRlZC4gT3IgZGlkIHlvdSBtaXNzcGVsbAorICAgICAgICAgICAgICAgICAgICBcIiRjb2RlXCI/Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9lcnJvcigiVW50cmFuc2xhdGFibGUgaXRlbSBlbmNvdW50ZXJlZDogXCIkY29kZVwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICRsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgX2hpbnQoIkRpZCB5b3UgbWlzc3BlbGwgXCIkY29kZVwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBmb3JnZXQgdG8gY29tbWVudCBpdCBvdXQ/Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRSVUxFL2djbykKKyAgICAgICAgeworICAgICAgICAgICAgX3BhcnNldW5uZWcoImEgcnVsZSBkZWNsYXJhdGlvbiIsIDAsCisgICAgICAgICAgICAgICAgICAgICRsb29rYWhlYWQsJGxpbmUsIHN1YnN0cigkZ3JhbW1hciwgJC1bMF0sICQrWzBdIC0gJC1bMF0pICkgb3IgbmV4dDsKKyAgICAgICAgICAgIG15ICRydWxlbmFtZSA9ICQxOworICAgICAgICAgICAgaWYgKCRydWxlbmFtZSA9fiAvUmVwbGFjZXxFeHRlbmR8UHJlY29tcGlsZXxTYXZlLyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3dhcm4oMiwiUnVsZSBcIiRydWxlbmFtZVwiIGhpZGRlbiBieSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6OiRydWxlbmFtZSIsJGxpbmUpCisgICAgICAgICAgICAgICAgYW5kCisgICAgICAgICAgICAgICAgX2hpbnQoIlRoZSBydWxlIG5hbWVkIFwiJHJ1bGVuYW1lXCIgY2Fubm90IGJlIGRpcmVjdGx5CisgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCB0aHJvdWdoIHRoZSBQYXJzZTo6UmVjRGVzY2VudCBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZ3JhbW1hciAoYWx0aG91Z2ggaXQgbWF5IHN0aWxsCisgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYXMgYSBzdWJydWxlIG9mIG90aGVyIHJ1bGVzKS4KKyAgICAgICAgICAgICAgICAgICAgICAgSXQgY2FuJ3QgYmUgZGlyZWN0bHkgY2FsbGVkIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6OiRydWxlbmFtZSBpcyBhbHJlYWR5IGRlZmluZWQgKGl0CisgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzdGFuZGFyZCBtZXRob2Qgb2YgYWxsCisgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcnMpLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHJ1bGUgPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OlJ1bGUoJHJ1bGVuYW1lLCRzZWxmLCRsaW5lLCRyZXBsYWNlKTsKKyAgICAgICAgICAgICRwcm9kLT5jaGVja19wZW5kaW5nKCRsaW5lKSBpZiAkcHJvZDsKKyAgICAgICAgICAgICRwcm9kID0gJHJ1bGUtPmFkZHByb2QoIG5ldyBQYXJzZTo6UmVjRGVzY2VudDo6UHJvZHVjdGlvbiApOworICAgICAgICAgICAgJGFmdGVyZXJyb3IgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRVTkNPTU1JVFBST0QvZ2NvKQorICAgICAgICB7CisgICAgICAgICAgICBwb3MoJGdyYW1tYXIpLT05OworICAgICAgICAgICAgX3BhcnNldW5uZWcoImEgbmV3ICh1bmNvbW1pdHRlZCkgcHJvZHVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIDAsICRsb29rYWhlYWQsICRsaW5lLCBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKSApIG9yIG5leHQ7CisKKyAgICAgICAgICAgICRwcm9kLT5jaGVja19wZW5kaW5nKCRsaW5lKSBpZiAkcHJvZDsKKyAgICAgICAgICAgICRwcm9kID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpQcm9kdWN0aW9uKCRsaW5lLDEpOworICAgICAgICAgICAgJHJ1bGUgYW5kICRydWxlLT5hZGRwcm9kKCRwcm9kKQorICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCI8dW5jb21taXQ+IiwkbGluZSk7CisgICAgICAgICAgICAkYWZ0ZXJlcnJvciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJEVSUk9SUFJPRC9nY28pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcygkZ3JhbW1hciktPTY7CisgICAgICAgICAgICBfcGFyc2V1bm5lZygiYSBuZXcgKGVycm9yKSBwcm9kdWN0aW9uIiwgJGFmdGVyZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICRsb29rYWhlYWQsJGxpbmUsIHN1YnN0cigkZ3JhbW1hciwgJC1bMF0sICQrWzBdIC0gJC1bMF0pICkgb3IgbmV4dDsKKyAgICAgICAgICAgICRwcm9kLT5jaGVja19wZW5kaW5nKCRsaW5lKSBpZiAkcHJvZDsKKyAgICAgICAgICAgICRwcm9kID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpQcm9kdWN0aW9uKCRsaW5lLDAsMSk7CisgICAgICAgICAgICAkcnVsZSBhbmQgJHJ1bGUtPmFkZHByb2QoJHByb2QpCisgICAgICAgICAgICAgICAgICBvciAgX25vX3J1bGUoIjxlcnJvcj4iLCRsaW5lKTsKKyAgICAgICAgICAgICRhZnRlcmVycm9yID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kUFJPRC9nY28pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYXJzZXVubmVnKCJhIG5ldyBwcm9kdWN0aW9uIiwgMCwKKyAgICAgICAgICAgICAgICAgICAgJGxvb2thaGVhZCwkbGluZSwgc3Vic3RyKCRncmFtbWFyLCAkLVswXSwgJCtbMF0gLSAkLVswXSkgKSBvciBuZXh0OworICAgICAgICAgICAgJHJ1bGUKKyAgICAgICAgICAgICAgYW5kICghJHByb2QgfHwgJHByb2QtPmNoZWNrX3BlbmRpbmcoJGxpbmUpKQorICAgICAgICAgICAgICBhbmQgJHByb2QgPSAkcnVsZS0+YWRkcHJvZChuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OlByb2R1Y3Rpb24oJGxpbmUpKQorICAgICAgICAgICAgb3IgIF9ub19ydWxlKCJwcm9kdWN0aW9uIiwkbGluZSk7CisgICAgICAgICAgICAkYWZ0ZXJlcnJvciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJExJVEVSQUwvZ2NvKQorICAgICAgICB7CisgICAgICAgICAgICBteSAkbGl0ZXJhbCA9ICQxOworICAgICAgICAgICAgKCRjb2RlID0gJGxpdGVyYWwpID1+IHMvXFxcXC9cXC9nOworICAgICAgICAgICAgX3BhcnNlKCJhIGxpdGVyYWwgdGVybWluYWwiLCAkYWZ0ZXJlcnJvciwkbGluZSwkbGl0ZXJhbCk7CisgICAgICAgICAgICAkaXRlbSA9IG5ldyBQYXJzZTo6UmVjRGVzY2VudDo6TGl0ZXJhbCgkY29kZSwkbG9va2FoZWFkLCRsaW5lKTsKKyAgICAgICAgICAgICRwcm9kIGFuZCAkcHJvZC0+YWRkaXRlbSgkaXRlbSkKKyAgICAgICAgICAgICAgICAgIG9yICBfbm9fcnVsZSgibGl0ZXJhbCB0ZXJtaW5hbCIsJGxpbmUsIickbGl0ZXJhbCciKTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kSU5URVJQTElUL2djbykKKyAgICAgICAgeworICAgICAgICAgICAgX3BhcnNlKCJhbiBpbnRlcnBvbGF0ZWQgbGl0ZXJhbCB0ZXJtaW5hbCIsICRhZnRlcmVycm9yLCRsaW5lLCBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKSApOworICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OkludGVycExpdCgkMSwkbG9va2FoZWFkLCRsaW5lKTsKKyAgICAgICAgICAgICRwcm9kIGFuZCAkcHJvZC0+YWRkaXRlbSgkaXRlbSkKKyAgICAgICAgICAgICAgICAgIG9yICBfbm9fcnVsZSgiaW50ZXJwb2xhdGVkIGxpdGVyYWwgdGVybWluYWwiLCRsaW5lLCInJDEnIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJFRPS0VOL2djbykKKyAgICAgICAgeworICAgICAgICAgICAgX3BhcnNlKCJhIC8uLi8gcGF0dGVybiB0ZXJtaW5hbCIsICRhZnRlcmVycm9yLCRsaW5lLCBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKSApOworICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OlRva2VuKCQxLCcvJywkMz8kMzonJywkbG9va2FoZWFkLCRsaW5lKTsKKyAgICAgICAgICAgICRwcm9kIGFuZCAkcHJvZC0+YWRkaXRlbSgkaXRlbSkKKyAgICAgICAgICAgICAgICAgIG9yICBfbm9fcnVsZSgicGF0dGVybiB0ZXJtaW5hbCIsJGxpbmUsIi8kMS8iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8oPz0kTVRPS0VOKS9nY28KKyAgICAgICAgICAgIGFuZCBkbyB7ICgkY29kZSwgdW5kZWYsIEBjb21wb25lbnRzKQorICAgICAgICAgICAgICAgICAgICA9IGV4dHJhY3RfcXVvdGVsaWtlKCRncmFtbWFyKTsKKyAgICAgICAgICAgICAgICAgJGNvZGUgfQorICAgICAgICAgICAgICApCisKKyAgICAgICAgeworICAgICAgICAgICAgX3BhcnNlKCJhbiBtLy4uLyBwYXR0ZXJuIHRlcm1pbmFsIiwgJGFmdGVyZXJyb3IsJGxpbmUsJGNvZGUpOworICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OlRva2VuKEBjb21wb25lbnRzWzMsMiw4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb29rYWhlYWQsJGxpbmUpOworICAgICAgICAgICAgJHByb2QgYW5kICRwcm9kLT5hZGRpdGVtKCRpdGVtKQorICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCJwYXR0ZXJuIHRlcm1pbmFsIiwkbGluZSwkY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vKD89JE1BVENIUlVMRSkvZ2NvCisgICAgICAgICAgICAgICAgYW5kIGRvIHsgKCRjb2RlKSA9IGV4dHJhY3RfYnJhY2tldGVkKCRncmFtbWFyLCc8Jyk7CisgICAgICAgICAgICAgICAgICAgICAkY29kZQorICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBvciAkZ3JhbW1hciA9fiBtLyRTVUJSVUxFL2djbworICAgICAgICAgICAgICAgIGFuZCAkY29kZSA9ICQxKQorICAgICAgICB7CisgICAgICAgICAgICBteSAkbmFtZSA9ICRjb2RlOworICAgICAgICAgICAgbXkgJG1hdGNocnVsZSA9IDA7CisgICAgICAgICAgICBpZiAoc3Vic3RyKCRuYW1lLDAsMSkgZXEgJzwnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRuYW1lID1+IHMvJE1BVENIUlVMRVxzKi8vOworICAgICAgICAgICAgICAgICRuYW1lID1+IHMvXHMqPlxaLy87CisgICAgICAgICAgICAgICAgJG1hdGNocnVsZSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIyBFWFRSQUNUIFRSQUlMSU5HIEFSRyBMSVNUIChJRiBBTlkpCisKKyAgICAgICAgICAgIG15ICgkYXJnY29kZSkgPSBleHRyYWN0X2NvZGVibG9jaygkZ3JhbW1hciwgIltdIiwnJykgfHwgJyc7CisKKyAgICAgICAgIyBFWFRSQUNUIFRSQUlMSU5HIFJFUEVUSVRJT04gU1BFQ0lGSUVSIChJRiBBTlkpCisKKyAgICAgICAgICAgIGlmICgkZ3JhbW1hciA9fiBtL1xHWyhdL2djKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcygkZ3JhbW1hciktLTsKKworICAgICAgICAgICAgICAgIGlmICgkZ3JhbW1hciA9fiBtLyRPUFRJT05BTC9nY28pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcGFyc2UoImFuIHplcm8tb3Itb25lIHN1YnJ1bGUgbWF0Y2giLCAkYWZ0ZXJlcnJvciwkbGluZSwiJGNvZGUkYXJnY29kZSgkMSkiKTsKKyAgICAgICAgICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OlJlcGV0aXRpb24oJG5hbWUsJDEsMCwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxvb2thaGVhZCwkbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1hdGNocnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhcmdjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgJHByb2QgYW5kICRwcm9kLT5hZGRpdGVtKCRpdGVtKQorICAgICAgICAgICAgICAgICAgICAgICAgICBvciAgX25vX3J1bGUoInJlcGV0aXRpb24iLCRsaW5lLCIkY29kZSRhcmdjb2RlKCQxKSIpOworCisgICAgICAgICAgICAgICAgICAgICEkbWF0Y2hydWxlIGFuZCAkcnVsZSBhbmQgJHJ1bGUtPmFkZGNhbGwoJG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kQU5ZL2djbykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9wYXJzZSgiYSB6ZXJvLW9yLW1vcmUgc3VicnVsZSBtYXRjaCIsICRhZnRlcmVycm9yLCRsaW5lLCIkY29kZSRhcmdjb2RlKCQxKSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoJDIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICRwb3MgPSBwb3MgJGdyYW1tYXI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoJGdyYW1tYXIsJHBvcywwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8bGVmdG9wPSckbmFtZShzPyknOiAkbmFtZSAkMiAkbmFtZT4ocz8pICIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgJGdyYW1tYXIgPSAkcG9zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OlJlcGV0aXRpb24oJG5hbWUsJDEsMCwkTUFYUkVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb29rYWhlYWQsJGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1hdGNocnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXJnY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAgX25vX3J1bGUoInJlcGV0aXRpb24iLCRsaW5lLCIkY29kZSRhcmdjb2RlKCQxKSIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAhJG1hdGNocnVsZSBhbmQgJHJ1bGUgYW5kICRydWxlLT5hZGRjYWxsKCRuYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgX2NoZWNrX2luc2F0aWFibGUoJG5hbWUsJDEsJGdyYW1tYXIsJGxpbmUpIGlmICQ6OlJEX0NIRUNLOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRNQU5ZL2djbykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9wYXJzZSgiYSBvbmUtb3ItbW9yZSBzdWJydWxlIG1hdGNoIiwgJGFmdGVyZXJyb3IsJGxpbmUsIiRjb2RlJGFyZ2NvZGUoJDEpIik7CisgICAgICAgICAgICAgICAgICAgIGlmICgkMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIyAkREI6OnNpbmdsZT0xOworICAgICAgICAgICAgICAgICAgICAgICAgbXkgJHBvcyA9IHBvcyAkZ3JhbW1hcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cigkZ3JhbW1hciwkcG9zLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxsZWZ0b3A9JyRuYW1lKHMpJzogJG5hbWUgJDIgJG5hbWU+ICIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgJGdyYW1tYXIgPSAkcG9zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OlJlcGV0aXRpb24oJG5hbWUsJDEsMSwkTUFYUkVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb29rYWhlYWQsJGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1hdGNocnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXJnY29kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICRwcm9kIGFuZCAkcHJvZC0+YWRkaXRlbSgkaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICBfbm9fcnVsZSgicmVwZXRpdGlvbiIsJGxpbmUsIiRjb2RlJGFyZ2NvZGUoJDEpIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICEkbWF0Y2hydWxlIGFuZCAkcnVsZSBhbmQgJHJ1bGUtPmFkZGNhbGwoJG5hbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBfY2hlY2tfaW5zYXRpYWJsZSgkbmFtZSwkMSwkZ3JhbW1hciwkbGluZSkgaWYgJDo6UkRfQ0hFQ0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJEVYQUNUTFkvZ2NvKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3BhcnNlKCJhbiBleGFjdGx5LSQxLXRpbWVzIHN1YnJ1bGUgbWF0Y2giLCAkYWZ0ZXJlcnJvciwkbGluZSwiJGNvZGUkYXJnY29kZSgkMSkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCQyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBteSAkcG9zID0gcG9zICRncmFtbWFyOworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCRncmFtbWFyLCRwb3MsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGxlZnRvcD0nJG5hbWUoJDEpJzogJG5hbWUgJDIgJG5hbWU+KCQxKSAiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcG9zICRncmFtbWFyID0gJHBvczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpSZXBldGl0aW9uKCRuYW1lLCQxLCQxLCQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb29rYWhlYWQsJGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1hdGNocnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXJnY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAgX25vX3J1bGUoInJlcGV0aXRpb24iLCRsaW5lLCIkY29kZSRhcmdjb2RlKCQxKSIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAhJG1hdGNocnVsZSBhbmQgJHJ1bGUgYW5kICRydWxlLT5hZGRjYWxsKCRuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kQkVUV0VFTi9nY28pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcGFyc2UoImEgJDEtdG8tJDIgc3VicnVsZSBtYXRjaCIsICRhZnRlcmVycm9yLCRsaW5lLCIkY29kZSRhcmdjb2RlKCQxLi4kMikiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCQzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBteSAkcG9zID0gcG9zICRncmFtbWFyOworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCRncmFtbWFyLCRwb3MsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGxlZnRvcD0nJG5hbWUoJDEuLiQyKSc6ICRuYW1lICQzICRuYW1lPigkMS4uJDIpICIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgJGdyYW1tYXIgPSAkcG9zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OlJlcGV0aXRpb24oJG5hbWUsIiQxLi4kMiIsJDEsJDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxvb2thaGVhZCwkbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWF0Y2hydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhcmdjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRwcm9kIGFuZCAkcHJvZC0+YWRkaXRlbSgkaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICBfbm9fcnVsZSgicmVwZXRpdGlvbiIsJGxpbmUsIiRjb2RlJGFyZ2NvZGUoJDEuLiQyKSIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAhJG1hdGNocnVsZSBhbmQgJHJ1bGUgYW5kICRydWxlLT5hZGRjYWxsKCRuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoJGdyYW1tYXIgPX4gbS8kQVRMRUFTVC9nY28pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcGFyc2UoImEgJDEtb3ItbW9yZSBzdWJydWxlIG1hdGNoIiwgJGFmdGVyZXJyb3IsJGxpbmUsIiRjb2RlJGFyZ2NvZGUoJDEuLikiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCQyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBteSAkcG9zID0gcG9zICRncmFtbWFyOworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCRncmFtbWFyLCRwb3MsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGxlZnRvcD0nJG5hbWUoJDEuLiknOiAkbmFtZSAkMiAkbmFtZT4oJDEuLikgIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyAkZ3JhbW1hciA9ICRwb3M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbSA9IG5ldyBQYXJzZTo6UmVjRGVzY2VudDo6UmVwZXRpdGlvbigkbmFtZSwiJDEuLiIsJDEsJE1BWFJFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9va2FoZWFkLCRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXRjaHJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFyZ2NvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgJHByb2QgYW5kICRwcm9kLT5hZGRpdGVtKCRpdGVtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCJyZXBldGl0aW9uIiwkbGluZSwiJGNvZGUkYXJnY29kZSgkMS4uKSIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAhJG1hdGNocnVsZSBhbmQgJHJ1bGUgYW5kICRydWxlLT5hZGRjYWxsKCRuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jaGVja19pbnNhdGlhYmxlKCRuYW1lLCIkMS4uIiwkZ3JhbW1hciwkbGluZSkgaWYgJDo6UkRfQ0hFQ0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCRncmFtbWFyID1+IG0vJEFUTU9TVC9nY28pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcGFyc2UoImEgb25lLXRvLSQxIHN1YnJ1bGUgbWF0Y2giLCAkYWZ0ZXJlcnJvciwkbGluZSwiJGNvZGUkYXJnY29kZSguLiQxKSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoJDIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICRwb3MgPSBwb3MgJGdyYW1tYXI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoJGdyYW1tYXIsJHBvcywwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8bGVmdG9wPSckbmFtZSguLiQxKSc6ICRuYW1lICQyICRuYW1lPiguLiQxKSAiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcG9zICRncmFtbWFyID0gJHBvczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50OjpSZXBldGl0aW9uKCRuYW1lLCIuLiQxIiwxLCQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsb29rYWhlYWQsJGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1hdGNocnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXJnY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAgX25vX3J1bGUoInJlcGV0aXRpb24iLCRsaW5lLCIkY29kZSRhcmdjb2RlKC4uJDEpIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICEkbWF0Y2hydWxlIGFuZCAkcnVsZSBhbmQgJHJ1bGUtPmFkZGNhbGwoJG5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRCQURSRVAvZ2NvKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGN1cnJlbnRfbWF0Y2ggPSBzdWJzdHIoJGdyYW1tYXIsICQtWzBdLCAkK1swXSAtICQtWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgX3BhcnNlKCJhbiBzdWJydWxlIG1hdGNoIHdpdGggaW52YWxpZCByZXBldGl0aW9uIHNwZWNpZmllciIsIDAsJGxpbmUsICRjdXJyZW50X21hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgX2Vycm9yKCJJbmNvcnJlY3Qgc3BlY2lmaWNhdGlvbiBvZiBhIHJlcGVhdGVkIHN1YnJ1bGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUpOworICAgICAgICAgICAgICAgICAgICBfaGludCgiUmVwZWF0ZWQgc3VicnVsZXMgbGlrZSBcIiRjb2RlJGFyZ2NvZGUkY3VycmVudF9tYXRjaFwiIGNhbm5vdCBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG1heGltdW0gcmVwZXRpdGlvbiBvZiB6ZXJvLCBub3IgY2FuIHRoZXkgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgY29tcG9uZW50cyBpbiB0aGVpciByYW5nZXMuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXJzZSgiYSBzdWJydWxlIG1hdGNoIiwgJGFmdGVyZXJyb3IsJGxpbmUsJGNvZGUpOworICAgICAgICAgICAgICAgIG15ICRkZXNjOworICAgICAgICAgICAgICAgIGlmICgkbmFtZT1+L1xBX2FsdGVybmF0aW9uX1xkK19vZl9wcm9kdWN0aW9uX1xkK19vZl9ydWxlLykKKyAgICAgICAgICAgICAgICAgICAgeyAkZGVzYyA9ICRzZWxmLT57InJ1bGVzIn17JG5hbWV9LT5leHBlY3RlZCB9CisgICAgICAgICAgICAgICAgJGl0ZW0gPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQ6OlN1YnJ1bGUoJG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbG9va2FoZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXRjaHJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXJnY29kZSk7CisKKyAgICAgICAgICAgICAgICAkcHJvZCBhbmQgJHByb2QtPmFkZGl0ZW0oJGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgb3IgIF9ub19ydWxlKCIoc3ViKXJ1bGUiLCRsaW5lLCRuYW1lKTsKKworICAgICAgICAgICAgICAgICEkbWF0Y2hydWxlIGFuZCAkcnVsZSBhbmQgJHJ1bGUtPmFkZGNhbGwoJG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRMT05FQ09MT04vZ2NvICAgKQorICAgICAgICB7CisgICAgICAgICAgICBfZXJyb3IoIlVuZXhwZWN0ZWQgY29sb24gZW5jb3VudGVyZWQiLCAkbGluZSk7CisgICAgICAgICAgICBfaGludCgiRGlkIHlvdSBtZWFuIFwifFwiICh0byBzdGFydCBhIG5ldyBwcm9kdWN0aW9uKT8KKyAgICAgICAgICAgICAgICAgICBPciBwZXJoYXBzIHlvdSBmb3Jnb3QgdGhhdCB0aGUgY29sb24KKyAgICAgICAgICAgICAgICAgICBpbiBhIHJ1bGUgZGVmaW5pdGlvbiBtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgcnVsZSBuYW1lPyIpOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRBQ1RJT04vZ2NvICAgKSAjIEJBRCBBQ1RJT04sIEFMUkVBRFkgRkFJTEVECisgICAgICAgIHsKKyAgICAgICAgICAgIF9lcnJvcigiTWFsZm9ybWVkIGFjdGlvbiBlbmNvdW50ZXJlZCIsCisgICAgICAgICAgICAgICAgICAgJGxpbmUpOworICAgICAgICAgICAgX2hpbnQoIkRpZCB5b3UgZm9yZ2V0IHRoZSBjbG9zaW5nIGN1cmx5IGJyYWNrZXQKKyAgICAgICAgICAgICAgICAgICBvciBpcyB0aGVyZSBhIHN5bnRheCBlcnJvciBpbiB0aGUgYWN0aW9uPyIpOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkZ3JhbW1hciA9fiBtLyRPVEhFUi9nY28gICApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9lcnJvcigiVW50cmFuc2xhdGFibGUgaXRlbSBlbmNvdW50ZXJlZDogXCIkMVwiIiwKKyAgICAgICAgICAgICAgICAgICAkbGluZSk7CisgICAgICAgICAgICBfaGludCgiRGlkIHlvdSBtaXNzcGVsbCBcIiQxXCIKKyAgICAgICAgICAgICAgICAgICBvciBmb3JnZXQgdG8gY29tbWVudCBpdCBvdXQ/Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJGxvb2thaGVhZHNwZWMgPX4gdHIgLy4vLi8gPiAzKQorICAgICAgICB7CisgICAgICAgICAgICAkbG9va2FoZWFkc3BlYyA9fiBzL1xBXHMrLy87CisgICAgICAgICAgICAkbG9va2FoZWFkID0gJGxvb2thaGVhZDwwCisgICAgICAgICAgICAgICAgICAgID8gJ2EgbmVnYXRpdmUgbG9va2FoZWFkICgiLi4uISIpJworICAgICAgICAgICAgICAgICAgICA6ICdhIHBvc2l0aXZlIGxvb2thaGVhZCAoIi4uLiIpJyA7CisgICAgICAgICAgICBfd2FybigxLCJGb3VuZCB0d28gb3IgbW9yZSBsb29rYWhlYWQgc3BlY2lmaWVycyBpbiBhCisgICAgICAgICAgICAgICAgICAgcm93LiIsJGxpbmUpCisgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgIF9oaW50KCJNdWx0aXBsZSBwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUgbG9va2FoZWFkcworICAgICAgICAgICAgICAgICAgIGFyZSBzaW1wbHkgbXVsdGlwbGllZCB0b2dldGhlciB0byBwcm9kdWNlIGEKKyAgICAgICAgICAgICAgICAgICBzaW5nbGUgcG9zaXRpdmUgb3IgbmVnYXRpdmUgbG9va2FoZWFkCisgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi4gSW4gdGhpcyBjYXNlIHRoZSBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgIFwiJGxvb2thaGVhZHNwZWNcIiB3YXMgcmVkdWNlZCB0byAkbG9va2FoZWFkLgorICAgICAgICAgICAgICAgICAgIFdhcyB0aGlzIHlvdXIgaW50ZW50aW9uPyIpOworICAgICAgICB9CisgICAgICAgICRsb29rYWhlYWQgPSAwOworICAgICAgICAkbG9va2FoZWFkc3BlYyA9ICIiOworCisgICAgICAgICRncmFtbWFyID1+IG0vXEdccysvZ2M7CisgICAgfQorCisgICAgaWYgKCRtdXN0X3BvcF9saW5lcykgeworICAgICAgICBwb3AgQGxpbmVzOworICAgIH0KKworICAgIHVubGVzcyAoJEVSUk9SUyBvciAkaXNpbXBsaWNpdCBvciAhJDo6UkRfQ0hFQ0spCisgICAgeworICAgICAgICAkc2VsZi0+X2NoZWNrX2dyYW1tYXIoKTsKKyAgICB9CisKKyAgICB1bmxlc3MgKCRFUlJPUlMgb3IgJGlzaW1wbGljaXQgb3IgJFBhcnNlOjpSZWNEZXNjZW50Ojpjb21waWxpbmcpCisgICAgeworICAgICAgICBteSAkY29kZSA9ICRzZWxmLT5fY29kZSgpOworICAgICAgICBpZiAoZGVmaW5lZCAkOjpSRF9UUkFDRSkKKyAgICAgICAgeworICAgICAgICAgICAgbXkgJG1vZGUgPSAoJG5leHRuYW1lc3BhY2UgZXEgIm5hbWVzcGFjZTAwMDAwMiIpID8gJz4nIDogJz4+JzsKKyAgICAgICAgICAgIHByaW50IFNUREVSUiAicHJpbnRpbmcgY29kZSAoIiwgbGVuZ3RoKCRjb2RlKSwiKSB0byBSRF9UUkFDRVxuIjsKKyAgICAgICAgICAgIGxvY2FsICpUUkFDRV9GSUxFOworICAgICAgICAgICAgb3BlbiBUUkFDRV9GSUxFLCAkbW9kZSwgIlJEX1RSQUNFIgorICAgICAgICAgICAgYW5kIHByaW50IFRSQUNFX0ZJTEUgIm15IFwkRVJST1JTO1xuJGNvZGUiCisgICAgICAgICAgICBhbmQgY2xvc2UgVFJBQ0VfRklMRTsKKyAgICAgICAgfQorCisgICAgICAgIHVubGVzcyAoIGV2YWwgIiRjb2RlIDEiICkKKyAgICAgICAgeworICAgICAgICAgICAgX2Vycm9yKCJJbnRlcm5hbCBlcnJvciBpbiBnZW5lcmF0ZWQgcGFyc2VyIGNvZGUhIik7CisgICAgICAgICAgICAkQCA9fiBzL2F0IGdyYW1tYXIvaW4gZ3JhbW1hciBhdC87CisgICAgICAgICAgICBfaGludCgkQCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoJEVSUk9SUyBhbmQgIV92ZXJib3NpdHkoIkhJTlQiKSkKKyAgICB7CisgICAgICAgIGxvY2FsICQ6OlJEX0hJTlQgPSBkZWZpbmVkICQ6OlJEX0hJTlQgPyAkOjpSRF9ISU5UIDogMTsKKyAgICAgICAgX2hpbnQoJ1NldCAkOjpSRF9ISU5UIChvciAtUkRfSElOVCBpZiB5b3VcJ3JlIHVzaW5nICJwZXJsIC1zIikKKyAgICAgICAgICAgICAgIGZvciBoaW50cyBvbiBmaXhpbmcgdGhlc2UgcHJvYmxlbXMuICBVc2UgJDo6UkRfSElOVCA9IDAKKyAgICAgICAgICAgICAgIHRvIGRpc2FibGUgdGhpcyBtZXNzYWdlLicpOworICAgIH0KKyAgICBpZiAoJEVSUk9SUykgeyAkRVJST1JTPTA7IHJldHVybiB9CisgICAgcmV0dXJuICRzZWxmOworfQorCisKK3N1YiBfYWRkc3RhcnRjb2RlKCQkKQoreworICAgIG15ICgkc2VsZiwgJGNvZGUpID0gQF87CisgICAgJGNvZGUgPX4gcy9cQVxzKlx7KC4qKVx9XFovJDEvczsKKworICAgICRzZWxmLT57InN0YXJ0Y29kZSJ9IC49ICIkY29kZTtcbiI7Cit9CisKKyMgQ0hFQ0sgRk9SIEdSQU1NQVIgUFJPQkxFTVMuLi4uCisKK3N1YiBfY2hlY2tfaW5zYXRpYWJsZSgkJCQkKQoreworICAgIG15ICgkc3VicnVsZSwkcmVwc3BlYywkZ3JhbW1hciwkbGluZSkgPSBAXzsKKyAgICBwb3MoJGdyYW1tYXIpPXBvcygkX1syXSk7CisgICAgcmV0dXJuIGlmICRncmFtbWFyID1+IG0vJE9QVElPTkFML2djbyB8fCAkZ3JhbW1hciA9fiBtLyRBTlkvZ2NvOworICAgIG15ICRtaW4gPSAxOworICAgIGlmICggJGdyYW1tYXIgPX4gbS8kTUFOWS9nY28KKyAgICAgIHx8ICRncmFtbWFyID1+IG0vJEVYQUNUTFkvZ2NvCisgICAgICB8fCAkZ3JhbW1hciA9fiBtLyRBVE1PU1QvZ2NvCisgICAgICB8fCAkZ3JhbW1hciA9fiBtLyRCRVRXRUVOL2djbyAmJiBkbyB7ICRtaW49JDI7IDEgfQorICAgICAgfHwgJGdyYW1tYXIgPX4gbS8kQVRMRUFTVC9nY28gJiYgZG8geyAkbWluPSQyOyAxIH0KKyAgICAgIHx8ICRncmFtbWFyID1+IG0vJFNVQlJVTEUoPyFccyo6KS9nY28KKyAgICAgICApCisgICAgeworICAgICAgICByZXR1cm4gdW5sZXNzICQxIGVxICRzdWJydWxlICYmICRtaW4gPiAwOworICAgICAgICBteSAkY3VycmVudF9tYXRjaCA9IHN1YnN0cigkZ3JhbW1hciwgJC1bMF0sICQrWzBdIC0gJC1bMF0pOworICAgICAgICBfd2FybigzLCJTdWJydWxlIHNlcXVlbmNlIFwiJHN1YnJ1bGUoJHJlcHNwZWMpICRjdXJyZW50X21hdGNoXCIgd2lsbAorICAgICAgICAgICAgICAgKGFsbW9zdCBjZXJ0YWlubHkpIGZhaWwuIiwkbGluZSkKKyAgICAgICAgYW5kCisgICAgICAgIF9oaW50KCJVbmxlc3Mgc3VicnVsZSBcIiRzdWJydWxlXCIgcGVyZm9ybXMgc29tZSBjdW5uaW5nCisgICAgICAgICAgICAgICBsb29rYWhlYWQsIHRoZSByZXBldGl0aW9uIFwiJHN1YnJ1bGUoJHJlcHNwZWMpXCIgd2lsbAorICAgICAgICAgICAgICAgaW5zYXRpYWJseSBjb25zdW1lIGFzIG1hbnkgbWF0Y2hlcyBvZiBcIiRzdWJydWxlXCIgYXMgaXQKKyAgICAgICAgICAgICAgIGNhbiwgbGVhdmluZyBub25lIHRvIG1hdGNoIHRoZSBcIiRjdXJyZW50X21hdGNoXCIgdGhhdCBmb2xsb3dzLiIpOworICAgIH0KK30KKworc3ViIF9jaGVja19ncmFtbWFyICgkKQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHJ1bGVzID0gJHNlbGYtPnsicnVsZXMifTsKKyAgICBteSAkcnVsZTsKKyAgICBmb3JlYWNoICRydWxlICggdmFsdWVzICUkcnVsZXMgKQorICAgIHsKKyAgICAgICAgbmV4dCBpZiAhICRydWxlLT57ImNoYW5nZWQifTsKKworICAgICMgQ0hFQ0sgRk9SIFVOREVGSU5FRCBSVUxFUworCisgICAgICAgIG15ICRjYWxsOworICAgICAgICBmb3JlYWNoICRjYWxsICggQHskcnVsZS0+eyJjYWxscyJ9fSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghZGVmaW5lZCAkeyRydWxlc317JGNhbGx9CisgICAgICAgICAgICAgICYmIWRlZmluZWQgJnsiUGFyc2U6OlJlY0Rlc2NlbnQ6OiRjYWxsIn0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkICQ6OlJEX0FVVE9TVFVCKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3dhcm4oMywiVW5kZWZpbmVkIChzdWIpcnVsZSBcIiRjYWxsXCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBhIHByb2R1Y3Rpb24uIikKKyAgICAgICAgICAgICAgICAgICAgYW5kCisgICAgICAgICAgICAgICAgICAgIF9oaW50KCJXaWxsIHlvdSBiZSBwcm92aWRpbmcgdGhpcyBydWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlciwgb3IgZGlkIHlvdSBwZXJoYXBzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzcGVsbCBcIiRjYWxsXCI/IE90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW1lZGlhdGUgPHJlamVjdD4uIik7CisgICAgICAgICAgICAgICAgICAgIGV2YWwgInN1YiAkc2VsZi0+e25hbWVzcGFjZX06OiRjYWxsIHt1bmRlZn0iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgICMgRVhQRVJJTUVOVEFMCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBteSAkcnVsZSA9IHFxeyckY2FsbCd9OworICAgICAgICAgICAgICAgICAgICBpZiAoJDo6UkRfQVVUT1NUVUIgYW5kICQ6OlJEX0FVVE9TVFVCIG5lICIxIikgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJ1bGUgPSAkOjpSRF9BVVRPU1RVQjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfd2FybigxLCJBdXRvZ2VuZXJhdGluZyBydWxlOiAkY2FsbCIpCisgICAgICAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgICAgICAgICBfaGludCgiQSBjYWxsIHdhcyBtYWRlIHRvIGEgc3VicnVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWQgXCIkY2FsbFwiLCBidXQgbm8gc3VjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZSB3YXMgc3BlY2lmaWVkLiBIb3dldmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luY2UgXCQ6OlJEX0FVVE9TVFVCCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgZGVmaW5lZCwgYSBydWxlIHN0dWIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgkY2FsbCA6ICRydWxlKSB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4iKTsKKworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X2dlbmVyYXRlKCIkY2FsbDogJHJ1bGUiLDAsMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAjIENIRUNLIEZPUiBMRUZUIFJFQ1VSU0lPTgorCisgICAgICAgIGlmICgkcnVsZS0+aXNsZWZ0cmVjKCRydWxlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9lcnJvcigiUnVsZSBcIiRydWxlLT57bmFtZX1cIiBpcyBsZWZ0LXJlY3Vyc2l2ZS4iKTsKKyAgICAgICAgICAgIF9oaW50KCJSZWRlc2lnbiB0aGUgZ3JhbW1hciBzbyBpdCdzIG5vdCBsZWZ0LXJlY3Vyc2l2ZS4KKyAgICAgICAgICAgICAgICAgICBUaGF0IHdpbGwgcHJvYmFibHkgbWVhbiB5b3UgbmVlZCB0byByZS1pbXBsZW1lbnQKKyAgICAgICAgICAgICAgICAgICByZXBldGl0aW9ucyB1c2luZyB0aGUgJyhzKScgbm90YXRpb24uCisgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGU6IFwiJHJ1bGUtPntuYW1lfShzKVwiLiIpOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgIyBDSEVDSyBGT1IgUFJPRFVDVElPTlMgRk9MTE9XSU5HIEVNUFRZIFBST0RVQ1RJT05TCisgICAgICB7CisgICAgICAgICAgbXkgJGhhc2VtcHR5OworICAgICAgICAgIG15ICRwcm9kOworICAgICAgICAgIGZvcmVhY2ggJHByb2QgKCBAeyRydWxlLT57InByb2RzIn19ICkgeworICAgICAgICAgICAgICBpZiAoJGhhc2VtcHR5KSB7CisgICAgICAgICAgICAgICAgICBfZXJyb3IoIlByb2R1Y3Rpb24gIiAuICRwcm9kLT5kZXNjcmliZSAuICIgZm9yIFwiJHJ1bGUtPntuYW1lfVwiCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBuZXZlciBiZSByZWFjaGVkIChwcmVjZWRpbmcgZW1wdHkgcHJvZHVjdGlvbiB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWx3YXlzIG1hdGNoIGZpcnN0KS4iKTsKKyAgICAgICAgICAgICAgICAgIF9oaW50KCJSZW9yZGVyIHRoZSBncmFtbWFyIHNvIHRoYXQgdGhlIGVtcHR5IHByb2R1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBsYXN0IGluIHRoZSBsaXN0IG9yIHByb2R1Y3Rpb25zLiIpOworICAgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAkaGFzZW1wdHkgfHw9ICRwcm9kLT5pc2VtcHR5KCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgIH0KK30KKworIyBHRU5FUkFURSBBQ1RVQUwgUEFSU0VSIENPREUKKworc3ViIF9jb2RlKCQpCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaW5pdGlhbF9za2lwID0gZGVmaW5lZCgkc2VsZi0+e3NraXB9KSA/ICRzZWxmLT57c2tpcH0gOiAkc2tpcDsKKworICAgIG15ICRjb2RlID0gcXF7CitwYWNrYWdlICRzZWxmLT57bmFtZXNwYWNlfTsKK3VzZSBzdHJpY3Q7Cit1c2UgdmFycyBxdyhcJHNraXAgXCRBVVRPTE9BRCAkc2VsZi0+e2xvY2FsdmFyc30gKTsKK1xAJHNlbGYtPntuYW1lc3BhY2V9XDo6SVNBID0gKCk7CitcJHNraXAgPSAnJGluaXRpYWxfc2tpcCc7Ciskc2VsZi0+e3N0YXJ0Y29kZX0KKworeworbG9jYWwgXCRTSUd7X19XQVJOX199ID0gc3ViIHswfTsKKyMgUFJFVEVORCBUTyBCRSBJTiBQYXJzZTo6UmVjRGVzY2VudCBOQU1FU1BBQ0UKKyokc2VsZi0+e25hbWVzcGFjZX06OkFVVE9MT0FEICAgPSBzdWIKK3sKKyAgICBubyBzdHJpY3QgJ3JlZnMnOworICAgIFwkQVVUT0xPQUQgPX4gcy9eJHNlbGYtPntuYW1lc3BhY2V9L1BhcnNlOjpSZWNEZXNjZW50LzsKKyAgICBnb3RvICZ7XCRBVVRPTE9BRH07Cit9Cit9CisKK307CisgICAgJGNvZGUgLj0gInB1c2ggXEAkc2VsZi0+e25hbWVzcGFjZX1cOjpJU0EsICdQYXJzZTo6UmVjRGVzY2VudCc7IjsKKyAgICAkc2VsZi0+eyJzdGFydGNvZGUifSA9ICcnOworCisgICAgbXkgJHJ1bGU7CisgICAgZm9yZWFjaCAkcnVsZSAoIHZhbHVlcyAleyRzZWxmLT57InJ1bGVzIn19ICkKKyAgICB7CisgICAgICAgIGlmICgkcnVsZS0+eyJjaGFuZ2VkIn0pCisgICAgICAgIHsKKyAgICAgICAgICAgICRjb2RlIC49ICRydWxlLT5jb2RlKCRzZWxmLT57Im5hbWVzcGFjZSJ9LCRzZWxmKTsKKyAgICAgICAgICAgICRydWxlLT57ImNoYW5nZWQifSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gJGNvZGU7Cit9CisKKworIyBFWEVDVVRJTkcgQSBQQVJTRS4uLi4KKworc3ViIEFVVE9MT0FEICAgICMgKCRwYXJzZXIsICR0ZXh0OyAkbGluZW51bSwgQGFyZ3MpCit7CisgICAgY3JvYWsgIkNvdWxkIG5vdCBmaW5kIG1ldGhvZDogJEFVVE9MT0FEXG4iIHVubGVzcyByZWYgJF9bMF07CisgICAgbXkgJGNsYXNzID0gcmVmKCRfWzBdKSB8fCAkX1swXTsKKyAgICBteSAkdGV4dCA9IHJlZigkX1sxXSkgZXEgJ1NDQUxBUicgPyAkeyRfWzFdfSA6ICIkX1sxXSI7CisgICAgJF9bMF0tPntsYXN0bGluZW51bX0gPSAkX1syXXx8X2xpbmVjb3VudCgkX1sxXSk7CisgICAgJF9bMF0tPntsYXN0bGluZW51bX0gPSBfbGluZWNvdW50KCRfWzFdKTsKKyAgICAkX1swXS0+e2xhc3RsaW5lbnVtfSArPSAoJF9bMl18fDApIGlmIEBfID4gMjsKKyAgICAkX1swXS0+e29mZnNldGxpbmVudW19ID0gJF9bMF0tPntsYXN0bGluZW51bX07CisgICAgJF9bMF0tPntmdWxsdGV4dH0gPSAkdGV4dDsKKyAgICAkX1swXS0+e2Z1bGx0ZXh0bGVufSA9IGxlbmd0aCAkdGV4dDsKKyAgICAkX1swXS0+e2xpbmVjb3VudGVyX2NhY2hlfSA9IHt9OworICAgICRfWzBdLT57ZGVmZXJyZWR9ID0gW107CisgICAgJF9bMF0tPntlcnJvcnN9ID0gW107CisgICAgbXkgQGFyZ3MgPSBAX1szLi4kI19dOworICAgIG15ICRhcmdzID0gc3ViIHsgWyBAYXJncyBdIH07CisKKyAgICAkQVVUT0xPQUQgPX4gcy8kY2xhc3MvJF9bMF0tPntuYW1lc3BhY2V9LzsKKyAgICBubyBzdHJpY3QgInJlZnMiOworCisgICAgbG9jYWwgJDo6UkRfV0FSTiAgPSAkOjpSRF9XQVJOICB8fCAkX1swXS0+e19fV0FSTl9ffTsKKyAgICBsb2NhbCAkOjpSRF9ISU5UICA9ICQ6OlJEX0hJTlQgIHx8ICRfWzBdLT57X19ISU5UX199OworICAgIGxvY2FsICQ6OlJEX1RSQUNFID0gJDo6UkRfVFJBQ0UgfHwgJF9bMF0tPntfX1RSQUNFX199OworCisgICAgY3JvYWsgIlVua25vd24gc3RhcnRpbmcgcnVsZSAoJEFVVE9MT0FEKSBjYWxsZWRcbiIKKyAgICAgICAgdW5sZXNzIGRlZmluZWQgJiRBVVRPTE9BRDsKKyAgICBteSAkcmV0dmFsID0gJnskQVVUT0xPQUR9KCRfWzBdLCR0ZXh0LHVuZGVmLHVuZGVmLHVuZGVmLCRhcmdzKTsKKworICAgIGlmIChkZWZpbmVkICRyZXR2YWwpCisgICAgeworICAgICAgICBmb3JlYWNoICggQHskX1swXS0+e2RlZmVycmVkfX0gKSB7ICYkXzsgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3JlYWNoICggQHskX1swXS0+e2Vycm9yc319ICkgeyBfZXJyb3IoQCRfKTsgfQorICAgIH0KKworICAgIGlmIChyZWYgJF9bMV0gZXEgJ1NDQUxBUicpIHsgJHskX1sxXX0gPSAkdGV4dCB9CisKKyAgICAkRVJST1JTID0gMDsKKyAgICByZXR1cm4gJHJldHZhbDsKK30KKworc3ViIF9wYXJzZXJlcGVhdCgkJCQkJCQkJCQpICAgICMgUkVUVVJOUyBBIFJFRiBUTyBBTiBBUlJBWSBPRiBNQVRDSEVTCit7CisgICAgbXkgKCRwYXJzZXIsICR0ZXh0LCAkcHJvZCwgJG1pbiwgJG1heCwgJF9ub2FjdGlvbnMsICRfaXRlbXBvcywgJGV4cGVjdGF0aW9uLCAkYXJnY29kZSkgPSBAXzsKKyAgICBteSBAdG9rZW5zID0gKCk7CisKKyAgICBteSAkaXRlbXBvc2ZpcnN0OworICAgIG15ICRyZXBzOworICAgIGZvciAoJHJlcHM9MDsgJHJlcHM8JG1heDspCisgICAgeworICAgICAgICAkZXhwZWN0YXRpb24tPmF0KCR0ZXh0KTsKKyAgICAgICAgbXkgJF9zYXZldGV4dCA9ICR0ZXh0OworICAgICAgICBteSAkcHJldnRleHRsZW4gPSBsZW5ndGggJHRleHQ7CisgICAgICAgIG15ICRfdG9rOworICAgICAgICBpZiAoISBkZWZpbmVkICgkX3RvayA9ICYkcHJvZCgkcGFyc2VyLCR0ZXh0LDEsJF9ub2FjdGlvbnMsJF9pdGVtcG9zLCRhcmdjb2RlKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICR0ZXh0ID0gJF9zYXZldGV4dDsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVmaW5lZCgkX2l0ZW1wb3MpIGFuZCAhZGVmaW5lZCgkaXRlbXBvc2ZpcnN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgJGl0ZW1wb3NmaXJzdCA9IFBhcnNlOjpSZWNEZXNjZW50OjpQcm9kdWN0aW9uOjpfZHVwbGljYXRlX2l0ZW1wb3MoJF9pdGVtcG9zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1c2ggQHRva2VucywgJF90b2sgaWYgZGVmaW5lZCAkX3RvazsKKyAgICAgICAgbGFzdCBpZiArKyRyZXBzID49ICRtaW4gYW5kICRwcmV2dGV4dGxlbiA9PSBsZW5ndGggJHRleHQ7CisgICAgfQorCisgICAgZG8geyAkZXhwZWN0YXRpb24tPmZhaWxlZCgpOyByZXR1cm4gdW5kZWZ9IGlmICRyZXBzPCRtaW47CisKKyAgICBpZiAoZGVmaW5lZCAkaXRlbXBvc2ZpcnN0KQorICAgIHsKKyAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQ6OlByb2R1Y3Rpb246Ol91cGRhdGVfaXRlbXBvcygkX2l0ZW1wb3MsICRpdGVtcG9zZmlyc3QsIHVuZGVmLCBbcXcoZnJvbSldKTsKKyAgICB9CisKKyAgICAkX1sxXSA9ICR0ZXh0OworICAgIHJldHVybiBbQHRva2Vuc107Cit9CisKK3N1YiBzZXRfYXV0b2ZsdXNoIHsKKyAgICBteSAkb3JpZ19zZWxlY3RlZCA9IHNlbGVjdCAkX1swXTsKKyAgICAkfCA9IDE7CisgICAgc2VsZWN0ICRvcmlnX3NlbGVjdGVkOworICAgIHJldHVybjsKK30KKworIyBFUlJPUiBSRVBPUlRJTkcuLi4uCisKK3N1YiBfd3JpdGVfRVJST1IgeworICAgIG15ICgkZXJyb3JwcmVmaXgsICRlcnJvcnRleHQpID0gQF87CisgICAgcmV0dXJuIGlmICRlcnJvcnRleHQgIX4gL1xTLzsKKyAgICAkZXJyb3JwcmVmaXggPX4gcy9ccytcWi8vOworICAgIGxvY2FsICReQSA9IHF7fTsKKworICAgIGZvcm1saW5lKDw8J0VORF9GT1JNQVQnLCAkZXJyb3JwcmVmaXgsICRlcnJvcnRleHQpOworQD4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+OiBePDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8CitFTkRfRk9STUFUCisgICAgZm9ybWxpbmUoPDwnRU5EX0ZPUk1BVCcsICRlcnJvcnRleHQpOworfn4gICAgICAgICAgICAgICAgICAgICBePDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8CitFTkRfRk9STUFUCisgICAgcHJpbnQgeypTVERFUlJ9ICReQTsKK30KKworIyBUUkFDSU5HCisKK215ICRUUkFDRV9GT1JNQVQgPSA8PCdFTkRfRk9STUFUJzsKK0A+fEB8fHx8fHx8fHxAXjw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDx8CisgIHwgfn4gICAgICAgfF48PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8fAorRU5EX0ZPUk1BVAorCitteSAkVFJBQ0VDT05URVhUX0ZPUk1BVCA9IDw8J0VORF9GT1JNQVQnOworQD58QHx8fHx8fHx8fEAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxePDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8CisgIHwgfn4gICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF48PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwKK0VORF9GT1JNQVQKKworc3ViIF93cml0ZV9UUkFDRSB7CisgICAgbXkgKCR0cmFjZWxldmVsLCAkdHJhY2VydWxlbmFtZSwgJHRyYWNlbXNnKSA9IEBfOworICAgIHJldHVybiBpZiAkdHJhY2Vtc2cgIX4gL1xTLzsKKyAgICAkdHJhY2Vtc2cgPX4gcy9ccypcWi8vOworICAgIGxvY2FsICReQSA9IHF7fTsKKyAgICBteSAkYmFyID0gJ3wnOworICAgIGZvcm1saW5lKCRUUkFDRV9GT1JNQVQsICR0cmFjZWxldmVsLCAkdHJhY2VydWxlbmFtZSwgJGJhciwgJHRyYWNlbXNnLCAkdHJhY2Vtc2cpOworICAgIHByaW50IHsqU1RERVJSfSAkXkE7Cit9CisKK3N1YiBfd3JpdGVfVFJBQ0VDT05URVhUIHsKKyAgICBteSAoJHRyYWNlbGV2ZWwsICR0cmFjZXJ1bGVuYW1lLCAkdHJhY2Vjb250ZXh0KSA9IEBfOworICAgIHJldHVybiBpZiAkdHJhY2Vjb250ZXh0ICF+IC9cUy87CisgICAgJHRyYWNlY29udGV4dCA9fiBzL1xzKlxaLy87CisgICAgbG9jYWwgJF5BID0gcXt9OworICAgIG15ICRiYXIgPSAnfCc7CisgICAgZm9ybWxpbmUoJFRSQUNFQ09OVEVYVF9GT1JNQVQsICR0cmFjZWxldmVsLCAkdHJhY2VydWxlbmFtZSwgJGJhciwgJHRyYWNlY29udGV4dCwgJHRyYWNlY29udGV4dCk7CisgICAgcHJpbnQgeypTVERFUlJ9ICReQTsKK30KKworc3ViIF92ZXJib3NpdHkoJCkKK3sKKyAgICAgICBkZWZpbmVkICQ6OlJEX1RSQUNFCisgICAgb3IgZGVmaW5lZCAkOjpSRF9ISU5UICAgIGFuZCAgJDo6UkRfSElOVCAgIGFuZCAkX1swXSA9fiAvRVJST1JTfFdBUk58SElOVC8KKyAgICBvciBkZWZpbmVkICQ6OlJEX1dBUk4gICAgYW5kICAkOjpSRF9XQVJOICAgYW5kICRfWzBdID1+IC9FUlJPUlN8V0FSTi8KKyAgICBvciBkZWZpbmVkICQ6OlJEX0VSUk9SUyAgYW5kICAkOjpSRF9FUlJPUlMgYW5kICRfWzBdID1+IC9FUlJPUlMvCit9CisKK3N1YiBfZXJyb3IoJDskKQoreworICAgICRFUlJPUlMrKzsKKyAgICByZXR1cm4gMCBpZiAhIF92ZXJib3NpdHkoIkVSUk9SUyIpOworICAgIG15ICRlcnJvcnRleHQgICA9ICRfWzBdOworICAgIG15ICRlcnJvcnByZWZpeCA9ICJFUlJPUiIgLiAgKCRfWzFdID8gIiAobGluZSAkX1sxXSkiIDogIiIpOworICAgICRlcnJvcnRleHQgPX4gcy9ccysvIC9nOworICAgIHByaW50IHsqU1RERVJSfSAiXG4iIGlmIF92ZXJib3NpdHkoIldBUk4iKTsKKyAgICBfd3JpdGVfRVJST1IoJGVycm9ycHJlZml4LCAkZXJyb3J0ZXh0KTsKKyAgICByZXR1cm4gMTsKK30KKworc3ViIF93YXJuKCQkOyQpCit7CisgICAgcmV0dXJuIDAgdW5sZXNzIF92ZXJib3NpdHkoIldBUk4iKSAmJiAoJDo6UkRfSElOVCB8fCAkX1swXSA+PSAoJDo6UkRfV0FSTnx8MSkpOworICAgIG15ICRlcnJvcnRleHQgICA9ICRfWzFdOworICAgIG15ICRlcnJvcnByZWZpeCA9ICJXYXJuaW5nIiAuICAoJF9bMl0gPyAiIChsaW5lICRfWzJdKSIgOiAiIik7CisgICAgcHJpbnQgeypTVERFUlJ9ICJcbiIgaWYgX3ZlcmJvc2l0eSgiSElOVCIpOworICAgICRlcnJvcnRleHQgPX4gcy9ccysvIC9nOworICAgIF93cml0ZV9FUlJPUigkZXJyb3JwcmVmaXgsICRlcnJvcnRleHQpOworICAgIHJldHVybiAxOworfQorCitzdWIgX2hpbnQoJCkKK3sKKyAgICByZXR1cm4gMCB1bmxlc3MgJDo6UkRfSElOVDsKKyAgICBteSAkZXJyb3J0ZXh0ID0gJF9bMF07CisgICAgbXkgJGVycm9ycHJlZml4ID0gIkhpbnQiIC4gICgkX1sxXSA/ICIgKGxpbmUgJF9bMV0pIiA6ICIiKTsKKyAgICAkZXJyb3J0ZXh0ID1+IHMvXHMrLyAvZzsKKyAgICBfd3JpdGVfRVJST1IoJGVycm9ycHJlZml4LCAkZXJyb3J0ZXh0KTsKKyAgICByZXR1cm4gMTsKK30KKworc3ViIF90cmFjZW1heCgkKQoreworICAgIGlmIChkZWZpbmVkICQ6OlJEX1RSQUNFCisgICAgICAgICYmICQ6OlJEX1RSQUNFID1+IC9cZCsvCisgICAgICAgICYmICQ6OlJEX1RSQUNFPjEKKyAgICAgICAgJiYgJDo6UkRfVFJBQ0UrMTA8bGVuZ3RoKCRfWzBdKSkKKyAgICB7CisgICAgICAgIG15ICRjb3VudCA9IGxlbmd0aCgkX1swXSkgLSAkOjpSRF9UUkFDRTsKKyAgICAgICAgcmV0dXJuIHN1YnN0cigkX1swXSwwLCQ6OlJEX1RSQUNFLzIpCisgICAgICAgICAgICAuICIuLi48JGNvdW50Pi4uLiIKKyAgICAgICAgICAgIC4gc3Vic3RyKCRfWzBdLC0kOjpSRF9UUkFDRS8yKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1YnN0cigkX1swXSwwLDUwMCk7CisgICAgfQorfQorCitzdWIgX3RyYWNlZmlyc3QoJCkKK3sKKyAgICBpZiAoZGVmaW5lZCAkOjpSRF9UUkFDRQorICAgICAgICAmJiAkOjpSRF9UUkFDRSA9fiAvXGQrLworICAgICAgICAmJiAkOjpSRF9UUkFDRT4xCisgICAgICAgICYmICQ6OlJEX1RSQUNFKzEwPGxlbmd0aCgkX1swXSkpCisgICAgeworICAgICAgICBteSAkY291bnQgPSBsZW5ndGgoJF9bMF0pIC0gJDo6UkRfVFJBQ0U7CisgICAgICAgIHJldHVybiBzdWJzdHIoJF9bMF0sMCwkOjpSRF9UUkFDRSkgLiAiLi4uPCskY291bnQ+IjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1YnN0cigkX1swXSwwLDUwMCk7CisgICAgfQorfQorCitteSAkbGFzdGNvbnRleHQgPSAnJzsKK215ICRsYXN0cnVsZW5hbWUgPSAnJzsKK215ICRsYXN0bGV2ZWwgPSAnJzsKKworc3ViIF90cmFjZSgkOyQkJCkKK3sKKyAgICBteSAkdHJhY2Vtc2cgICAgICA9ICRfWzBdOworICAgIG15ICR0cmFjZWNvbnRleHQgID0gJF9bMV18fCRsYXN0Y29udGV4dDsKKyAgICBteSAkdHJhY2VydWxlbmFtZSA9ICRfWzJdfHwkbGFzdHJ1bGVuYW1lOworICAgIG15ICR0cmFjZWxldmVsICAgID0gJF9bM118fCRsYXN0bGV2ZWw7CisgICAgaWYgKCR0cmFjZXJ1bGVuYW1lKSB7ICRsYXN0cnVsZW5hbWUgPSAkdHJhY2VydWxlbmFtZSB9CisgICAgaWYgKCR0cmFjZWxldmVsKSAgICB7ICRsYXN0bGV2ZWwgPSAkdHJhY2VsZXZlbCB9CisKKyAgICAkdHJhY2Vjb250ZXh0ID1+IHMvXG4vXFxuL2c7CisgICAgJHRyYWNlY29udGV4dCA9fiBzL1xzKy8gL2c7CisgICAgJHRyYWNlcnVsZW5hbWUgPSBxcXskdHJhY2VydWxlbmFtZX07CisgICAgX3dyaXRlX1RSQUNFKCR0cmFjZWxldmVsLCAkdHJhY2VydWxlbmFtZSwgJHRyYWNlbXNnKTsKKyAgICBpZiAoJHRyYWNlY29udGV4dCBuZSAkbGFzdGNvbnRleHQpCisgICAgeworICAgICAgICBpZiAoJHRyYWNlY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgJGxhc3Rjb250ZXh0ID0gX3RyYWNlZmlyc3QoJHRyYWNlY29udGV4dCk7CisgICAgICAgICAgICAkdHJhY2Vjb250ZXh0ID0gcXF7IiR0cmFjZWNvbnRleHQifTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICR0cmFjZWNvbnRleHQgPSBxcXs8Tk8gVEVYVCBMRUZUPn07CisgICAgICAgIH0KKyAgICAgICAgX3dyaXRlX1RSQUNFQ09OVEVYVCgkdHJhY2VsZXZlbCwgJHRyYWNlcnVsZW5hbWUsICR0cmFjZWNvbnRleHQpOworICAgIH0KK30KKworc3ViIF9tYXRjaHRyYWNlbWVzc2FnZQoreworICAgIG15ICgkc2VsZiwgJHJlamVjdCkgPSBAXzsKKworICAgIG15ICRwcmVmaXggPSAnJzsKKyAgICBteSAkcG9zdGZpeCA9ICcnOworICAgIG15ICRtYXRjaGVkID0gbm90ICRyZWplY3Q7CisgICAgbXkgQHQgPSAoIk1hdGNoZWQiLCAiRGlkbid0IG1hdGNoIik7CisgICAgaWYgKGV4aXN0cyAkc2VsZi0+e2xvb2thaGVhZH0gYW5kICRzZWxmLT57bG9va2FoZWFkfSkKKyAgICB7CisgICAgICAgICRwb3N0Zml4ID0gJHJlamVjdCA/ICIocmVqZWN0KSIgOiAiKGtlZXApIjsKKyAgICAgICAgJHByZWZpeCA9ICIuLi4iOworICAgICAgICBpZiAoJHNlbGYtPntsb29rYWhlYWR9IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgJHByZWZpeCAuPSAnISc7CisgICAgICAgICAgICAkbWF0Y2hlZCA9IG5vdCAkbWF0Y2hlZDsKKyAgICAgICAgfQorICAgIH0KKyAgICAkcHJlZml4IC4gKCRtYXRjaGVkID8gJHRbMF0gOiAkdFsxXSkgLiAkcG9zdGZpeDsKK30KKworc3ViIF9wYXJzZXVubmVnKCQkJCQkKQoreworICAgIF9wYXJzZSgkX1swXSwkX1sxXSwkX1szXSwkX1s0XSk7CisgICAgaWYgKCRfWzJdPDApCisgICAgeworICAgICAgICBfZXJyb3IoIkNhbid0IG5lZ2F0ZSBcIiRfWzRdXCIuIiwkX1szXSk7CisgICAgICAgIF9oaW50KCJZb3UgY2FuJ3QgbmVnYXRlICRfWzBdLiBSZW1vdmUgdGhlIFwiLi4uIVwiIGJlZm9yZQorICAgICAgICAgICAgICAgXCIkX1s0XVwiLiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBfcGFyc2UoJCQkJCkKK3sKKyAgICBteSAkd2hhdCA9ICRfWzNdOworICAgICAgICR3aGF0ID1+IHMvXlxzKy8vOworICAgIGlmICgkX1sxXSkKKyAgICB7CisgICAgICAgIF93YXJuKDMsIkZvdW5kICRfWzBdICgkd2hhdCkgYWZ0ZXIgYW4gdW5jb25kaXRpb25hbCA8ZXJyb3I+IiwkX1syXSkKKyAgICAgICAgYW5kCisgICAgICAgIF9oaW50KCJBbiB1bmNvbmRpdGlvbmFsIDxlcnJvcj4gYWx3YXlzIGNhdXNlcyB0aGUKKyAgICAgICAgICAgICAgIHByb2R1Y3Rpb24gY29udGFpbmluZyBpdCB0byBpbW1lZGlhdGVseSBmYWlsLgorICAgICAgICAgICAgICAgXHUkX1swXSB0aGF0IGZvbGxvd3MgYW4gPGVycm9yPgorICAgICAgICAgICAgICAgd2lsbCBuZXZlciBiZSByZWFjaGVkLiAgRGlkIHlvdSBtZWFuIHRvIHVzZQorICAgICAgICAgICAgICAgPGVycm9yPz4gaW5zdGVhZD8iKTsKKyAgICB9CisKKyAgICByZXR1cm4gaWYgISBfdmVyYm9zaXR5KCJUUkFDRSIpOworICAgIG15ICRlcnJvcnRleHQgPSAiVHJlYXRpbmcgXCIkd2hhdFwiIGFzICRfWzBdIjsKKyAgICBteSAkZXJyb3JwcmVmaXggPSAiUGFyc2U6OlJlY0Rlc2NlbnQiOworICAgICRlcnJvcnRleHQgPX4gcy9ccysvIC9nOworICAgIF93cml0ZV9FUlJPUigkZXJyb3JwcmVmaXgsICRlcnJvcnRleHQpOworfQorCitzdWIgX2xpbmVjb3VudCgkKSB7CisgICAgc2NhbGFyIHN1YnN0cigkX1swXSwgcG9zICRfWzBdfHwwKSA9fiB0ci9cbi8vCit9CisKKworcGFja2FnZSBtYWluOworCit1c2UgdmFycyBxdyAoICRSRF9FUlJPUlMgJFJEX1dBUk4gJFJEX0hJTlQgJFJEX1RSQUNFICRSRF9DSEVDSyApOworJDo6UkRfQ0hFQ0sgPSAxOworJDo6UkRfRVJST1JTID0gMTsKKyQ6OlJEX1dBUk4gPSAzOworCisxOworCitfX0VORF9fCisKKz1oZWFkMSBOQU1FCisKK1BhcnNlOjpSZWNEZXNjZW50IC0gR2VuZXJhdGUgUmVjdXJzaXZlLURlc2NlbnQgUGFyc2VycworCis9aGVhZDEgVkVSU0lPTgorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB2ZXJzaW9uIDEuOTY3MDA2IG9mIFBhcnNlOjpSZWNEZXNjZW50CityZWxlYXNlZCBKYW51YXJ5IDI5dGgsIDIwMTIuCisKKz1oZWFkMSBTWU5PUFNJUworCisgdXNlIFBhcnNlOjpSZWNEZXNjZW50OworCisgIyBHZW5lcmF0ZSBhIHBhcnNlciBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluICRncmFtbWFyOgorCisgICAgICRwYXJzZXIgPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQgKCRncmFtbWFyKTsKKworICMgR2VuZXJhdGUgYSBwYXJzZXIgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBpbiAkb3RoZXJncmFtbWFyCisKKyAgICAgJGFub3RoZXJwYXJzZXIgPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQgKCRvdGhlcmdyYW1tYXIpOworCisKKyAjIFBhcnNlICR0ZXh0IHVzaW5nIHJ1bGUgJ3N0YXJ0cnVsZScgKHdoaWNoIG11c3QgYmUKKyAjIGRlZmluZWQgaW4gJGdyYW1tYXIpOgorCisgICAgJHBhcnNlci0+c3RhcnRydWxlKCR0ZXh0KTsKKworCisgIyBQYXJzZSAkdGV4dCB1c2luZyBydWxlICdvdGhlcnJ1bGUnICh3aGljaCBtdXN0IGFsc28KKyAjIGJlIGRlZmluZWQgaW4gJGdyYW1tYXIpOgorCisgICAgICRwYXJzZXItPm90aGVycnVsZSgkdGV4dCk7CisKKworICMgQ2hhbmdlIHRoZSB1bml2ZXJzYWwgdG9rZW4gcHJlZml4IHBhdHRlcm4KKyAjIGJlZm9yZSBidWlsZGluZyBhIGdyYW1tYXIKKyAjICh0aGUgZGVmYXVsdCBpczogJ1xzKicpOgorCisgICAgJFBhcnNlOjpSZWNEZXNjZW50Ojpza2lwID0gJ1sgXHRdKyc7CisKKworICMgUmVwbGFjZSBwcm9kdWN0aW9ucyBvZiBleGlzdGluZyBydWxlcyAob3IgY3JlYXRlIG5ldyBvbmVzKQorICMgd2l0aCB0aGUgcHJvZHVjdGlvbnMgZGVmaW5lZCBpbiAkbmV3Z3JhbW1hcjoKKworICAgICRwYXJzZXItPlJlcGxhY2UoJG5ld2dyYW1tYXIpOworCisKKyAjIEV4dGVuZCBleGlzdGluZyBydWxlcyAob3IgY3JlYXRlIG5ldyBvbmVzKQorICMgYnkgYWRkaW5nIGV4dHJhIHByb2R1Y3Rpb25zIGRlZmluZWQgaW4gJG1vcmVncmFtbWFyOgorCisgICAgJHBhcnNlci0+RXh0ZW5kKCRtb3JlZ3JhbW1hcik7CisKKworICMgR2xvYmFsIGZsYWdzICh1c2VmdWwgYXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB1bmRlciAtcyk6CisKKyAgICAkOjpSRF9FUlJPUlMgICAgICAgIyB1bmxlc3MgdW5kZWZpbmVkLCByZXBvcnQgZmF0YWwgZXJyb3JzCisgICAgJDo6UkRfV0FSTiAgICAgICAgICMgdW5sZXNzIHVuZGVmaW5lZCwgYWxzbyByZXBvcnQgbm9uLWZhdGFsIHByb2JsZW1zCisgICAgJDo6UkRfSElOVCAgICAgICAgICMgaWYgZGVmaW5lZCwgYWxzbyBzdWdnZXN0aW9uIHJlbWVkaWVzCisgICAgJDo6UkRfVFJBQ0UgICAgICAgICMgaWYgZGVmaW5lZCwgYWxzbyB0cmFjZSBwYXJzZXJzJyBiZWhhdmlvdXIKKyAgICAkOjpSRF9BVVRPU1RVQiAgICAgIyBpZiBkZWZpbmVkLCBnZW5lcmF0ZXMgInN0dWJzIiBmb3IgdW5kZWZpbmVkIHJ1bGVzCisgICAgJDo6UkRfQVVUT0FDVElPTiAgICMgaWYgZGVmaW5lZCwgYXBwZW5kcyBzcGVjaWZpZWQgYWN0aW9uIHRvIHByb2R1Y3Rpb25zCisKKworPWhlYWQxIERFU0NSSVBUSU9OCisKKz1oZWFkMiBPdmVydmlldworCitQYXJzZTo6UmVjRGVzY2VudCBpbmNyZW1lbnRhbGx5IGdlbmVyYXRlcyB0b3AtZG93biByZWN1cnNpdmUtZGVzY2VudCB0ZXh0CitwYXJzZXJzIGZyb20gc2ltcGxlIEk8eWFjYz4tbGlrZSBncmFtbWFyIHNwZWNpZmljYXRpb25zLiBJdCBwcm92aWRlczoKKworPW92ZXIgNAorCis9aXRlbSAqCisKK1JlZ3VsYXIgZXhwcmVzc2lvbnMgb3IgbGl0ZXJhbCBzdHJpbmdzIGFzIHRlcm1pbmFscyAodG9rZW5zKSwKKworPWl0ZW0gKgorCitNdWx0aXBsZSAobm9uLWNvbnRpZ3VvdXMpIHByb2R1Y3Rpb25zIGZvciBhbnkgcnVsZSwKKworPWl0ZW0gKgorCitSZXBlYXRlZCBhbmQgb3B0aW9uYWwgc3VicnVsZXMgd2l0aGluIHByb2R1Y3Rpb25zLAorCis9aXRlbSAqCisKK0Z1bGwgYWNjZXNzIHRvIFBlcmwgd2l0aGluIGFjdGlvbnMgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhlIGdyYW1tYXIsCisKKz1pdGVtICoKKworU2ltcGxlIGF1dG9tYXRlZCBlcnJvciByZXBvcnRpbmcgZHVyaW5nIHBhcnNlciBnZW5lcmF0aW9uIGFuZCBwYXJzaW5nLAorCis9aXRlbSAqCisKK1RoZSBhYmlsaXR5IHRvIGNvbW1pdCB0bywgdW5jb21taXQgdG8sIG9yIHJlamVjdCBwYXJ0aWN1bGFyCitwcm9kdWN0aW9ucyBkdXJpbmcgYSBwYXJzZSwKKworPWl0ZW0gKgorCitUaGUgYWJpbGl0eSB0byBwYXNzIGRhdGEgdXAgYW5kIGRvd24gdGhlIHBhcnNlIHRyZWUgKCJkb3duIiB2aWEgc3VicnVsZQorYXJndW1lbnQgbGlzdHMsICJ1cCIgdmlhIHN1YnJ1bGUgcmV0dXJuIHZhbHVlcykKKworPWl0ZW0gKgorCitJbmNyZW1lbnRhbCBleHRlbnNpb24gb2YgdGhlIHBhcnNpbmcgZ3JhbW1hciAoZXZlbiBkdXJpbmcgYSBwYXJzZSksCisKKz1pdGVtICoKKworUHJlY29tcGlsYXRpb24gb2YgcGFyc2VyIG9iamVjdHMsCisKKz1pdGVtICoKKworVXNlci1kZWZpbmFibGUgcmVkdWNlLXJlZHVjZSBjb25mbGljdCByZXNvbHV0aW9uIHZpYQorInNjb3JpbmciIG9mIG1hdGNoaW5nIHByb2R1Y3Rpb25zLgorCis9YmFjaworCis9aGVhZDIgVXNpbmcgQzxQYXJzZTo6UmVjRGVzY2VudD4KKworUGFyc2VyIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgY2FsbGluZyBDPFBhcnNlOjpSZWNEZXNjZW50OjpuZXc+LCBwYXNzaW5nIGluIGEKK2dyYW1tYXIgc3BlY2lmaWNhdGlvbiAoc2VlIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbnMpLiBJZiB0aGUgZ3JhbW1hciBpcworY29ycmVjdCwgQzxuZXc+IHJldHVybnMgYSBibGVzc2VkIHJlZmVyZW5jZSB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIHRvIGluaXRpYXRlCitwYXJzaW5nIHRocm91Z2ggYW55IHJ1bGUgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBncmFtbWFyLiBBIHR5cGljYWwgc2VxdWVuY2UKK2xvb2tzIGxpa2UgdGhpczoKKworICAgICRncmFtbWFyID0gcSB7CisgICAgICAgICMgR1JBTU1BUiBTUEVDSUZJQ0FUSU9OIEhFUkUKKyAgICAgICAgIH07CisKKyAgICAkcGFyc2VyID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50ICgkZ3JhbW1hcikgb3IgZGllICJCYWQgZ3JhbW1hciFcbiI7CisKKyAgICAjIGFjcXVpcmUgJHRleHQKKworICAgIGRlZmluZWQgJHBhcnNlci0+c3RhcnRydWxlKCR0ZXh0KSBvciBwcmludCAiQmFkIHRleHQhXG4iOworCitUaGUgcnVsZSB0aHJvdWdoIHdoaWNoIHBhcnNpbmcgaXMgaW5pdGlhdGVkIG11c3QgYmUgZXhwbGljaXRseSBkZWZpbmVkCitpbiB0aGUgZ3JhbW1hciAoaS5lLiBmb3IgdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSBncmFtbWFyIG11c3QgaW5jbHVkZSBhCitydWxlIG9mIHRoZSBmb3JtOiAic3RhcnRydWxlOiA8c3VicnVsZXM+Ii4KKworSWYgdGhlIHN0YXJ0aW5nIHJ1bGUgc3VjY2VlZHMsIGl0cyB2YWx1ZSAoc2VlIGJlbG93KQoraXMgcmV0dXJuZWQuIEZhaWx1cmUgdG8gZ2VuZXJhdGUgdGhlIG9yaWdpbmFsIHBhcnNlciBvciBmYWlsdXJlIHRvIG1hdGNoIGEgdGV4dAoraXMgaW5kaWNhdGVkIGJ5IHJldHVybmluZyBDPHVuZGVmPi4gTm90ZSB0aGF0IGl0J3MgZWFzeSB0byBzZXQgdXAgZ3JhbW1hcnMKK3RoYXQgY2FuIHN1Y2NlZWQsIGJ1dCB3aGljaCByZXR1cm4gYSB2YWx1ZSBvZiAwLCAiMCIsIG9yICIiLiAgU28gZG9uJ3QgYmUKK3RlbXB0ZWQgdG8gd3JpdGU6CisKKyAgICAkcGFyc2VyLT5zdGFydHJ1bGUoJHRleHQpIG9yIHByaW50ICJCYWQgdGV4dCFcbiI7CisKK05vcm1hbGx5LCB0aGUgcGFyc2VyIGhhcyBubyBlZmZlY3Qgb24gdGhlIG9yaWdpbmFsIHRleHQuIFNvIGluIHRoZQorcHJldmlvdXMgZXhhbXBsZSB0aGUgdmFsdWUgb2YgJHRleHQgd291bGQgYmUgdW5jaGFuZ2VkIGFmdGVyIGhhdmluZworYmVlbiBwYXJzZWQuCisKK0lmLCBob3dldmVyLCB0aGUgdGV4dCB0byBiZSBtYXRjaGVkIGlzIHBhc3NlZCBieSByZWZlcmVuY2U6CisKKyAgICAkcGFyc2VyLT5zdGFydHJ1bGUoXCR0ZXh0KQorCit0aGVuIGFueSB0ZXh0IHdoaWNoIHdhcyBjb25zdW1lZCBkdXJpbmcgdGhlIG1hdGNoIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZQorc3RhcnQgb2YgJHRleHQuCisKKworPWhlYWQyIFJ1bGVzCisKK0luIHRoZSBncmFtbWFyIGZyb20gd2hpY2ggdGhlIHBhcnNlciBpcyBidWlsdCwgcnVsZXMgYXJlIHNwZWNpZmllZCBieQorZ2l2aW5nIGFuIGlkZW50aWZpZXIgKHdoaWNoIG11c3Qgc2F0aXNmeSAvW0EtWmEtel1cdyovKSwgZm9sbG93ZWQgYnkgYQorY29sb24gSTxvbiB0aGUgc2FtZSBsaW5lPiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcHJvZHVjdGlvbnMsCitzZXBhcmF0ZWQgYnkgc2luZ2xlIHZlcnRpY2FsIGJhcnMuIFRoZSBsYXlvdXQgb2YgdGhlIHByb2R1Y3Rpb25zCitpcyBlbnRpcmVseSBmcmVlLWZvcm1hdDoKKworICAgIHJ1bGUxOiAgcHJvZHVjdGlvbjEKKyAgICAgfCAgcHJvZHVjdGlvbjIgfAorICAgIHByb2R1Y3Rpb24zIHwgcHJvZHVjdGlvbjQKKworQXQgYW55IHBvaW50IGluIHRoZSBncmFtbWFyIHByZXZpb3VzbHkgZGVmaW5lZCBydWxlcyBtYXkgYmUgZXh0ZW5kZWQgd2l0aAorYWRkaXRpb25hbCBwcm9kdWN0aW9ucy4gVGhpcyBpcyBhY2hpZXZlZCBieSByZWRlY2xhcmluZyB0aGUgcnVsZSB3aXRoIHRoZSBuZXcKK3Byb2R1Y3Rpb25zLiBUaHVzOgorCisgICAgcnVsZTE6IGEgfCBiIHwgYworICAgIHJ1bGUyOiBkIHwgZSB8IGYKKyAgICBydWxlMTogZyB8IGgKKworaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvOgorCisgICAgcnVsZTE6IGEgfCBiIHwgYyB8IGcgfCBoCisgICAgcnVsZTI6IGQgfCBlIHwgZgorCitFYWNoIHByb2R1Y3Rpb24gaW4gYSBydWxlIGNvbnNpc3RzIG9mIHplcm8gb3IgbW9yZSBpdGVtcywgZWFjaCBvZiB3aGljaAorbWF5IGJlIGVpdGhlcjogdGhlIG5hbWUgb2YgYW5vdGhlciBydWxlIHRvIGJlIG1hdGNoZWQgKGEgInN1YnJ1bGUiKSwKK2EgcGF0dGVybiBvciBzdHJpbmcgbGl0ZXJhbCB0byBiZSBtYXRjaGVkIGRpcmVjdGx5IChhICJ0b2tlbiIpLCBhCitibG9jayBvZiBQZXJsIGNvZGUgdG8gYmUgZXhlY3V0ZWQgKGFuICJhY3Rpb24iKSwgYSBzcGVjaWFsIGluc3RydWN0aW9uCit0byB0aGUgcGFyc2VyIChhICJkaXJlY3RpdmUiKSwgb3IgYSBzdGFuZGFyZCBQZXJsIGNvbW1lbnQgKHdoaWNoIGlzCitpZ25vcmVkKS4KKworQSBydWxlIG1hdGNoZXMgYSB0ZXh0IGlmIG9uZSBvZiBpdHMgcHJvZHVjdGlvbnMgbWF0Y2hlcy4gQSBwcm9kdWN0aW9uCittYXRjaGVzIGlmIGVhY2ggb2YgaXRzIGl0ZW1zIG1hdGNoIGNvbnNlY3V0aXZlIHN1YnN0cmluZ3Mgb2YgdGhlCit0ZXh0LiBUaGUgcHJvZHVjdGlvbnMgb2YgYSBydWxlIGJlaW5nIG1hdGNoZWQgYXJlIHRyaWVkIGluIHRoZSBzYW1lCitvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBvcmlnaW5hbCBncmFtbWFyLCBhbmQgdGhlIGZpcnN0IG1hdGNoaW5nCitwcm9kdWN0aW9uIHRlcm1pbmF0ZXMgdGhlIG1hdGNoIGF0dGVtcHQgKHN1Y2Nlc3NmdWxseSkuIElmIGFsbAorcHJvZHVjdGlvbnMgYXJlIHRyaWVkIGFuZCBub25lIG1hdGNoZXMsIHRoZSBtYXRjaCBhdHRlbXB0IGZhaWxzLgorCitOb3RlIHRoYXQgdGhpcyBiZWhhdmlvdXIgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlICJwcmVmZXIgdGhlIGxvbmdlciBtYXRjaCIKK2JlaGF2aW91ciBvZiBJPHlhY2M+LiBGb3IgZXhhbXBsZSwgaWYgSTx5YWNjPiB3ZXJlIHBhcnNpbmcgdGhlIHJ1bGU6CisKKyAgICBzZXEgOiAnQScgJ0InCisgICAgfCAnQScgJ0InICdDJworCit1cG9uIG1hdGNoaW5nICJBQiIgaXQgd291bGQgbG9vayBhaGVhZCB0byBzZWUgaWYgYSAnQycgaXMgbmV4dCBhbmQsIGlmCitzbywgd2lsbCBtYXRjaCB0aGUgc2Vjb25kIHByb2R1Y3Rpb24gaW4gcHJlZmVyZW5jZSB0byB0aGUgZmlyc3QuIEluCitvdGhlciB3b3JkcywgSTx5YWNjPiBlZmZlY3RpdmVseSB0cmllcyBhbGwgdGhlIHByb2R1Y3Rpb25zIG9mIGEgcnVsZQorYnJlYWR0aC1maXJzdCBpbiBwYXJhbGxlbCwgYW5kIHNlbGVjdHMgdGhlICJiZXN0IiBtYXRjaCwgd2hlcmUgImJlc3QiCittZWFucyBsb25nZXN0IChub3RlIHRoYXQgdGhpcyBpcyBhIGdyb3NzIHNpbXBsaWZpY2F0aW9uIG9mIHRoZSB0cnVlCitiZWhhdmlvdXIgb2YgSTx5YWNjPiBidXQgaXQgd2lsbCBkbyBmb3Igb3VyIHB1cnBvc2VzKS4KKworSW4gY29udHJhc3QsIEM8UGFyc2U6OlJlY0Rlc2NlbnQ+IHRyaWVzIGVhY2ggcHJvZHVjdGlvbiBkZXB0aC1maXJzdCBpbgorc2VxdWVuY2UsIGFuZCBzZWxlY3RzIHRoZSAiYmVzdCIgbWF0Y2gsIHdoZXJlICJiZXN0IiBtZWFucyBmaXJzdC4gVGhpcyBpcwordGhlIGZ1bmRhbWVudGFsIGRpZmZlcmVuY2UgYmV0d2VlbiAiYm90dG9tLXVwIiBhbmQgInJlY3Vyc2l2ZSBkZXNjZW50IgorcGFyc2luZy4KKworRWFjaCBzdWNjZXNzZnVsbHkgbWF0Y2hlZCBpdGVtIGluIGEgcHJvZHVjdGlvbiBpcyBhc3NpZ25lZCBhIHZhbHVlLAord2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGluIHN1YnNlcXVlbnQgYWN0aW9ucyB3aXRoaW4gdGhlIHNhbWUKK3Byb2R1Y3Rpb24gKG9yLCBpbiBzb21lIGNhc2VzLCBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgc3VjY2Vzc2Z1bAorc3VicnVsZSBjYWxsKS4gVW5zdWNjZXNzZnVsIGl0ZW1zIGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCB2YWx1ZSwKK3NpbmNlIHRoZSBmYWlsdXJlIG9mIGFuIGl0ZW0gY2F1c2VzIHRoZSBlbnRpcmUgc3Vycm91bmRpbmcgcHJvZHVjdGlvbgordG8gaW1tZWRpYXRlbHkgZmFpbC4gVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZXNjcmliZSB0aGUgdmFyaW91cyB0eXBlcworb2YgaXRlbXMgYW5kIHRoZWlyIHN1Y2Nlc3MgdmFsdWVzLgorCisKKz1oZWFkMiBTdWJydWxlcworCitBIHN1YnJ1bGUgd2hpY2ggYXBwZWFycyBpbiBhIHByb2R1Y3Rpb24gaXMgYW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIHBhcnNlciB0bworYXR0ZW1wdCB0byBtYXRjaCB0aGUgbmFtZWQgcnVsZSBhdCB0aGF0IHBvaW50IGluIHRoZSB0ZXh0IGJlaW5nCitwYXJzZWQuIElmIHRoZSBuYW1lZCBzdWJydWxlIGlzIG5vdCBkZWZpbmVkIHdoZW4gcmVxdWVzdGVkIHRoZQorcHJvZHVjdGlvbiBjb250YWluaW5nIGl0IGltbWVkaWF0ZWx5IGZhaWxzICh1bmxlc3MgaXQgd2FzICJhdXRvc3R1YmJlZCIgLSBzZWUKK0w8QXV0b3N0dWJiaW5nPikuCisKK0EgcnVsZSBtYXkgKHJlY3Vyc2l2ZWx5KSBjYWxsIGl0c2VsZiBhcyBhIHN1YnJ1bGUsIGJ1dCBJPG5vdD4gYXMgdGhlCitsZWZ0LW1vc3QgaXRlbSBpbiBhbnkgb2YgaXRzIHByb2R1Y3Rpb25zIChzaW5jZSBzdWNoIHJlY3Vyc2lvbnMgYXJlIHVzdWFsbHkKK25vbi10ZXJtaW5hdGluZykuCisKK1RoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBzdWJydWxlIGlzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRzCitDPCRyZXR1cm4+IHZhcmlhYmxlIChzZWUgTDwiQWN0aW9ucyI+IGJlbG93KSwgb3Igd2l0aCB0aGUgbGFzdCBzdWNjZXNzZnVsbHkKK21hdGNoZWQgaXRlbSBpbiB0aGUgc3VicnVsZSBtYXRjaC4KKworU3VicnVsZXMgbWF5IGFsc28gYmUgc3BlY2lmaWVkIHdpdGggYSB0cmFpbGluZyByZXBldGl0aW9uIHNwZWNpZmllciwKK2luZGljYXRpbmcgdGhhdCB0aGV5IGFyZSB0byBiZSAoZ3JlZWRpbHkpIG1hdGNoZWQgdGhlIHNwZWNpZmllZCBudW1iZXIKK29mIHRpbWVzLiBUaGUgYXZhaWxhYmxlIHNwZWNpZmllcnMgYXJlOgorCisgICAgc3VicnVsZSg/KSAgIyBNYXRjaCBvbmUtb3ItemVybyB0aW1lcworICAgIHN1YnJ1bGUocykgICMgTWF0Y2ggb25lLW9yLW1vcmUgdGltZXMKKyAgICBzdWJydWxlKHM/KSAjIE1hdGNoIHplcm8tb3ItbW9yZSB0aW1lcworICAgIHN1YnJ1bGUoTikgICMgTWF0Y2ggZXhhY3RseSBOIHRpbWVzIGZvciBpbnRlZ2VyIE4gPiAwCisgICAgc3VicnVsZShOLi5NKSAgICMgTWF0Y2ggYmV0d2VlbiBOIGFuZCBNIHRpbWVzCisgICAgc3VicnVsZSguLk0pICAgICMgTWF0Y2ggYmV0d2VlbiAxIGFuZCBNIHRpbWVzCisgICAgc3VicnVsZShOLi4pICAgICMgTWF0Y2ggYXQgbGVhc3QgTiB0aW1lcworCitSZXBlYXRlZCBzdWJydWxlcyBrZWVwIG1hdGNoaW5nIHVudGlsIGVpdGhlciB0aGUgc3VicnVsZSBmYWlscyB0bworbWF0Y2gsIG9yIGl0IGhhcyBtYXRjaGVkIHRoZSBtaW5pbWFsIG51bWJlciBvZiB0aW1lcyBidXQgZmFpbHMgdG8KK2NvbnN1bWUgYW55IG9mIHRoZSBwYXJzZWQgdGV4dCAodGhpcyBzZWNvbmQgY29uZGl0aW9uIHByZXZlbnRzIHRoZQorc3VicnVsZSBtYXRjaGluZyBmb3JldmVyIGluIHNvbWUgY2FzZXMpLgorCitTaW5jZSBhIHJlcGVhdGVkIHN1YnJ1bGUgbWF5IG1hdGNoIG1hbnkgaW5zdGFuY2VzIG9mIHRoZSBzdWJydWxlIGl0c2VsZiwgdGhlCit2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXQgaXMgbm90IGEgc2ltcGxlIHNjYWxhciwgYnV0IHJhdGhlciBhIHJlZmVyZW5jZSB0byBhCitsaXN0IG9mIHNjYWxhcnMsIGVhY2ggb2Ygd2hpY2ggaXMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlCitpbmRpdmlkdWFsIHN1YnJ1bGUgbWF0Y2hlcy4gSW4gb3RoZXIgd29yZHMgaW4gdGhlIHJ1bGU6CisKKyAgICBwcm9ncmFtOiBzdGF0ZW1lbnQocykKKwordGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwZWF0ZWQgc3VicnVsZSAic3RhdGVtZW50KHMpIiBpcyBhIHJlZmVyZW5jZQordG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIG1hdGNoZWQgYnkgZWFjaCBjYWxsIHRvIHRoZSBpbmRpdmlkdWFsCitzdWJydWxlICJzdGF0ZW1lbnQiLgorCitSZXBldGl0aW9uIG1vZGlmaWVycyBtYXkgaW5jbHVkZSBhIHNlcGFyYXRvciBwYXR0ZXJuOgorCisgICAgcHJvZ3JhbTogc3RhdGVtZW50KHMgLzsvKQorCitzcGVjaWZ5aW5nIHNvbWUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0byBiZSBza2lwcGVkIGJldHdlZW4gZWFjaCByZXBldGl0aW9uLgorVGhpcyBpcyByZWFsbHkganVzdCBhIHNob3J0aGFuZCBmb3IgdGhlIEU8bHQ+bGVmdG9wOi4uLkU8Z3Q+IGRpcmVjdGl2ZQorKHNlZSBiZWxvdykuCisKKz1oZWFkMiBUb2tlbnMKKworSWYgYSBxdW90ZS1kZWxpbWl0ZWQgc3RyaW5nIG9yIGEgUGVybCByZWdleCBhcHBlYXJzIGluIGEgcHJvZHVjdGlvbiwKK3RoZSBwYXJzZXIgYXR0ZW1wdHMgdG8gbWF0Y2ggdGhhdCBzdHJpbmcgb3IgcGF0dGVybiBhdCB0aGF0IHBvaW50IGluCit0aGUgdGV4dC4gRm9yIGV4YW1wbGU6CisKKyAgICB0eXBlZGVmOiAidHlwZWRlZiIgdHlwZW5hbWUgaWRlbnRpZmllciAnOycKKworICAgIGlkZW50aWZpZXI6IC9bQS1aYS16X11bQS1aYS16MC05X10qLworCitBcyBpbiByZWd1bGFyIFBlcmwsIGEgc2luZ2xlIHF1b3RlZCBzdHJpbmcgaXMgdW5pbnRlcnBvbGF0ZWQsIHdoaWxzdAorYSBkb3VibGUtcXVvdGVkIHN0cmluZyBvciBhIHBhdHRlcm4gaXMgaW50ZXJwb2xhdGVkIChhdCB0aGUgdGltZQorb2YgbWF0Y2hpbmcsIEk8bm90PiB3aGVuIHRoZSBwYXJzZXIgaXMgY29uc3RydWN0ZWQpLiBIZW5jZSwgaXQgaXMKK3Bvc3NpYmxlIHRvIGRlZmluZSBydWxlcyBpbiB3aGljaCB0b2tlbnMgY2FuIGJlIHNldCBhdCBydW4tdGltZToKKworICAgIHR5cGVkZWY6ICIkOjp0eXBlZGVma2V5d29yZCIgdHlwZW5hbWUgaWRlbnRpZmllciAnOycKKworICAgIGlkZW50aWZpZXI6IC8kOjppZGVudHBhdC8KKworTm90ZSB0aGF0LCBzaW5jZSBlYWNoIHJ1bGUgaXMgaW1wbGVtZW50ZWQgaW5zaWRlIGEgc3BlY2lhbCBuYW1lc3BhY2UKK2JlbG9uZ2luZyB0byBpdHMgcGFyc2VyLCBpdCBpcyBuZWNlc3NhcnkgdG8gZXhwbGljaXRseSBxdWFudGlmeQordmFyaWFibGVzIGZyb20gdGhlIG1haW4gcGFja2FnZS4KKworUmVnZXggdG9rZW5zIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcganVzdCBzbGFzaGVzIGFzIGRlbGltaXRlcnMKK29yIHdpdGggdGhlIGV4cGxpY2l0IEM8bUU8bHQ+ZGVsaW1pdGVyRTxndD4uLi4uLi5FPGx0PmRlbGltaXRlckU8Z3Q+PiBzeW50YXg6CisKKyAgICB0eXBlZGVmOiAidHlwZWRlZiIgdHlwZW5hbWUgaWRlbnRpZmllciAnOycKKworICAgIHR5cGVuYW1lOiAvW0EtWmEtel9dW0EtWmEtejAtOV9dKi8KKworICAgIGlkZW50aWZpZXI6IG17W0EtWmEtel9dW0EtWmEtejAtOV9dKn0KKworQSByZWdleCBvZiBlaXRoZXIgdHlwZSBjYW4gYWxzbyBoYXZlIGFueSB2YWxpZCB0cmFpbGluZyBwYXJhbWV0ZXIocykKKyh0aGF0IGlzLCBhbnkgb2YgW2NnaW1zb3hdKToKKworICAgIHR5cGVkZWY6ICJ0eXBlZGVmIiB0eXBlbmFtZSBpZGVudGlmaWVyICc7JworCisgICAgaWRlbnRpZmllcjogLyBbYS16X10gICAgICAgICMgTEVBRElORyBBTFBIQSBPUiBVTkRFUlNDT1JFCisgICAgICAgICAgW2EtejAtOV9dKiAgICAjIFRIRU4gRElHSVRTIEFMU08gQUxMT1dFRAorICAgICAgICAvaXggICAgICMgQ0FTRS9TUEFDRS9DT01NRU5UIElOU0VOU0lUSVZFCisKK1RoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYW55IHN1Y2Nlc3NmdWxseSBtYXRjaGVkIHRva2VuIGlzIGEgc3RyaW5nCitjb250YWluaW5nIHRoZSBhY3R1YWwgdGV4dCB3aGljaCB3YXMgbWF0Y2hlZCBieSB0aGUgdG9rZW4uCisKK0l0IGlzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0LCBzaW5jZSBlYWNoIGdyYW1tYXIgaXMgc3BlY2lmaWVkIGluIGEKK1Blcmwgc3RyaW5nLCBhbGwgaW5zdGFuY2VzIG9mIHRoZSB1bml2ZXJzYWwgZXNjYXBlIGNoYXJhY3RlciAnXCcgd2l0aGluCithIGdyYW1tYXIgbXVzdCBiZSAiZG91YmxlZCIsIHNvIHRoYXQgdGhleSBpbnRlcnBvbGF0ZSB0byBzaW5nbGUgJ1wncyB3aGVuCit0aGUgc3RyaW5nIGlzIGNvbXBpbGVkLiBGb3IgZXhhbXBsZSwgdG8gdXNlIHRoZSBncmFtbWFyOgorCisgICAgd29yZDogICAgICAgL1xTKy8gfCBiYWNrc2xhc2gKKyAgICBsaW5lOiAgICAgICBwcmVmaXggd29yZChzKSAiXG4iCisgICAgYmFja3NsYXNoOiAgJ1xcJworCit0aGUgZm9sbG93aW5nIGNvZGUgaXMgcmVxdWlyZWQ6CisKKyAgICAkcGFyc2VyID0gbmV3IFBhcnNlOjpSZWNEZXNjZW50IChxeworCisgICAgICAgIHdvcmQ6ICAgL1xcUysvIHwgYmFja3NsYXNoCisgICAgICAgIGxpbmU6ICAgcHJlZml4IHdvcmQocykgIlxcbiIKKyAgICAgICAgYmFja3NsYXNoOiAgJ1xcXFwnCisKKyAgICB9KTsKKworPWhlYWQyIEFub255bW91cyBzdWJydWxlcworCitQYXJlbnRoZXNlcyBpbnRyb2R1Y2UgYSBuZXN0ZWQgc2NvcGUgdGhhdCBpcyB2ZXJ5IGxpa2UgYSBjYWxsIHRvIGFuIGFub255bW91cworc3VicnVsZS4gSGVuY2UgdGhleSBhcmUgdXNlZnVsIGZvciAiaW4tbGluaW5nIiBzdWJyb3V0aW5lIGNhbGxzLCBhbmQgb3RoZXIKK2tpbmRzIG9mIGdyb3VwaW5nIGJlaGF2aW91ci4gRm9yIGV4YW1wbGUsIGluc3RlYWQgb2Y6CisKKyAgICB3b3JkOiAgICAgICAvXFMrLyB8IGJhY2tzbGFzaAorICAgIGxpbmU6ICAgICAgIHByZWZpeCB3b3JkKHMpICJcbiIKKworeW91IGNvdWxkIHdyaXRlOgorCisgICAgbGluZTogICAgICAgcHJlZml4ICggL1xTKy8gfCBiYWNrc2xhc2ggKShzKSAiXG4iCisKK2FuZCBnZXQgZXhhY3RseSB0aGUgc2FtZSBlZmZlY3RzLgorCitQYXJlbnRoZXNlcyBhcmUgYWxzbyB1c2UgZm9yIGNvbGxlY3RpbmcgdW5yZXBlYXRlZCBhbHRlcm5hdGlvbnMgd2l0aGluIGEKK3NpbmdsZSBwcm9kdWN0aW9uLgorCisgICAgc2VjcmV0X2lkZW50aXR5OiAiTXIiICgiSW5jcmVkaWJsZSJ8IkZhbnRhc3RpYyJ8IlNoZWVuIikgIiwgRXNxLiIKKworCis9aGVhZDIgVGVybWluYWwgU2VwYXJhdG9ycworCitGb3IgdGhlIHB1cnBvc2Ugb2YgbWF0Y2hpbmcsIGVhY2ggdGVybWluYWwgaW4gYSBwcm9kdWN0aW9uIGlzIGNvbnNpZGVyZWQKK3RvIGJlIHByZWNlZGVkIGJ5IGEgInByZWZpeCIgLSBhIHBhdHRlcm4gd2hpY2ggbXVzdCBiZQorbWF0Y2hlZCBiZWZvcmUgYSB0b2tlbiBtYXRjaCBpcyBhdHRlbXB0ZWQuIEJ5IGRlZmF1bHQsIHRoZQorcHJlZml4IGlzIG9wdGlvbmFsIHdoaXRlc3BhY2UgKHdoaWNoIGFsd2F5cyBtYXRjaGVzLCBhdAorbGVhc3QgdHJpdmlhbGx5KSwgYnV0IHRoaXMgZGVmYXVsdCBtYXkgYmUgcmVzZXQgaW4gYW55IHByb2R1Y3Rpb24uCisKK1RoZSB2YXJpYWJsZSBDPCRQYXJzZTo6UmVjRGVzY2VudDo6c2tpcD4gc3RvcmVzIHRoZSB1bml2ZXJzYWwKK3ByZWZpeCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIGFsbCB0ZXJtaW5hbCBtYXRjaGVzIGluIGFsbCBwYXJzZXJzCitidWlsdCB3aXRoIEM8UGFyc2U6OlJlY0Rlc2NlbnQ+LgorCitJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHVuaXZlcnNhbCBwcmVmaXggdXNpbmcKK0M8JFBhcnNlOjpSZWNEZXNjZW50Ojpza2lwPiwgYmUgY2FyZWZ1bCB0byBzZXQgaXQgSTxiZWZvcmU+IGNyZWF0aW5nCit0aGUgZ3JhbW1hciBvYmplY3QsIGJlY2F1c2UgaXQgaXMgYXBwbGllZCBzdGF0aWNhbGx5ICh3aGVuIGEgZ3JhbW1hcgoraXMgYnVpbHQpIHJhdGhlciB0aGFuIGR5bmFtaWNhbGx5ICh3aGVuIHRoZSBncmFtbWFyIGlzIHVzZWQpLgorQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHByb3ZpZGUgYSBnbG9iYWwgQzxFPGx0PnNraXA6Li4uRTxndD4+IGRpcmVjdGl2ZQoraW4geW91ciBncmFtbWFyIGJlZm9yZSBhbnkgcnVsZXMgKGRlc2NyaWJlZCBsYXRlcikuCisKK1RoZSBwcmVmaXggZm9yIGFuIGluZGl2aWR1YWwgcHJvZHVjdGlvbiBjYW4gYmUgYWx0ZXJlZAorYnkgdXNpbmcgdGhlIEM8RTxsdD5za2lwOi4uLkU8Z3Q+PiBkaXJlY3RpdmUgKGRlc2NyaWJlZCBsYXRlcikuCitTZXR0aW5nIHRoaXMgZGlyZWN0aXZlIGluIHRoZSB0b3AtbGV2ZWwgcnVsZSBpcyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaAordG8gc2V0dGluZyBDPCRQYXJzZTo6UmVjRGVzY2VudDo6c2tpcD4gYmVmb3JlIGNyZWF0aW5nIHRoZSBvYmplY3QsIGJ1dAoraW4gdGhpcyBjYXNlIHlvdSBkb24ndCBnZXQgdGhlIGludGVuZGVkIHNraXBwaW5nIGJlaGF2aW91ciBpZiB5b3UKK2RpcmVjdGx5IGludm9rZSBtZXRob2RzIGRpZmZlcmVudCBmcm9tIHRoZSB0b3AtbGV2ZWwgcnVsZS4KKworCis9aGVhZDIgQWN0aW9ucworCitBbiBhY3Rpb24gaXMgYSBibG9jayBvZiBQZXJsIGNvZGUgd2hpY2ggaXMgdG8gYmUgZXhlY3V0ZWQgKGFzIHRoZQorYmxvY2sgb2YgYSBDPGRvPiBzdGF0ZW1lbnQpIHdoZW4gdGhlIHBhcnNlciByZWFjaGVzIHRoYXQgcG9pbnQgaW4gYQorcHJvZHVjdGlvbi4gVGhlIGFjdGlvbiBleGVjdXRlcyB3aXRoaW4gYSBzcGVjaWFsIG5hbWVzcGFjZSBiZWxvbmdpbmcgdG8KK3RoZSBhY3RpdmUgcGFyc2VyLCBzbyBjYXJlIG11c3QgYmUgdGFrZW4gaW4gY29ycmVjdGx5IHF1YWxpZnlpbmcgdmFyaWFibGUKK25hbWVzIChzZWUgYWxzbyBMPFN0YXJ0LXVwIEFjdGlvbnM+IGJlbG93KS4KKworVGhlIGFjdGlvbiBpcyBjb25zaWRlcmVkIHRvIHN1Y2NlZWQgaWYgdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBibG9jaworaXMgZGVmaW5lZCAodGhhdCBpcywgaWYgdGhlIGltcGxpZWQgQzxkbz4gc3RhdGVtZW50IGV2YWx1YXRlcyB0byBhCitkZWZpbmVkIHZhbHVlIC0gSTxldmVuIG9uZSB3aGljaCB3b3VsZCBiZSB0cmVhdGVkIGFzICJmYWxzZSI+KS4gTm90ZQordGhhdCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgc3VjY2Vzc2Z1bCBhY3Rpb24gaXMgYWxzbyB0aGUgZmluYWwKK3ZhbHVlIGluIHRoZSBibG9jay4KKworQW4gYWN0aW9uIHdpbGwgSTxmYWlsPiBpZiBpdHMgbGFzdCBldmFsdWF0ZWQgdmFsdWUgaXMgQzx1bmRlZj4uIFRoaXMgaXMKK3N1cnByaXNpbmdseSBlYXN5IHRvIGFjY29tcGxpc2ggYnkgYWNjaWRlbnQuIEZvciBpbnN0YW5jZSwgaGVyZSdzIGFuCitpbmZ1cmlhdGluZyBjYXNlIG9mIGFuIGFjdGlvbiB0aGF0IG1ha2VzIGl0cyBwcm9kdWN0aW9uIGZhaWwsIGJ1dCBvbmx5Cit3aGVuIGRlYnVnZ2luZyBJPGlzbid0PiBhY3RpdmF0ZWQ6CisKKyAgICBkZXNjcmlwdGlvbjogbmFtZSByYW5rIHNlcmlhbF9udW1iZXIKKyAgICAgICAgeyBwcmludCAiR290ICRpdGVtWzJdICRpdGVtWzFdICgkaXRlbVszXSlcbiIKKyAgICAgICAgaWYgJDo6ZGVidWdnaW5nCisgICAgICAgIH0KKworSWYgQzwkZGVidWdnaW5nPiBpcyBmYWxzZSwgbm8gc3RhdGVtZW50IGluIHRoZSBibG9jayBpcyBleGVjdXRlZCwgc28KK3RoZSBmaW5hbCB2YWx1ZSBpcyBDPHVuZGVmPiwgYW5kIHRoZSBlbnRpcmUgcHJvZHVjdGlvbiBmYWlscy4gVGhlIHNvbHV0aW9uIGlzOgorCisgICAgZGVzY3JpcHRpb246IG5hbWUgcmFuayBzZXJpYWxfbnVtYmVyCisgICAgICAgIHsgcHJpbnQgIkdvdCAkaXRlbVsyXSAkaXRlbVsxXSAoJGl0ZW1bM10pXG4iCisgICAgICAgIGlmICQ6OmRlYnVnZ2luZzsKKyAgICAgICAgICAxOworICAgICAgICB9CisKK1dpdGhpbiBhbiBhY3Rpb24sIGEgbnVtYmVyIG9mIHVzZWZ1bCBwYXJzZS10aW1lIHZhcmlhYmxlcyBhcmUKK2F2YWlsYWJsZSBpbiB0aGUgc3BlY2lhbCBwYXJzZXIgbmFtZXNwYWNlICh0aGVyZSBhcmUgb3RoZXIgdmFyaWFibGVzCithbHNvIGFjY2Vzc2libGUsIGJ1dCBtZWRkbGluZyB3aXRoIHRoZW0gd2lsbCBwcm9iYWJseSBqdXN0IGJyZWFrIHlvdXIKK3BhcnNlci4gQXMgYSBnZW5lcmFsIHJ1bGUsIGlmIHlvdSBhdm9pZCByZWZlcnJpbmcgdG8gdW5xdWFsaWZpZWQKK3ZhcmlhYmxlcyAtIGVzcGVjaWFsbHkgdGhvc2Ugc3RhcnRpbmcgd2l0aCBhbiB1bmRlcnNjb3JlIC0gaW5zaWRlIGFuIGFjdGlvbiwKK3RoaW5ncyBzaG91bGQgYmUgb2theSk6CisKKz1vdmVyIDQKKworPWl0ZW0gQzxAaXRlbT4gYW5kIEM8JWl0ZW0+CisKK1RoZSBhcnJheSBzbGljZSBDPEBpdGVtWzEuLiQjaXRlbV0+IHN0b3JlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGVhY2ggaXRlbQorKHRoYXQgaXMsIGVhY2ggc3VicnVsZSwgdG9rZW4sIG9yIGFjdGlvbikgaW4gdGhlIGN1cnJlbnQgcHJvZHVjdGlvbi4gVGhlCithbmFsb2d5IGlzIHRvIEM8JDE+LCBDPCQyPiwgZXRjLiBpbiBhIEk8eWFjYz4gZ3JhbW1hci4KK05vdGUgdGhhdCwgZm9yIG9idmlvdXMgcmVhc29ucywgQzxAaXRlbT4gb25seSBjb250YWlucyB0aGUKK3ZhbHVlcyBvZiBpdGVtcyBJPGJlZm9yZT4gdGhlIGN1cnJlbnQgcG9pbnQgaW4gdGhlIHByb2R1Y3Rpb24uCisKK1RoZSBmaXJzdCBlbGVtZW50IChDPCRpdGVtWzBdPikgc3RvcmVzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHJ1bGUKK2JlaW5nIG1hdGNoZWQuCisKK0M8QGl0ZW0+IGlzIGEgc3RhbmRhcmQgUGVybCBhcnJheSwgc28gaXQgY2FuIGFsc28gYmUgaW5kZXhlZCB3aXRoIG5lZ2F0aXZlCitudW1iZXJzLCByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBpdGVtcyBJPGJhY2s+IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4KK3RoZSBwYXJzZToKKworICAgIHN0dWZmOiAvdmFyaW91cy8gYml0cyAnYW5kJyBwaWVjZXMgInRoZW4iIGRhdGEgJ2VuZCcKKyAgICAgICAgeyBwcmludCAkaXRlbVstMl0gfSAgIyBQUklOVFMgZGF0YQorICAgICAgICAgICAgICMgKEVBU0lFUiBUSEFOOiAkaXRlbVs2XSkKKworVGhlIEM8JWl0ZW0+IGhhc2ggY29tcGxlbWVudHMgdGhlIDxAaXRlbT4gYXJyYXksIHByb3ZpZGluZyBuYW1lZAorYWNjZXNzIHRvIHRoZSBzYW1lIGl0ZW0gdmFsdWVzOgorCisgICAgc3R1ZmY6IC92YXJpb3VzLyBiaXRzICdhbmQnIHBpZWNlcyAidGhlbiIgZGF0YSAnZW5kJworICAgICAgICB7IHByaW50ICRpdGVte2RhdGF9ICAjIFBSSU5UUyBkYXRhCisgICAgICAgICAgICAgIyAoRVZFTiBFQVNJRVIgVEhBTiBVU0lORyBAaXRlbSkKKworCitUaGUgcmVzdWx0cyBvZiBuYW1lZCBzdWJydWxlcyBhcmUgc3RvcmVkIGluIHRoZSBoYXNoIHVuZGVyIGVhY2gKK3N1YnJ1bGUncyBuYW1lIChpbmNsdWRpbmcgdGhlIHJlcGV0aXRpb24gc3BlY2lmaWVyLCBpZiBhbnkpLAord2hpbHN0IGFsbCBvdGhlciBpdGVtcyBhcmUgc3RvcmVkIHVuZGVyIGEgIm5hbWVkCitwb3NpdGlvbmFsIiBrZXkgdGhhdCBpbmRpY3RhdGVzIHRoZWlyIG9yZGluYWwgcG9zaXRpb24gd2l0aGluIHRoZWlyIGl0ZW0KK3R5cGU6IF9fU1RSSU5HSTxuPl9fLCBfX1BBVFRFUk5JPG4+X18sIF9fRElSRUNUSVZFSTxuPl9fLCBfX0FDVElPTkk8bj5fXzoKKworICAgIHN0dWZmOiAvdmFyaW91cy8gYml0cyAnYW5kJyBwaWVjZXMgInRoZW4iIGRhdGEgJ2VuZCcgeyBzYXZlIH0KKyAgICAgICAgeyBwcmludCAkaXRlbXtfX1BBVFRFUk4xX199LCAjIFBSSU5UUyAndmFyaW91cycKKyAgICAgICAgJGl0ZW17X19TVFJJTkcyX199LCAgIyBQUklOVFMgJ3RoZW4nCisgICAgICAgICRpdGVte19fQUNUSU9OMV9ffSwgICMgUFJJTlRTIFJFVFVSTgorICAgICAgICAgICAgICAgICAjIFZBTFVFIE9GIHNhdmUKKyAgICAgICAgfQorCisKK0lmIHlvdSB3YW50IHByb3BlciBJPG5hbWVkPiBhY2Nlc3MgdG8gcGF0dGVybnMgb3IgbGl0ZXJhbHMsIHlvdSBuZWVkIHRvIHR1cm4KK3RoZW0gaW50byBzZXBhcmF0ZSBydWxlczoKKworICAgIHN0dWZmOiB2YXJpb3VzIGJpdHMgJ2FuZCcgcGllY2VzICJ0aGVuIiBkYXRhICdlbmQnCisgICAgICAgIHsgcHJpbnQgJGl0ZW17dmFyaW91c30gICMgUFJJTlRTIHZhcmlvdXMKKyAgICAgICAgfQorCisgICAgdmFyaW91czogL3ZhcmlvdXMvCisKKworVGhlIHNwZWNpYWwgZW50cnkgQzwkaXRlbXtfX1JVTEVfX30+IHN0b3JlcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudAorcnVsZSAoaS5lLiB0aGUgc2FtZSB2YWx1ZSBhcyBDPCRpdGVtWzBdPi4KKworVGhlIGFkdmFudGFnZSBvZiB1c2luZyBDPCVpdGVtPiwgaW5zdGVhZCBvZiBDPEBpdGVtcz4gaXMgdGhhdCBpdAorcmVtb3ZlcyB0aGUgbmVlZCB0byB0cmFjayBpdGVtcyBwb3NpdGlvbnMgdGhhdCBtYXkgY2hhbmdlIGFzIGEgZ3JhbW1hcgorZXZvbHZlcy4gRm9yIGV4YW1wbGUsIGFkZGluZyBhbiBpbnRlcmltIEM8RTxsdD5za2lwRTxndD4+IGRpcmVjdGl2ZQorb2YgYWN0aW9uIGNhbiBzaWxlbnRseSBydWluIGEgdHJhaWxpbmcgYWN0aW9uLCBieSBtb3ZpbmcgYW4gQzxAaXRlbT4KK2VsZW1lbnQgImRvd24iIHRoZSBhcnJheSBvbmUgcGxhY2UuIEluIGNvbnRyYXN0LCB0aGUgbmFtZWQgZW50cnkKK29mIEM8JWl0ZW0+IGlzIHVuYWZmZWN0ZWQgYnkgc3VjaCBhbiBpbnNlcnRpb24uCisKK0EgbGltaXRhdGlvbiBvZiB0aGUgQzwlaXRlbT4gaGFzaCBpcyB0aGF0IGl0IG9ubHkgcmVjb3JkcyB0aGUgSTxsYXN0PgordmFsdWUgb2YgYSBwYXJ0aWN1bGFyIHN1YnJ1bGUuIEZvciBleGFtcGxlOgorCisgICAgcmFuZ2U6ICcoJyBudW1iZXIgJy4uJyBudW1iZXIgKScKKyAgICAgICAgeyAkcmV0dXJuID0gJGl0ZW17bnVtYmVyfSB9CisKK3dpbGwgcmV0dXJuIG9ubHkgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEk8c2Vjb25kPiBtYXRjaCBvZiB0aGUKK0M8bnVtYmVyPiBzdWJydWxlLiBJbiBvdGhlciB3b3Jkcywgc3VjY2Vzc2l2ZSBjYWxscyB0byBhIHN1YnJ1bGUKK292ZXJ3cml0ZSB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiBDPCVpdGVtPi4gT25jZSBhZ2FpbiwgdGhlCitzb2x1dGlvbiBpcyB0byByZW5hbWUgZWFjaCBzdWJydWxlIGluIGl0cyBvd24gcnVsZToKKworICAgIHJhbmdlOiAnKCcgZnJvbV9udW0gJy4uJyB0b19udW0gJyknCisgICAgICAgIHsgJHJldHVybiA9ICRpdGVte2Zyb21fbnVtfSB9CisKKyAgICBmcm9tX251bTogbnVtYmVyCisgICAgdG9fbnVtOiAgIG51bWJlcgorCisKKworPWl0ZW0gQzxAYXJnPiBhbmQgQzwlYXJnPgorCitUaGUgYXJyYXkgQzxAYXJnPiBhbmQgdGhlIGhhc2ggQzwlYXJnPiBzdG9yZSBhbnkgYXJndW1lbnRzIHBhc3NlZCB0bwordGhlIHJ1bGUgZnJvbSBzb21lIG90aGVyIHJ1bGUgKHNlZSBMPFN1YnJ1bGUgYXJndW1lbnQgbGlzdHM+KS4gQ2hhbmdlcwordG8gdGhlIGVsZW1lbnRzIG9mIGVpdGhlciB2YXJpYWJsZSBkbyBub3QgcHJvcGFnYXRlIGJhY2sgdG8gdGhlIGNhbGxpbmcKK3J1bGUgKGRhdGEgY2FuIGJlIHBhc3NlZCBiYWNrIGZyb20gYSBzdWJydWxlIHZpYSB0aGUgQzwkcmV0dXJuPgordmFyaWFibGUgLSBzZWUgbmV4dCBpdGVtKS4KKworCis9aXRlbSBDPCRyZXR1cm4+CisKK0lmIGEgdmFsdWUgaXMgYXNzaWduZWQgdG8gQzwkcmV0dXJuPiB3aXRoaW4gYW4gYWN0aW9uLCB0aGF0IHZhbHVlIGlzCityZXR1cm5lZCBpZiB0aGUgcHJvZHVjdGlvbiBjb250YWluaW5nIHRoZSBhY3Rpb24gZXZlbnR1YWxseSBtYXRjaGVzCitzdWNjZXNzZnVsbHkuIE5vdGUgdGhhdCBzZXR0aW5nIEM8JHJldHVybj4gSTxkb2Vzbid0PiBjYXVzZSB0aGUgY3VycmVudAorcHJvZHVjdGlvbiB0byBzdWNjZWVkLiBJdCBtZXJlbHkgdGVsbHMgaXQgd2hhdCB0byByZXR1cm4gaWYgaXQgSTxkb2VzPiBzdWNjZWVkLgorSGVuY2UgQzwkcmV0dXJuPiBpcyBhbmFsb2dvdXMgdG8gQzwkJD4gaW4gYSBJPHlhY2M+IGdyYW1tYXIuCisKK0lmIEM8JHJldHVybj4gaXMgbm90IGFzc2lnbmVkIHdpdGhpbiBhIHByb2R1Y3Rpb24sIHRoZSB2YWx1ZSBvZiB0aGUKK2xhc3QgY29tcG9uZW50IG9mIHRoZSBwcm9kdWN0aW9uIChuYW1lbHk6IEM8JGl0ZW1bJCNpdGVtXT4pIGlzCityZXR1cm5lZCBpZiB0aGUgcHJvZHVjdGlvbiBzdWNjZWVkcy4KKworCis9aXRlbSBDPCRjb21taXQ+CisKK1RoZSBjdXJyZW50IHN0YXRlIG9mIGNvbW1pdG1lbnQgdG8gdGhlIGN1cnJlbnQgcHJvZHVjdGlvbiAoc2VlIEw8IkRpcmVjdGl2ZXMiPgorYmVsb3cpLgorCis9aXRlbSBDPCRza2lwPgorCitUaGUgY3VycmVudCB0ZXJtaW5hbCBwcmVmaXggKHNlZSBMPCJEaXJlY3RpdmVzIj4gYmVsb3cpLgorCis9aXRlbSBDPCR0ZXh0PgorCitUaGUgcmVtYWluaW5nICh1bnBhcnNlZCkgdGV4dC4gQ2hhbmdlcyB0byBDPCR0ZXh0PiBJPGRvIG5vdAorcHJvcGFnYXRlPiBvdXQgb2YgdW5zdWNjZXNzZnVsIHByb2R1Y3Rpb25zLCBidXQgSTxkbz4gc3Vydml2ZQorc3VjY2Vzc2Z1bCBwcm9kdWN0aW9ucy4gSGVuY2UgaXQgaXMgcG9zc2libGUgdG8gZHluYW1pY2FsbHkgYWx0ZXIgdGhlCit0ZXh0IGJlaW5nIHBhcnNlZCAtIGZvciBleGFtcGxlLCB0byBwcm92aWRlIGEgQzwjaW5jbHVkZT4tbGlrZSBmYWNpbGl0eToKKworICAgIGhhc2hfaW5jbHVkZTogJyNpbmNsdWRlJyBmaWxlbmFtZQorICAgICAgICB7ICR0ZXh0ID0gOjpsb2FkZmlsZSgkaXRlbVsyXSkgLiAkdGV4dCB9CisKKyAgICBmaWxlbmFtZTogJzwnIC9bYS16MC05Ll8tXSsvaSAnPicgIHsgJHJldHVybiA9ICRpdGVtWzJdIH0KKyAgICB8ICciJyAvW2EtejAtOS5fLV0rL2kgJyInICB7ICRyZXR1cm4gPSAkaXRlbVsyXSB9CisKKworPWl0ZW0gQzwkdGhpc2xpbmU+IGFuZCBDPCRwcmV2bGluZT4KKworQzwkdGhpc2xpbmU+IHN0b3JlcyB0aGUgY3VycmVudCBsaW5lIG51bWJlciB3aXRoaW4gdGhlIGN1cnJlbnQgcGFyc2UKKyhzdGFydGluZyBmcm9tIDEpLiBDPCRwcmV2bGluZT4gc3RvcmVzIHRoZSBsaW5lIG51bWJlciBmb3IgdGhlIGxhc3QKK2NoYXJhY3RlciB3aGljaCB3YXMgYWxyZWFkeSBzdWNjZXNzZnVsbHkgcGFyc2VkICh0aGlzIHdpbGwgYmUgZGlmZmVyZW50IGZyb20KK0M8JHRoaXNsaW5lPiBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZSkuCisKK0ZvciBlZmZpY2llbmN5LCBDPCR0aGlzbGluZT4gYW5kIEM8JHByZXZsaW5lPiBhcmUgYWN0dWFsbHkgdGllZAoraGFzaGVzLCBhbmQgb25seSByZWNvbXB1dGUgdGhlIHJlcXVpcmVkIGxpbmUgbnVtYmVyIHdoZW4gdGhlIHZhcmlhYmxlJ3MKK3ZhbHVlIGlzIHVzZWQuCisKK0Fzc2lnbm1lbnQgdG8gQzwkdGhpc2xpbmU+IGFkanVzdHMgdGhlIGxpbmUgbnVtYmVyIGNhbGN1bGF0b3IsIHNvIHRoYXQKK2l0IGJlbGlldmVzIHRoYXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgaXMgdGhlIHZhbHVlIGJlaW5nIGFzc2lnbmVkLiBOb3RlCit0aGF0IHRoaXMgYWRqdXN0bWVudCB3aWxsIGJlIHJlZmxlY3RlZCBpbiBhbGwgc3Vic2VxdWVudCBsaW5lIG51bWJlcnMKK2NhbGN1bGF0aW9ucy4KKworTW9kaWZ5aW5nIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQzwkdGV4dD4gKGFzIGluIHRoZSBwcmV2aW91cworQzxoYXNoX2luY2x1ZGU+IGV4YW1wbGUsIGZvciBpbnN0YW5jZSkgd2lsbCBjb25mdXNlIHRoZSBsaW5lCitjb3VudGluZyBtZWNoYW5pc20uIFRvIHByZXZlbnQgdGhpcywgeW91IHNob3VsZCBjYWxsCitDPFBhcnNlOjpSZWNEZXNjZW50OjpMaW5lQ291bnRlcjo6cmVzeW5jKCR0aGlzbGluZSk+IEk8aW1tZWRpYXRlbHk+CithZnRlciBhbnkgYXNzaWdubWVudCB0byB0aGUgdmFyaWFibGUgQzwkdGV4dD4gKG9yLCBhdCBsZWFzdCwgYmVmb3JlIHRoZQorbmV4dCBhdHRlbXB0IHRvIHVzZSBDPCR0aGlzbGluZT4pLgorCitOb3RlIHRoYXQgaWYgYSBwcm9kdWN0aW9uIGZhaWxzIGFmdGVyIGFzc2lnbmluZyB0byBvcgorcmVzeW5jJ2luZyBDPCR0aGlzbGluZT4sIHRoZSBwYXJzZXIncyBsaW5lIGNvdW50ZXIgbWVjaGFuaXNtIHdpbGwKK3VzdWFsbHkgYmUgY29ycnVwdGVkLgorCitBbHNvIHNlZSB0aGUgZW50cnkgZm9yIEM8QGl0ZW1wb3M+LgorCitUaGUgbGluZSBudW1iZXIgY2FuIGJlIHNldCB0byB2YWx1ZXMgb3RoZXIgdGhhbiAxLCBieSBjYWxsaW5nIHRoZSBzdGFydAorcnVsZSB3aXRoIGEgc2Vjb25kIGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKKworICAgICRwYXJzZXIgPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQgKCRncmFtbWFyKTsKKworICAgICRwYXJzZXItPmlucHV0KCR0ZXh0LCAxMCk7ICAjIFNUQVJUIExJTkUgTlVNQkVSUyBBVCAxMAorCisKKz1pdGVtIEM8JHRoaXNjb2x1bW4+IGFuZCBDPCRwcmV2Y29sdW1uPgorCitDPCR0aGlzY29sdW1uPiBzdG9yZXMgdGhlIGN1cnJlbnQgY29sdW1uIG51bWJlciB3aXRoaW4gdGhlIGN1cnJlbnQgbGluZQorYmVpbmcgcGFyc2VkIChzdGFydGluZyBmcm9tIDEpLiBDPCRwcmV2Y29sdW1uPiBzdG9yZXMgdGhlIGNvbHVtbiBudW1iZXIKK29mIHRoZSBsYXN0IGNoYXJhY3RlciB3aGljaCB3YXMgYWN0dWFsbHkgc3VjY2Vzc2Z1bGx5IHBhcnNlZC4gVXN1YWxseQorQzwkcHJldmNvbHVtbiA9PSAkdGhpc2NvbHVtbi0xPiwgYnV0IG5vdCBhdCB0aGUgZW5kIG9mIGxpbmVzLgorCitGb3IgZWZmaWNpZW5jeSwgQzwkdGhpc2NvbHVtbj4gYW5kIEM8JHByZXZjb2x1bW4+IGFyZQorYWN0dWFsbHkgdGllZCBoYXNoZXMsIGFuZCBvbmx5IHJlY29tcHV0ZSB0aGUgcmVxdWlyZWQgY29sdW1uIG51bWJlcgord2hlbiB0aGUgdmFyaWFibGUncyB2YWx1ZSBpcyB1c2VkLgorCitBc3NpZ25tZW50IHRvIEM8JHRoaXNjb2x1bW4+IG9yIEM8JHByZXZjb2x1bW4+IGlzIGEgZmF0YWwgZXJyb3IuCisKK01vZGlmeWluZyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIEM8JHRleHQ+IChhcyBpbiB0aGUgcHJldmlvdXMKK0M8aGFzaF9pbmNsdWRlPiBleGFtcGxlLCBmb3IgaW5zdGFuY2UpIG1heSBjb25mdXNlIHRoZSBjb2x1bW4KK2NvdW50aW5nIG1lY2hhbmlzbS4KKworTm90ZSB0aGF0IEM8JHRoaXNjb2x1bW4+IHJlcG9ydHMgdGhlIGNvbHVtbiBudW1iZXIgSTxiZWZvcmU+IGFueQord2hpdGVzcGFjZSB0aGF0IG1pZ2h0IGJlIHNraXBwZWQgYmVmb3JlIHJlYWRpbmcgYSB0b2tlbi4gSGVuY2UKK2lmIHlvdSB3aXNoIHRvIGtub3cgd2hlcmUgYSB0b2tlbiBzdGFydGVkIChhbmQgZW5kZWQpIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisgICAgcnVsZTogdG9rZW4xIHRva2VuMiBzdGFydGNvbCB0b2tlbjMgZW5kY29sIHRva2VuNAorICAgICAgICB7IHByaW50ICJ0b2tlbjM6IGNvbHVtbnMgJGl0ZW1bM10gdG8gJGl0ZW1bNV0iOyB9CisKKyAgICBzdGFydGNvbDogJycgeyAkdGhpc2NvbHVtbiB9ICAgICMgTkVFRCBUSEUgJycgVE8gU1RFUCBQQVNUIFRPS0VOIFNFUAorICAgIGVuZGNvbDogIHsgJHByZXZjb2x1bW4gfQorCitBbHNvIHNlZSB0aGUgZW50cnkgZm9yIEM8QGl0ZW1wb3M+LgorCis9aXRlbSBDPCR0aGlzb2Zmc2V0PiBhbmQgQzwkcHJldm9mZnNldD4KKworQzwkdGhpc29mZnNldD4gc3RvcmVzIHRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgcGFyc2luZyBwb3NpdGlvbgord2l0aGluIHRoZSBjb21wbGV0ZSB0ZXh0CitiZWluZyBwYXJzZWQgKHN0YXJ0aW5nIGZyb20gMCkuIEM8JHByZXZvZmZzZXQ+IHN0b3JlcyB0aGUgb2Zmc2V0CitvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgd2hpY2ggd2FzIGFjdHVhbGx5IHN1Y2Nlc3NmdWxseSBwYXJzZWQuIEluIGFsbAorY2FzZXMgQzwkcHJldm9mZnNldCA9PSAkdGhpc29mZnNldC0xPi4KKworRm9yIGVmZmljaWVuY3ksIEM8JHRoaXNvZmZzZXQ+IGFuZCBDPCRwcmV2b2Zmc2V0PiBhcmUKK2FjdHVhbGx5IHRpZWQgaGFzaGVzLCBhbmQgb25seSByZWNvbXB1dGUgdGhlIHJlcXVpcmVkIG9mZnNldAord2hlbiB0aGUgdmFyaWFibGUncyB2YWx1ZSBpcyB1c2VkLgorCitBc3NpZ25tZW50IHRvIEM8JHRoaXNvZmZzZXQ+IG9yIDwkcHJldm9mZnNldD4gaXMgYSBmYXRhbCBlcnJvci4KKworTW9kaWZ5aW5nIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQzwkdGV4dD4gd2lsbCBJPG5vdD4gYWZmZWN0IHRoZQorb2Zmc2V0IGNvdW50aW5nIG1lY2hhbmlzbS4KKworQWxzbyBzZWUgdGhlIGVudHJ5IGZvciBDPEBpdGVtcG9zPi4KKworPWl0ZW0gQzxAaXRlbXBvcz4KKworVGhlIGFycmF5IEM8QGl0ZW1wb3M+IHN0b3JlcyBhIGhhc2ggcmVmZXJlbmNlIGNvcnJlc3BvbmRpbmcgdG8KK2VhY2ggZWxlbWVudCBvZiBDPEBpdGVtPi4gVGhlIGVsZW1lbnRzIG9mIHRoZSBoYXNoIHByb3ZpZGUgdGhlCitmb2xsb3dpbmc6CisKKyAgICAkaXRlbXBvc1skbl17b2Zmc2V0fXtmcm9tfSAgIyBWQUxVRSBPRiAkdGhpc29mZnNldCBCRUZPUkUgJGl0ZW1bJG5dCisgICAgJGl0ZW1wb3NbJG5de29mZnNldH17dG99ICAgICMgVkFMVUUgT0YgJHByZXZvZmZzZXQgQUZURVIgJGl0ZW1bJG5dCisgICAgJGl0ZW1wb3NbJG5de2xpbmV9e2Zyb219ICAgICMgVkFMVUUgT0YgJHRoaXNsaW5lIEJFRk9SRSAkaXRlbVskbl0KKyAgICAkaXRlbXBvc1skbl17bGluZX17dG99ICAjIFZBTFVFIE9GICRwcmV2bGluZSBBRlRFUiAkaXRlbVskbl0KKyAgICAkaXRlbXBvc1skbl17Y29sdW1ufXtmcm9tfSAgIyBWQUxVRSBPRiAkdGhpc2NvbHVtbiBCRUZPUkUgJGl0ZW1bJG5dCisgICAgJGl0ZW1wb3NbJG5de2NvbHVtbn17dG99ICAgICMgVkFMVUUgT0YgJHByZXZjb2x1bW4gQUZURVIgJGl0ZW1bJG5dCisKK05vdGUgdGhhdCB0aGUgdmFyaW91cyBDPCRpdGVtcG9zWyRuXS4uLntmcm9tfT4gdmFsdWVzIHJlY29yZCB0aGUKK2FwcHJvcHJpYXRlIHZhbHVlIEk8YWZ0ZXI+IGFueSB0b2tlbiBwcmVmaXggaGFzIGJlZW4gc2tpcHBlZC4KKworSGVuY2UsIGluc3RlYWQgb2YgdGhlIHNvbWV3aGF0IHRlZGlvdXMgYW5kIGVycm9yLXByb25lOgorCisgICAgcnVsZTogc3RhcnRjb2wgdG9rZW4xIGVuZGNvbAorICAgICAgc3RhcnRjb2wgdG9rZW4yIGVuZGNvbAorICAgICAgc3RhcnRjb2wgdG9rZW4zIGVuZGNvbAorICAgICAgICB7IHByaW50ICJ0b2tlbjE6IGNvbHVtbnMgJGl0ZW1bMV0KKyAgICAgICAgICAgICAgdG8gJGl0ZW1bM10KKyAgICAgICAgIHRva2VuMjogY29sdW1ucyAkaXRlbVs0XQorICAgICAgICAgICAgICB0byAkaXRlbVs2XQorICAgICAgICAgdG9rZW4zOiBjb2x1bW5zICRpdGVtWzddCisgICAgICAgICAgICAgIHRvICRpdGVtWzldIiB9CisKKyAgICBzdGFydGNvbDogJycgeyAkdGhpc2NvbHVtbiB9ICAgICMgTkVFRCBUSEUgJycgVE8gU1RFUCBQQVNUIFRPS0VOIFNFUAorICAgIGVuZGNvbDogIHsgJHByZXZjb2x1bW4gfQorCitpdCBpcyBwb3NzaWJsZSB0byB3cml0ZToKKworICAgIHJ1bGU6IHRva2VuMSB0b2tlbjIgdG9rZW4zCisgICAgICAgIHsgcHJpbnQgInRva2VuMTogY29sdW1ucyAkaXRlbXBvc1sxXXtjb2x1bW59e2Zyb219CisgICAgICAgICAgICAgIHRvICRpdGVtcG9zWzFde2NvbHVtbn17dG99CisgICAgICAgICB0b2tlbjI6IGNvbHVtbnMgJGl0ZW1wb3NbMl17Y29sdW1ufXtmcm9tfQorICAgICAgICAgICAgICB0byAkaXRlbXBvc1syXXtjb2x1bW59e3RvfQorICAgICAgICAgdG9rZW4zOiBjb2x1bW5zICRpdGVtcG9zWzNde2NvbHVtbn17ZnJvbX0KKyAgICAgICAgICAgICAgdG8gJGl0ZW1wb3NbM117Y29sdW1ufXt0b30iIH0KKworTm90ZSBob3dldmVyIHRoYXQgKGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uKSB0aGUgdXNlIG9mIEM8QGl0ZW1wb3M+Cithbnl3aGVyZSBpbiBhIGdyYW1tYXIgaW1wbGllcyB0aGF0IGl0ZW0gcG9zaXRpb25pbmcgaW5mb3JtYXRpb24gaXMKK2NvbGxlY3RlZCBJPGV2ZXJ5d2hlcmU+IGR1cmluZyB0aGUgcGFyc2UuIERlcGVuZGluZyBvbiB0aGUgZ3JhbW1hcgorYW5kIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHRvIGJlIHBhcnNlZCwgdGhpcyBtYXkgYmUgcHJvaGliaXRpdmVseQorZXhwZW5zaXZlIGFuZCB0aGUgZXhwbGljaXQgdXNlIG9mIEM8JHRoaXNsaW5lPiwgQzwkdGhpc2NvbHVtbj4sIGV0Yy4gbWF5CitiZSBhIGJldHRlciBjaG9pY2UuCisKKworPWl0ZW0gQzwkdGhpc3BhcnNlcj4KKworQSByZWZlcmVuY2UgdG8gdGhlIFM8QzxQYXJzZTo6UmVjRGVzY2VudD4+IG9iamVjdCB0aHJvdWdoIHdoaWNoCitwYXJzaW5nIHdhcyBpbml0aWF0ZWQuCisKK1RoZSB2YWx1ZSBvZiBDPCR0aGlzcGFyc2VyPiBwcm9wYWdhdGVzIGRvd24gdGhlIHN1YnJ1bGVzIG9mIGEgcGFyc2UKK2J1dCBub3QgYmFjayB1cC4gSGVuY2UsIHlvdSBjYW4gaW52b2tlIHN1YnJ1bGVzIGZyb20gYW5vdGhlciBwYXJzZXIKK2ZvciB0aGUgc2NvcGUgb2YgdGhlIGN1cnJlbnQgcnVsZSBhcyBmb2xsb3dzOgorCisgICAgcnVsZTogc3VicnVsZTEgc3VicnVsZTIKKyAgICB8IHsgJHRoaXNwYXJzZXIgPSAkOjpvdGhlcnBhcnNlciB9IDxyZWplY3Q+CisgICAgfCBzdWJydWxlMyBzdWJydWxlNAorICAgIHwgc3VicnVsZTUKKworVGhlIHJlc3VsdCBpcyB0aGF0IHRoZSBwcm9kdWN0aW9uIGNhbGxzICJzdWJydWxlMSIgYW5kICJzdWJydWxlMiIgb2YKK3RoZSBjdXJyZW50IHBhcnNlciwgYW5kIHRoZSByZW1haW5pbmcgcHJvZHVjdGlvbnMgY2FsbCB0aGUgbmFtZWQgc3VicnVsZXMKK2Zyb20gQzwkOjpvdGhlcnBhcnNlcj4uIE5vdGUsIGhvd2V2ZXIgdGhhdCAiQmFkIFRoaW5ncyIgd2lsbCBoYXBwZW4gaWYKK0M8OjpvdGhlcnBhcnNlcj4gaXNuJ3QgYSBibGVzc2VkIHJlZmVyZW5jZSBhbmQvb3IgZG9lc24ndCBoYXZlIG1ldGhvZHMKK3dpdGggdGhlIHNhbWUgbmFtZXMgYXMgdGhlIHJlcXVpcmVkIHN1YnJ1bGVzIQorCis9aXRlbSBDPCR0aGlzcnVsZT4KKworQSByZWZlcmVuY2UgdG8gdGhlIFM8QzxQYXJzZTo6UmVjRGVzY2VudDo6UnVsZT4+IG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZQorcnVsZSBjdXJyZW50bHkgYmVpbmcgbWF0Y2hlZC4KKworPWl0ZW0gQzwkdGhpc3Byb2Q+CisKK0EgcmVmZXJlbmNlIHRvIHRoZSBTPEM8UGFyc2U6OlJlY0Rlc2NlbnQ6OlByb2R1Y3Rpb24+PiBvYmplY3QKK2NvcnJlc3BvbmRpbmcgdG8gdGhlIHByb2R1Y3Rpb24gY3VycmVudGx5IGJlaW5nIG1hdGNoZWQuCisKKz1pdGVtIEM8JHNjb3JlPiBhbmQgQzwkc2NvcmVfcmV0dXJuPgorCiskc2NvcmUgc3RvcmVzIHRoZSBiZXN0IHByb2R1Y3Rpb24gc2NvcmUgdG8gZGF0ZSwgYXMgc3BlY2lmaWVkIGJ5CithbiBlYXJsaWVyIEM8RTxsdD5zY29yZTouLi5FPGd0Pj4gZGlyZWN0aXZlLiAkc2NvcmVfcmV0dXJuIHN0b3JlcwordGhlIGNvcnJlc3BvbmRpbmcgcmV0dXJuIHZhbHVlIGZvciB0aGUgc3VjY2Vzc2Z1bCBwcm9kdWN0aW9uLgorCitTZWUgTDxTY29yZWQgcHJvZHVjdGlvbnM+LgorCis9YmFjaworCitCPFdhcm5pbmc6PiB0aGUgcGFyc2VyIHJlbGllcyBvbiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHZhcmlvdXMgQzx0aGlzLi4uPgorb2JqZWN0cyBpbiBzb21lIG5vbi1vYnZpb3VzIHdheXMuIFRpbmtlcmluZyB3aXRoIHRoZSBvdGhlciBtZW1iZXJzIG9mCit0aGVzZSBvYmplY3RzIHdpbGwgcHJvYmFibHkgY2F1c2UgQmFkIFRoaW5ncyB0byBoYXBwZW4sIHVubGVzcyB5b3UKK0k8cmVhbGx5PiBrbm93IHdoYXQgeW91J3JlIGRvaW5nLiBUaGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBhZHZpY2UgaXMKK3RoYXQgdGhlIHVzZSBvZiBDPCR0aGlzLi4uLUU8Z3Q+e2xvY2FsfT4gaXMgYWx3YXlzIHNhZmUuCisKKworPWhlYWQyIFN0YXJ0LXVwIEFjdGlvbnMKKworQW55IGFjdGlvbnMgd2hpY2ggYXBwZWFyIEk8YmVmb3JlPiB0aGUgZmlyc3QgcnVsZSBkZWZpbml0aW9uIGluIGEKK2dyYW1tYXIgYXJlIHRyZWF0ZWQgYXMgInN0YXJ0LXVwIiBhY3Rpb25zLiBFYWNoIHN1Y2ggYWN0aW9uIGlzCitzdHJpcHBlZCBvZiBpdHMgb3V0ZXJtb3N0IGJyYWNrZXRzIGFuZCB0aGVuIGV2YWx1YXRlZCAoaW4gdGhlIHBhcnNlcidzCitzcGVjaWFsIG5hbWVzcGFjZSkganVzdCBiZWZvcmUgdGhlIHJ1bGVzIG9mIHRoZSBncmFtbWFyIGFyZSBmaXJzdAorY29tcGlsZWQuCisKK1RoZSBtYWluIHVzZSBvZiBzdGFydC11cCBhY3Rpb25zIGlzIHRvIGRlY2xhcmUgbG9jYWwgdmFyaWFibGVzIHdpdGhpbiB0aGUKK3BhcnNlcidzIHNwZWNpYWwgbmFtZXNwYWNlOgorCisgICAgeyBteSAkbGFzdGl0ZW0gPSAnPz8/JzsgfQorCisgICAgbGlzdDogaXRlbShzKSAgIHsgJHJldHVybiA9ICRsYXN0aXRlbSB9CisKKyAgICBpdGVtOiBib29rICB7ICRsYXN0aXRlbSA9ICdib29rJzsgfQorICAgICAgYmVsbCAgeyAkbGFzdGl0ZW0gPSAnYmVsbCc7IH0KKyAgICAgIGNhbmRsZSAgICB7ICRsYXN0aXRlbSA9ICdjYW5kbGUnOyB9CisKK2J1dCBzdGFydC11cCBhY3Rpb25zIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgSTxhbnk+IHZhbGlkIFBlcmwgY29kZQord2l0aGluIGEgcGFyc2VyJ3Mgc3BlY2lhbCBuYW1lc3BhY2UuCisKK1N0YXJ0LXVwIGFjdGlvbnMgY2FuIGFwcGVhciB3aXRoaW4gYSBncmFtbWFyIGV4dGVuc2lvbiBvciByZXBsYWNlbWVudAorKHRoYXQgaXMsIGEgcGFydGlhbCBncmFtbWFyIGluc3RhbGxlZCB2aWEgQzxQYXJzZTo6UmVjRGVzY2VudDo6RXh0ZW5kKCk+IG9yCitDPFBhcnNlOjpSZWNEZXNjZW50OjpSZXBsYWNlKCk+IC0gc2VlIEw8SW5jcmVtZW50YWwgUGFyc2luZz4pLCBhbmQgd2lsbCBiZQorZXhlY3V0ZWQgYmVmb3JlIHRoZSBuZXcgZ3JhbW1hciBpcyBpbnN0YWxsZWQuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgYQorcGFydGljdWxhciBzdGFydC11cCBhY3Rpb24gaXMgb25seSBldmVyIGV4ZWN1dGVkIG9uY2UuCisKKworPWhlYWQyIEF1dG9hY3Rpb25zCisKK0l0IGlzIHNvbWV0aW1lcyBkZXNpcmFibGUgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGEgZGVmYXVsdCBhY3Rpb24gdG8gYmUKK3Rha2VuIGF0IHRoZSBlbmQgb2YgZXZlcnkgcHJvZHVjdGlvbiAoZm9yIGV4YW1wbGUsIGluIG9yZGVyIHRvIGVhc2lseQorYnVpbGQgYSBwYXJzZSB0cmVlKS4gSWYgdGhlIHZhcmlhYmxlIEM8JDo6UkRfQVVUT0FDVElPTj4gaXMgZGVmaW5lZAord2hlbiBDPFBhcnNlOjpSZWNEZXNjZW50OjpuZXcoKT4gaXMgY2FsbGVkLCB0aGUgY29udGVudHMgb2YgdGhhdAordmFyaWFibGUgYXJlIHRyZWF0ZWQgYXMgYSBzcGVjaWZpY2F0aW9uIG9mIGFuIGFjdGlvbiB3aGljaCBpcyB0byBhcHBlbmRlZAordG8gZWFjaCBwcm9kdWN0aW9uIGluIHRoZSBjb3JyZXNwb25kaW5nIGdyYW1tYXIuCisKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gaGFyZC1jb2RlIHRoZSBhdXRvYWN0aW9uIHdpdGhpbiBhIGdyYW1tYXIsIHVzaW5nIHRoZQorQzw8IDxhdXRvYWN0aW9uOi4uLj4gPj4gZGlyZWN0aXZlLgorCitTbywgZm9yIGV4YW1wbGUsIHRvIGNvbnN0cnVjdCBhIHNpbXBsZSBwYXJzZSB0cmVlIHlvdSBjb3VsZCB3cml0ZToKKworICAgICQ6OlJEX0FVVE9BQ1RJT04gPSBxIHsgW0BpdGVtXSB9OworCisgICAgcGFyc2VyID0gUGFyc2U6OlJlY0Rlc2NlbnQtPm5ldyhxeworICAgIGV4cHJlc3Npb246IGFuZF9leHByICd8fCcgZXhwcmVzc2lvbiB8IGFuZF9leHByCisgICAgYW5kX2V4cHI6ICAgbm90X2V4cHIgJyYmJyBhbmRfZXhwciAgIHwgbm90X2V4cHIKKyAgICBub3RfZXhwcjogICAnIScgYnJhY2tfZXhwciAgICAgICB8IGJyYWNrX2V4cHIKKyAgICBicmFja19leHByOiAnKCcgZXhwcmVzc2lvbiAnKScgICAgICAgfCBpZGVudGlmaWVyCisgICAgaWRlbnRpZmllcjogL1thLXpdKy9pCisgICAgfSk7CisKK29yOgorCisgICAgcGFyc2VyID0gUGFyc2U6OlJlY0Rlc2NlbnQtPm5ldyhxeworICAgIDxhdXRvYWN0aW9uOiB7IFtAaXRlbV0gfSA+CisKKyAgICBleHByZXNzaW9uOiBhbmRfZXhwciAnfHwnIGV4cHJlc3Npb24gfCBhbmRfZXhwcgorICAgIGFuZF9leHByOiAgIG5vdF9leHByICcmJicgYW5kX2V4cHIgICB8IG5vdF9leHByCisgICAgbm90X2V4cHI6ICAgJyEnIGJyYWNrX2V4cHIgICAgICAgfCBicmFja19leHByCisgICAgYnJhY2tfZXhwcjogJygnIGV4cHJlc3Npb24gJyknICAgICAgIHwgaWRlbnRpZmllcgorICAgIGlkZW50aWZpZXI6IC9bYS16XSsvaQorICAgIH0pOworCitFaXRoZXIgb2YgdGhlc2UgaXMgZXF1aXZhbGVudCB0bzoKKworICAgIHBhcnNlciA9IG5ldyBQYXJzZTo6UmVjRGVzY2VudCAocXsKKyAgICBleHByZXNzaW9uOiBhbmRfZXhwciAnfHwnIGV4cHJlc3Npb24KKyAgICAgICAgeyBbQGl0ZW1dIH0KKyAgICAgIHwgYW5kX2V4cHIKKyAgICAgICAgeyBbQGl0ZW1dIH0KKworICAgIGFuZF9leHByOiAgIG5vdF9leHByICcmJicgYW5kX2V4cHIKKyAgICAgICAgeyBbQGl0ZW1dIH0KKyAgICB8ICAgbm90X2V4cHIKKyAgICAgICAgeyBbQGl0ZW1dIH0KKworICAgIG5vdF9leHByOiAgICchJyBicmFja19leHByCisgICAgICAgIHsgW0BpdGVtXSB9CisgICAgfCAgIGJyYWNrX2V4cHIKKyAgICAgICAgeyBbQGl0ZW1dIH0KKworICAgIGJyYWNrX2V4cHI6ICcoJyBleHByZXNzaW9uICcpJworICAgICAgICB7IFtAaXRlbV0gfQorICAgICAgfCBpZGVudGlmaWVyCisgICAgICAgIHsgW0BpdGVtXSB9CisKKyAgICBpZGVudGlmaWVyOiAvW2Etel0rL2kKKyAgICAgICAgeyBbQGl0ZW1dIH0KKyAgICB9KTsKKworQWx0ZXJuYXRpdmVseSwgd2UgY291bGQgdGFrZSBhbiBvYmplY3Qtb3JpZW50ZWQgYXBwcm9hY2gsIHVzZSBkaWZmZXJlbnQKK2NsYXNzZXMgZm9yIGVhY2ggbm9kZSAoYW5kIGFsc28gZWxpbWluYXRpbmcgcmVkdW5kYW50IGludGVybWVkaWF0ZSBub2Rlcyk6CisKKyAgICAkOjpSRF9BVVRPQUNUSU9OID0gcQorICAgICAgeyAkI2l0ZW09PTEgPyAkaXRlbVsxXSA6ICIkaXRlbVswXV9ub2RlIi0+bmV3KEBpdGVtWzEuLiQjaXRlbV0pIH07CisKKyAgICBwYXJzZXIgPSBQYXJzZTo6UmVjRGVzY2VudC0+bmV3KHF7CisgICAgICAgIGV4cHJlc3Npb246IGFuZF9leHByICd8fCcgZXhwcmVzc2lvbiB8IGFuZF9leHByCisgICAgICAgIGFuZF9leHByOiAgIG5vdF9leHByICcmJicgYW5kX2V4cHIgICB8IG5vdF9leHByCisgICAgICAgIG5vdF9leHByOiAgICchJyBicmFja19leHByICAgICAgICAgICB8IGJyYWNrX2V4cHIKKyAgICAgICAgYnJhY2tfZXhwcjogJygnIGV4cHJlc3Npb24gJyknICAgICAgIHwgaWRlbnRpZmllcgorICAgICAgICBpZGVudGlmaWVyOiAvW2Etel0rL2kKKyAgICB9KTsKKworb3I6CisKKyAgICBwYXJzZXIgPSBQYXJzZTo6UmVjRGVzY2VudC0+bmV3KHF7CisgICAgICAgIDxhdXRvYWN0aW9uOgorICAgICAgICAgICQjaXRlbT09MSA/ICRpdGVtWzFdIDogIiRpdGVtWzBdX25vZGUiLT5uZXcoQGl0ZW1bMS4uJCNpdGVtXSkKKyAgICAgICAgPgorCisgICAgICAgIGV4cHJlc3Npb246IGFuZF9leHByICd8fCcgZXhwcmVzc2lvbiB8IGFuZF9leHByCisgICAgICAgIGFuZF9leHByOiAgIG5vdF9leHByICcmJicgYW5kX2V4cHIgICB8IG5vdF9leHByCisgICAgICAgIG5vdF9leHByOiAgICchJyBicmFja19leHByICAgICAgICAgICB8IGJyYWNrX2V4cHIKKyAgICAgICAgYnJhY2tfZXhwcjogJygnIGV4cHJlc3Npb24gJyknICAgICAgIHwgaWRlbnRpZmllcgorICAgICAgICBpZGVudGlmaWVyOiAvW2Etel0rL2kKKyAgICB9KTsKKword2hpY2ggYXJlIGVxdWl2YWxlbnQgdG86CisKKyAgICBwYXJzZXIgPSBQYXJzZTo6UmVjRGVzY2VudC0+bmV3KHF7CisgICAgICAgIGV4cHJlc3Npb246IGFuZF9leHByICd8fCcgZXhwcmVzc2lvbgorICAgICAgICAgICAgeyAiZXhwcmVzc2lvbl9ub2RlIi0+bmV3KEBpdGVtWzEuLjNdKSB9CisgICAgICAgIHwgYW5kX2V4cHIKKworICAgICAgICBhbmRfZXhwcjogICBub3RfZXhwciAnJiYnIGFuZF9leHByCisgICAgICAgICAgICB7ICJhbmRfZXhwcl9ub2RlIi0+bmV3KEBpdGVtWzEuLjNdKSB9CisgICAgICAgIHwgICBub3RfZXhwcgorCisgICAgICAgIG5vdF9leHByOiAgICchJyBicmFja19leHByCisgICAgICAgICAgICB7ICJub3RfZXhwcl9ub2RlIi0+bmV3KEBpdGVtWzEuLjJdKSB9CisgICAgICAgIHwgICBicmFja19leHByCisKKyAgICAgICAgYnJhY2tfZXhwcjogJygnIGV4cHJlc3Npb24gJyknCisgICAgICAgICAgICB7ICJicmFja19leHByX25vZGUiLT5uZXcoQGl0ZW1bMS4uM10pIH0KKyAgICAgICAgfCBpZGVudGlmaWVyCisKKyAgICAgICAgaWRlbnRpZmllcjogL1thLXpdKy9pCisgICAgICAgICAgICB7ICJpZGVudGlmZXJfbm9kZSItPm5ldyhAaXRlbVsxXSkgfQorICAgIH0pOworCitOb3RlIHRoYXQsIGlmIGEgcHJvZHVjdGlvbiBhbHJlYWR5IGVuZHMgaW4gYW4gYWN0aW9uLCBubyBhdXRvYWN0aW9uIGlzIGFwcGVuZGVkCit0byBpdC4gRm9yIGV4YW1wbGUsIGluIHRoaXMgdmVyc2lvbjoKKworICAgICQ6OlJEX0FVVE9BQ1RJT04gPSBxCisgICAgICB7ICQjaXRlbT09MSA/ICRpdGVtWzFdIDogIiRpdGVtWzBdX25vZGUiLT5uZXcoQGl0ZW1bMS4uJCNpdGVtXSkgfTsKKworICAgIHBhcnNlciA9IFBhcnNlOjpSZWNEZXNjZW50LT5uZXcocXsKKyAgICAgICAgZXhwcmVzc2lvbjogYW5kX2V4cHIgJyYmJyBleHByZXNzaW9uIHwgYW5kX2V4cHIKKyAgICAgICAgYW5kX2V4cHI6ICAgbm90X2V4cHIgJyYmJyBhbmRfZXhwciAgIHwgbm90X2V4cHIKKyAgICAgICAgbm90X2V4cHI6ICAgJyEnIGJyYWNrX2V4cHIgICAgICAgICAgIHwgYnJhY2tfZXhwcgorICAgICAgICBicmFja19leHByOiAnKCcgZXhwcmVzc2lvbiAnKScgICAgICAgfCBpZGVudGlmaWVyCisgICAgICAgIGlkZW50aWZpZXI6IC9bYS16XSsvaQorICAgICAgICAgICAgeyAndGVybWluYWxfbm9kZSctPm5ldygkaXRlbVsxXSkgfQorICAgIH0pOworCitlYWNoIEM8aWRlbnRpZmllcj4gbWF0Y2ggcHJvZHVjZXMgYSBDPHRlcm1pbmFsX25vZGU+IG9iamVjdCwgSTxub3Q+IGFuCitDPGlkZW50aWZpZXJfbm9kZT4gb2JqZWN0LgorCitBIGxldmVsIDEgd2FybmluZyBpcyBpc3N1ZWQgZWFjaCB0aW1lIGFuICJhdXRvYWN0aW9uIiBpcyBhZGRlZCB0bworc29tZSBwcm9kdWN0aW9uLgorCisKKz1oZWFkMiBBdXRvdHJlZXMKKworQSBjb21tb25seSBuZWVkZWQgYXV0b2FjdGlvbiBpcyBvbmUgdGhhdCBidWlsZHMgYSBwYXJzZS10cmVlLiBJdCBpcyBtb2RlcmF0ZWx5Cit0cmlja3kgdG8gc2V0IHVwIHN1Y2ggYW4gYWN0aW9uICh3aGljaCBtdXN0IHRyZWF0IHRlcm1pbmFscyBkaWZmZXJlbnRseSBmcm9tCitub24tdGVybWluYWxzKSwgc28gUGFyc2U6OlJlY0Rlc2NlbnQgc2ltcGxpZmllcyB0aGUgcHJvY2VzcyBieSBwcm92aWRpbmcgdGhlCitDPEU8bHQ+YXV0b3RyZWVFPGd0Pj4gZGlyZWN0aXZlLgorCitJZiB0aGlzIGRpcmVjdGl2ZSBhcHBlYXJzIGF0IHRoZSBzdGFydCBvZiBncmFtbWFyLCBpdCBjYXVzZXMKK1BhcnNlOjpSZWNEZXNjZW50IHRvIGluc2VydCBhdXRvYWN0aW9ucyBhdCB0aGUgZW5kIG9mIGFueSBydWxlIGV4Y2VwdAordGhvc2Ugd2hpY2ggYWxyZWFkeSBlbmQgaW4gYW4gYWN0aW9uLiBUaGUgYWN0aW9uIGluc2VydGVkIGRlcGVuZHMgb24gd2hldGhlcgordGhlIHByb2R1Y3Rpb24gaXMgYW4gaW50ZXJtZWRpYXRlIHJ1bGUgKHR3byBvciBtb3JlIGl0ZW1zKSwgb3IgYSB0ZXJtaW5hbAorb2YgdGhlIGdyYW1tYXIgKGkuZS4gYSBzaW5nbGUgcGF0dGVybiBvciBzdHJpbmcgaXRlbSkuCisKK1NvLCBmb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBncmFtbWFyOgorCisgICAgPGF1dG90cmVlPgorCisgICAgZmlsZSAgICA6IGNvbW1hbmQocykKKyAgICBjb21tYW5kIDogZ2V0IHwgc2V0IHwgdmV0CisgICAgZ2V0IDogJ2dldCcgaWRlbnQgJzsnCisgICAgc2V0IDogJ3NldCcgaWRlbnQgJ3RvJyB2YWx1ZSAnOycKKyAgICB2ZXQgOiAnY2hlY2snIGlkZW50ICdpcycgdmFsdWUgJzsnCisgICAgaWRlbnQgICA6IC9cdysvCisgICAgdmFsdWUgICA6IC9cZCsvCisKK2lzIGVxdWl2YWxlbnQgdG86CisKKyAgICBmaWxlICAgIDogY29tbWFuZChzKSAgICAgICAgeyBibGVzcyBcJWl0ZW0sICRpdGVtWzBdIH0KKyAgICBjb21tYW5kIDogZ2V0ICAgICAgIHsgYmxlc3MgXCVpdGVtLCAkaXRlbVswXSB9CisgICAgfCBzZXQgICAgICAgICAgIHsgYmxlc3MgXCVpdGVtLCAkaXRlbVswXSB9CisgICAgfCB2ZXQgICAgICAgICAgIHsgYmxlc3MgXCVpdGVtLCAkaXRlbVswXSB9CisgICAgZ2V0IDogJ2dldCcgaWRlbnQgJzsnICAgeyBibGVzcyBcJWl0ZW0sICRpdGVtWzBdIH0KKyAgICBzZXQgOiAnc2V0JyBpZGVudCAndG8nIHZhbHVlICc7JyAgICB7IGJsZXNzIFwlaXRlbSwgJGl0ZW1bMF0gfQorICAgIHZldCA6ICdjaGVjaycgaWRlbnQgJ2lzJyB2YWx1ZSAnOycgIHsgYmxlc3MgXCVpdGVtLCAkaXRlbVswXSB9CisKKyAgICBpZGVudCAgIDogL1x3Ky8gIHsgYmxlc3Mge19fVkFMVUVfXz0+JGl0ZW1bMV19LCAkaXRlbVswXSB9CisgICAgdmFsdWUgICA6IC9cZCsvICB7IGJsZXNzIHtfX1ZBTFVFX189PiRpdGVtWzFdfSwgJGl0ZW1bMF0gfQorCitOb3RlIHRoYXQgZWFjaCBub2RlIGluIHRoZSB0cmVlIGlzIGJsZXNzZWQgaW50byBhIGNsYXNzIG9mIHRoZSBzYW1lIG5hbWUKK2FzIHRoZSBydWxlIGl0c2VsZi4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIG9iamVjdC1vcmllbnRlZAorcHJvY2Vzc29ycyBmb3IgdGhlIHBhcnNlLXRyZWVzIHRoYXQgdGhlIGdyYW1tYXIgcHJvZHVjZXMuIE5vdGUgdG9vIHRoYXQKK3RoZSBsYXN0IHR3byBydWxlcyBwcm9kdWNlIHNwZWNpYWwgb2JqZWN0cyB3aXRoIHRoZSBzaW5nbGUgYXR0cmlidXRlCisnX19WQUxVRV9fJy4gVGhpcyBpcyBiZWNhdXNlIHRoZXkgY29uc2lzdCBzb2xlbHkgb2YgYSBzaW5nbGUgdGVybWluYWwuCisKK1RoaXMgYXV0b2FjdGlvbi1lZCBncmFtbWFyIHdvdWxkIHRoZW4gcHJvZHVjZSBhIHBhcnNlIHRyZWUgaW4gYSBkYXRhCitzdHJ1Y3R1cmUgbGlrZSB0aGlzOgorCisgICAgeworICAgICAgZmlsZSA9PiB7CisgICAgICAgIGNvbW1hbmQgPT4geworICAgICAgICAgWyBnZXQgPT4geworICAgICAgICAgICAgaWRlbnRpZmllciA9PiB7IF9fVkFMVUVfXyA9PiAnYScgfSwKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgc2V0ID0+IHsKKyAgICAgICAgICAgIGlkZW50aWZpZXIgPT4geyBfX1ZBTFVFX18gPT4gJ2InIH0sCisgICAgICAgICAgICB2YWx1ZSAgICAgID0+IHsgX19WQUxVRV9fID0+ICc3JyB9LAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICB2ZXQgPT4geworICAgICAgICAgICAgaWRlbnRpZmllciA9PiB7IF9fVkFMVUVfXyA9PiAnYicgfSwKKyAgICAgICAgICAgIHZhbHVlICAgICAgPT4geyBfX1ZBTFVFX18gPT4gJzcnIH0sCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgXSwKKyAgICAgICAgICAgfSwKKyAgICAgIH0KKyAgICB9CisKKyhleGNlcHQsIG9mIGNvdXJzZSwgdGhhdCBlYWNoIG5lc3RlZCBoYXNoIHdvdWxkIGFsc28gYmUgYmxlc3NlZCBpbnRvCit0aGUgYXBwcm9wcmlhdGUgY2xhc3MpLgorCitZb3UgY2FuIGFsc28gc3BlY2lmeSBhIGJhc2UgY2xhc3MgZm9yIHRoZSBDPEU8bHQ+YXV0b3RyZWVFPGd0Pj4gZGlyZWN0aXZlLgorVGhlIHN1cHBsaWVkIHByZWZpeCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgcnVsZSBuYW1lcyB3aGVuIGNyZWF0aW5nCit0cmVlIG5vZGVzLiAgVGhlIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDoKKworICAgIDxhdXRvdHJlZTpNeUJhc2U6OkNsYXNzPgorICAgIDxhdXRvdHJlZTpNeUJhc2U6OkNsYXNzOjo+CisKK0FuZCB3aWxsIHByb2R1Y2UgYSByb290IG5vZGUgYmxlc3NlZCBpbnRvIHRoZSBDPE15QmFzZTo6Q2xhc3M6OmZpbGU+CitwYWNrYWdlIGluIHRoZSBleGFtcGxlIGFib3ZlLgorCisKKz1oZWFkMiBBdXRvc3R1YmJpbmcKKworTm9ybWFsbHksIGlmIGEgc3VicnVsZSBhcHBlYXJzIGluIHNvbWUgcHJvZHVjdGlvbiwgYnV0IG5vIHJ1bGUgb2YgdGhhdAorbmFtZSBpcyBldmVyIGRlZmluZWQgaW4gdGhlIGdyYW1tYXIsIHRoZSBwcm9kdWN0aW9uIHdoaWNoIHJlZmVycyB0byB0aGUKK25vbi1leGlzdGVudCBzdWJydWxlIGZhaWxzIGltbWVkaWF0ZWx5LiBUaGlzIHR5cGljYWxseSBvY2N1cnMgYXMgYQorcmVzdWx0IG9mIG1pc3NwZWxsaW5ncywgYW5kIGlzIGEgc3VmZmljaWVudGx5IGNvbW1vbiBvY2N1cmFuY2UgdGhhdCBhCit3YXJuaW5nIGlzIGdlbmVyYXRlZCBmb3Igc3VjaCBzaXR1YXRpb25zLgorCitIb3dldmVyLCB3aGVuIHByb3RvdHlwaW5nIGEgZ3JhbW1hciBpdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIGJlCithYmxlIHRvIHVzZSBzdWJydWxlcyBiZWZvcmUgYSBwcm9wZXIgc3BlY2lmaWNhdGlvbiBvZiB0aGVtIGlzCityZWFsbHkgcG9zc2libGUuICBGb3IgZXhhbXBsZSwgYSBncmFtbWFyIG1pZ2h0IGluY2x1ZGUgYSBzZWN0aW9uIGxpa2U6CisKKyAgICBmdW5jdGlvbl9jYWxsOiBpZGVudGlmaWVyICcoJyBhcmcocz8pICcpJworCisgICAgaWRlbnRpZmllcjogL1thLXpdXHcqL2kKKword2hlcmUgdGhlIHBvc3NpYmxlIGZvcm1hdCBvZiBhbiBhcmd1bWVudCBpcyBzdWZmaWNpZW50bHkgY29tcGxleCB0aGF0CitpdCBpcyBub3Qgd29ydGggc3BlY2lmeWluZyBpbiBmdWxsIHVudGlsIHRoZSBnZW5lcmFsIGZ1bmN0aW9uIGNhbGwKK3N5bnRheCBoYXMgYmVlbiBkZWJ1Z2dlZC4gSW4gdGhpcyBzaXR1YXRpb24gaXQgaXMgY29udmVuaWVudCB0byBsZWF2ZQordGhlIHJlYWwgcnVsZSBDPGFyZz4gdW5kZWZpbmVkIGFuZCBqdXN0IHNsaXAgaW4gYSBwbGFjZWhvbGRlciAob3IKKyJzdHViIik6CisKKyAgICBhcmc6ICdhcmcnCisKK3NvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbGwgc3ludGF4IGNhbiBiZSB0ZXN0ZWQgd2l0aCBkdW1teSBpbnB1dCBzdWNoIGFzOgorCisgICAgZjAoKQorICAgIGYxKGFyZykKKyAgICBmMihhcmcgYXJnKQorICAgIGYzKGFyZyBhcmcgYXJnKQorCitldCBjZXRlcmEuCisKK0Vhcmx5IGluIHByb3RvdHlwaW5nLCBtYW55IHN1Y2ggInN0dWJzIiBtYXkgYmUgcmVxdWlyZWQsIHNvCitDPFBhcnNlOjpSZWNEZXNjZW50PiBwcm92aWRlcyBhIG1lYW5zIG9mIGF1dG9tYXRpbmcgdGhlaXIgZGVmaW5pdGlvbi4KK0lmIHRoZSB2YXJpYWJsZSBDPCQ6OlJEX0FVVE9TVFVCPiBpcyBkZWZpbmVkIHdoZW4gYSBwYXJzZXIgaXMgYnVpbHQsIGEKK3N1YnJ1bGUgcmVmZXJlbmNlIHRvIGFueSBub24tZXhpc3RlbnQgcnVsZSAoc2F5LCBDPHN1YnJ1bGU+KSwgd2lsbAorY2F1c2UgYSAic3R1YiIgcnVsZSB0byBiZSBhdXRvbWF0aWNhbGx5IGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZAorcGFyc2VyLiAgSWYgQzwkOjpSRF9BVVRPU1RVQiBlcSAnMSc+IG9yIGlzIGZhbHNlLCBhIHN0dWIgcnVsZSBvZiB0aGUKK2Zvcm06CisKKyAgICBzdWJydWxlOiAnc3VicnVsZScKKword2lsbCBiZSBnZW5lcmF0ZWQuICBUaGUgc3BlY2lhbC1jYXNlIGZvciBhIHZhbHVlIG9mIEM8JzEnPiBpcyB0byBhbGxvdwordGhlIHVzZSBvZiB0aGUgQjxwZXJsIC1zPiB3aXRoIEI8LVJEX0FVVE9TVFVCPiB3aXRob3V0IGdlbmVyYXRpbmcKK0M8c3VicnVsZTogJzEnPiBwZXIgYmVsb3cuIElmIEM8JDo6UkRfQVVUT1NUVUI+IGlzIHRydWUsIGEgc3R1YiBydWxlCitvZiB0aGUgZm9ybToKKworICAgIHN1YnJ1bGU6ICQ6OlJEX0FVVE9TVFVCCisKK3dpbGwgYmUgZ2VuZXJhdGVkLiAgQzwkOjpSRF9BVVRPU1RVQj4gbXVzdCBjb250YWluIGEgdmFsaWQgcHJvZHVjdGlvbgoraXRlbSwgbm8gY2hlY2tpbmcgaXMgcGVyZm9ybWVkLiAgTm8gbGF6eSBldmFsdWF0aW9uIG9mCitDPCQ6OlJEX0FVVE9TVFVCPiBpcyBwZXJmb3JtZWQsIGl0IGlzIGV2YWx1YXRlZCBhdCB0aGUgdGltZSB0aGUgUGFyc2VyCitpcyBnZW5lcmF0ZWQuCisKK0hlbmNlLCB3aXRoIEM8JDo6UkRfQVVUT1NUVUI+IGRlZmluZWQsIGl0IGlzIHBvc3NpYmxlIHRvIG9ubHkKK3BhcnRpYWxseSBzcGVjaWZ5IGEgZ3JhbW1hciwgYW5kIHRoZW4gImZha2UiIG1hdGNoZXMgb2YgdGhlCit1bnNwZWNpZmllZCAoc3ViKXJ1bGVzIGJ5IGp1c3QgdHlwaW5nIGluIHRoZWlyIG5hbWUsIG9yIGEgbGl0ZXJhbAordmFsdWUgdGhhdCB3YXMgYXNzaWduZWQgdG8gQzwkOjpSRF9BVVRPU1RVQj4uCisKKworCis9aGVhZDIgTG9vay1haGVhZAorCitJZiBhIHN1YnJ1bGUsIHRva2VuLCBvciBhY3Rpb24gaXMgcHJlZml4ZWQgYnkgIi4uLiIsIHRoZW4gaXQgaXMKK3RyZWF0ZWQgYXMgYSAibG9vay1haGVhZCIgcmVxdWVzdC4gVGhhdCBtZWFucyB0aGF0IHRoZSBjdXJyZW50IHByb2R1Y3Rpb24gY2FuCisoYXMgdXN1YWwpIG9ubHkgc3VjY2VlZCBpZiB0aGUgc3BlY2lmaWVkIGl0ZW0gaXMgbWF0Y2hlZCwgYnV0IHRoYXQgdGhlIG1hdGNoaW5nCitJPGRvZXMgbm90IGNvbnN1bWUgYW55IG9mIHRoZSB0ZXh0IGJlaW5nIHBhcnNlZD4uIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZQorQzwvKD89Li4uKS8+IGxvb2stYWhlYWQgY29uc3RydWN0IGluIFBlcmwgcGF0dGVybnMuIFRodXMsIHRoZSBydWxlOgorCisgICAgaW5uZXJfd29yZDogd29yZCAuLi53b3JkCisKK3dpbGwgbWF0Y2ggd2hhdGV2ZXIgdGhlIHN1YnJ1bGUgIndvcmQiIG1hdGNoZXMsIHByb3ZpZGVkIHRoYXQgbWF0Y2ggaXMgZm9sbG93ZWQKK2J5IHNvbWUgbW9yZSB0ZXh0IHdoaWNoIHN1YnJ1bGUgIndvcmQiIHdvdWxkIGFsc28gbWF0Y2ggKGFsdGhvdWdoIHRoaXMKK3NlY29uZCBzdWJzdHJpbmcgaXMgbm90IGFjdHVhbGx5IGNvbnN1bWVkIGJ5ICJpbm5lcl93b3JkIikKKworTGlrZXdpc2UsIGEgIi4uLiEiIHByZWZpeCwgY2F1c2VzIHRoZSBmb2xsb3dpbmcgaXRlbSB0byBzdWNjZWVkICh3aXRob3V0Citjb25zdW1pbmcgYW55IHRleHQpIGlmIGFuZCBvbmx5IGlmIGl0IHdvdWxkIG5vcm1hbGx5IGZhaWwuIEhlbmNlLCBhCitydWxlIHN1Y2ggYXM6CisKKyAgICBpZGVudGlmaWVyOiAuLi4ha2V5d29yZCAuLi4hJ18nIC9bQS1aYS16X11cdyovCisKK21hdGNoZXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB3aGljaCBzYXRpc2ZpZXMgdGhlIHBhdHRlcm4KK0M8L1tBLVphLXpfXVx3Ki8+LCBidXQgb25seSBpZiB0aGUgc2FtZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHdvdWxkCitub3QgbWF0Y2ggZWl0aGVyIHN1YnJ1bGUgImtleXdvcmQiIG9yIHRoZSBsaXRlcmFsIHRva2VuICdfJy4KKworU2VxdWVuY2VzIG9mIGxvb2stYWhlYWQgcHJlZml4ZXMgYWNjdW11bGF0ZSwgbXVsdGlwbHlpbmcgdGhlaXIgcG9zaXRpdmUgYW5kL29yCituZWdhdGl2ZSBzZW5zZXMuIEhlbmNlOgorCisgICAgaW5uZXJfd29yZDogd29yZCAuLi4hLi4uLi4uIXdvcmQKKworaXMgZXhhY3RseSBlcXVpdmFsZW50IHRoZSB0aGUgb3JpZ2luYWwgZXhhbXBsZSBhYm92ZSAoYSB3YXJuaW5nIGlzIGlzc3VlZCBpbgorY2FzZXMgbGlrZSB0aGVzZSwgc2luY2UgdGhleSBvZnRlbiBpbmRpY2F0ZSBzb21ldGhpbmcgbGVmdCBvdXQsIG9yCittaXN1bmRlcnN0b29kKS4KKworTm90ZSB0aGF0IGFjdGlvbnMgY2FuIGFsc28gYmUgdHJlYXRlZCBhcyBsb29rLWFoZWFkcy4gSW4gc3VjaCBjYXNlcywKK3RoZSBzdGF0ZSBvZiB0aGUgcGFyc2VyIHRleHQgKGluIHRoZSBsb2NhbCB2YXJpYWJsZSBDPCR0ZXh0PikKK0k8YWZ0ZXI+IHRoZSBsb29rLWFoZWFkIGFjdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIGlkZW50aWNhbCB0byBpdHMKK3N0YXRlIEk8YmVmb3JlPiB0aGUgYWN0aW9uLCByZWdhcmRsZXNzIG9mIGhvdyBpdCdzIGNoYW5nZWQgSTx3aXRoaW4+Cit0aGUgYWN0aW9uICh1bmxlc3MgeW91IGFjdHVhbGx5IHVuZGVmaW5lIEM8JHRleHQ+LCBpbiB3aGljaCBjYXNlIHlvdQorZ2V0IHRoZSBkaXNhc3RlciB5b3UgZGVzZXJ2ZSA6LSkuCisKKworPWhlYWQyIERpcmVjdGl2ZXMKKworRGlyZWN0aXZlcyBhcmUgc3BlY2lhbCBwcmUtZGVmaW5lZCBhY3Rpb25zIHdoaWNoIG1heSBiZSB1c2VkIHRvIGFsdGVyCit0aGUgYmVoYXZpb3VyIG9mIHRoZSBwYXJzZXIuIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdlbnR5LXRocmVlIGRpcmVjdGl2ZXM6CitDPEU8bHQ+Y29tbWl0RTxndD4+LAorQzxFPGx0PnVuY29tbWl0RTxndD4+LAorQzxFPGx0PnJlamVjdEU8Z3Q+PiwKK0M8RTxsdD5zY29yZUU8Z3Q+PiwKK0M8RTxsdD5hdXRvc2NvcmVFPGd0Pj4sCitDPEU8bHQ+c2tpcEU8Z3Q+PiwKK0M8RTxsdD5yZXN5bmNFPGd0Pj4sCitDPEU8bHQ+ZXJyb3JFPGd0Pj4sCitDPEU8bHQ+d2FybkU8Z3Q+PiwKK0M8RTxsdD5oaW50RTxndD4+LAorQzxFPGx0PnRyYWNlX2J1aWxkRTxndD4+LAorQzxFPGx0PnRyYWNlX3BhcnNlRTxndD4+LAorQzxFPGx0Pm5vY2hlY2tFPGd0Pj4sCitDPEU8bHQ+cnVsZXZhckU8Z3Q+PiwKK0M8RTxsdD5tYXRjaHJ1bGVFPGd0Pj4sCitDPEU8bHQ+bGVmdG9wRTxndD4+LAorQzxFPGx0PnJpZ2h0b3BFPGd0Pj4sCitDPEU8bHQ+ZGVmZXJFPGd0Pj4sCitDPEU8bHQ+bm9jaGVja0U8Z3Q+PiwKK0M8RTxsdD5wZXJsX3F1b3RlbGlrZUU8Z3Q+PiwKK0M8RTxsdD5wZXJsX2NvZGVibG9ja0U8Z3Q+PiwKK0M8RTxsdD5wZXJsX3ZhcmlhYmxlRTxndD4+LAorYW5kIEM8RTxsdD50b2tlbkU8Z3Q+Pi4KKworPW92ZXIgNAorCis9aXRlbSBDb21taXR0aW5nIGFuZCB1bmNvbW1pdHRpbmcKKworVGhlIEM8RTxsdD5jb21taXRFPGd0Pj4gYW5kIEM8RTxsdD51bmNvbW1pdEU8Z3Q+PiBkaXJlY3RpdmVzIHBlcm1pdCB0aGUgcmVjdXJzaXZlCitkZXNjZW50IG9mIHRoZSBwYXJzZSB0cmVlIHRvIGJlIHBydW5lZCAob3IgImN1dCIpIGZvciBlZmZpY2llbmN5LgorV2l0aGluIGEgcnVsZSwgYSBDPEU8bHQ+Y29tbWl0RTxndD4+IGRpcmVjdGl2ZSBpbnN0cnVjdHMgdGhlIHJ1bGUgdG8gaWdub3JlIHN1YnNlcXVlbnQKK3Byb2R1Y3Rpb25zIGlmIHRoZSBjdXJyZW50IHByb2R1Y3Rpb24gZmFpbHMuIEZvciBleGFtcGxlOgorCisgICAgY29tbWFuZDogJ2ZpbmQnIDxjb21taXQ+IGZpbGVuYW1lCisgICAgICAgfCAnb3BlbicgPGNvbW1pdD4gZmlsZW5hbWUKKyAgICAgICB8ICdtb3ZlJyBmaWxlbmFtZSBmaWxlbmFtZQorCitDbGVhcmx5LCBpZiB0aGUgbGVhZGluZyB0b2tlbiAnZmluZCcgaXMgbWF0Y2hlZCBpbiB0aGUgZmlyc3QgcHJvZHVjdGlvbiBidXQgdGhhdAorcHJvZHVjdGlvbiBmYWlscyBmb3Igc29tZSBvdGhlciByZWFzb24sIHRoZW4gdGhlIHJlbWFpbmluZworcHJvZHVjdGlvbnMgY2Fubm90IHBvc3NpYmx5IG1hdGNoLiBUaGUgcHJlc2VuY2Ugb2YgdGhlCitDPEU8bHQ+Y29tbWl0RTxndD4+IGNhdXNlcyB0aGUgImNvbW1hbmQiIHJ1bGUgdG8gZmFpbCBpbW1lZGlhdGVseSBpZgorYW4gaW52YWxpZCAiZmluZCIgY29tbWFuZCBpcyBmb3VuZCwgYW5kIGxpa2V3aXNlIGlmIGFuIGludmFsaWQgIm9wZW4iCitjb21tYW5kIGlzIGVuY291bnRlcmVkLgorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJldm9rZSBhIHByZXZpb3VzIGNvbW1pdG1lbnQuIEZvciBleGFtcGxlOgorCisgICAgaWZfc3RhdGVtZW50OiAnaWYnIDxjb21taXQ+IGNvbmRpdGlvbgorICAgICAgICAndGhlbicgYmxvY2sgPHVuY29tbWl0PgorICAgICAgICAnZWxzZScgYmxvY2sKKyAgICAgICAgfCAnaWYnIDxjb21taXQ+IGNvbmRpdGlvbgorICAgICAgICAndGhlbicgYmxvY2sKKworSW4gdGhpcyBjYXNlLCBhIGZhaWx1cmUgdG8gZmluZCBhbiAiZWxzZSIgYmxvY2sgaW4gdGhlIGZpcnN0Citwcm9kdWN0aW9uIHNob3VsZG4ndCBwcmVjbHVkZSB0cnlpbmcgdGhlIHNlY29uZCBwcm9kdWN0aW9uLCBidXQgYQorZmFpbHVyZSB0byBmaW5kIGEgImNvbmRpdGlvbiIgY2VydGFpbmx5IHNob3VsZC4KKworQXMgYSBzcGVjaWFsIGNhc2UsIGFueSBwcm9kdWN0aW9uIGluIHdoaWNoIHRoZSBJPGZpcnN0PiBpdGVtIGlzIGFuCitDPEU8bHQ+dW5jb21taXRFPGd0Pj4gaW1tZWRpYXRlbHkgcmV2b2tlcyBhIHByZWNlZGluZyBDPEU8bHQ+Y29tbWl0RTxndD4+CisoZXZlbiB0aG91Z2ggdGhlIHByb2R1Y3Rpb24gd291bGQgbm90IG90aGVyd2lzZSBoYXZlIGJlZW4gdHJpZWQpLiBGb3IKK2V4YW1wbGUsIGluIHRoZSBydWxlOgorCisgICAgcmVxdWVzdDogJ2V4cGxhaW4nIGV4cHJlc3Npb24KKyAgICAgICAgICAgfCAnZXhwbGFpbicgPGNvbW1pdD4ga2V5d29yZAorICAgICAgICAgICB8ICdzYXZlJworICAgICAgICAgICB8ICdxdWl0JworICAgICAgICAgICB8IDx1bmNvbW1pdD4gdGVybSAnPycKKworaWYgdGhlIHRleHQgYmVpbmcgbWF0Y2hlZCB3YXMgImV4cGxhaW4/IiwgYW5kIHRoZSBmaXJzdCB0d28KK3Byb2R1Y3Rpb25zIGZhaWxlZCwgdGhlbiB0aGUgQzxFPGx0PmNvbW1pdEU8Z3Q+PiBpbiBwcm9kdWN0aW9uIHR3byB3b3VsZCBjYXVzZQorcHJvZHVjdGlvbnMgdGhyZWUgYW5kIGZvdXIgdG8gYmUgc2tpcHBlZCwgYnV0IHRoZSBsZWFkaW5nCitDPEU8bHQ+dW5jb21taXRFPGd0Pj4gaW4gdGhlIHByb2R1Y3Rpb24gZml2ZSB3b3VsZCBhbGxvdyB0aGF0IHByb2R1Y3Rpb24gdG8KK2F0dGVtcHQgYSBtYXRjaC4KKworTm90ZSBpbiB0aGUgcHJlY2VkaW5nIGV4YW1wbGUsIHRoYXQgdGhlIEM8RTxsdD5jb21taXRFPGd0Pj4gd2FzIG9ubHkgcGxhY2VkCitpbiBwcm9kdWN0aW9uIHR3by4gSWYgcHJvZHVjdGlvbiBvbmUgaGFkIGJlZW46CisKKyAgICByZXF1ZXN0OiAnZXhwbGFpbicgPGNvbW1pdD4gZXhwcmVzc2lvbgorCit0aGVuIHByb2R1Y3Rpb24gdHdvIHdvdWxkIGJlIChpbmFwcHJvcHJpYXRlbHkpIHNraXBwZWQgaWYgYSBsZWFkaW5nCisiZXhwbGFpbi4uLiIgd2FzIGVuY291bnRlcmVkLgorCitCb3RoIEM8RTxsdD5jb21taXRFPGd0Pj4gYW5kIEM8RTxsdD51bmNvbW1pdEU8Z3Q+PiBkaXJlY3RpdmVzIGFsd2F5cyBzdWNjZWVkLCBhbmQgdGhlaXIgdmFsdWUKK2lzIGFsd2F5cyAxLgorCisKKz1pdGVtIFJlamVjdGluZyBhIHByb2R1Y3Rpb24KKworVGhlIEM8RTxsdD5yZWplY3RFPGd0Pj4gZGlyZWN0aXZlIGltbWVkaWF0ZWx5IGNhdXNlcyB0aGUgY3VycmVudCBwcm9kdWN0aW9uCit0byBmYWlsIChpdCBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8sIGJ1dCBtb3JlIG9idmlvdXMgdGhhbiwgdGhlCithY3Rpb24gQzx7dW5kZWZ9PikuIEEgQzxFPGx0PnJlamVjdEU8Z3Q+PiBpcyB1c2VmdWwgd2hlbiBpdCBpcyBkZXNpcmFibGUgdG8gZ2V0Cit0aGUgc2lkZSBlZmZlY3RzIG9mIHRoZSBhY3Rpb25zIGluIG9uZSBwcm9kdWN0aW9uLCB3aXRob3V0IHByZWp1ZGljaW5nIGEgbWF0Y2gKK2J5IHNvbWUgb3RoZXIgcHJvZHVjdGlvbiBsYXRlciBpbiB0aGUgcnVsZS4gRm9yIGV4YW1wbGUsIHRvIGluc2VydAordHJhY2luZyBjb2RlIGludG8gdGhlIHBhcnNlOgorCisgICAgY29tcGxleF9ydWxlOiB7IHByaW50ICJJbiBjb21wbGV4IHJ1bGUuLi5cbiI7IH0gPHJlamVjdD4KKworICAgIGNvbXBsZXhfcnVsZTogc2ltcGxlX3J1bGUgJysnICdpJyAnKicgc2ltcGxlX3J1bGUKKyAgICAgICAgfCAnaScgJyonIHNpbXBsZV9ydWxlCisgICAgICAgIHwgc2ltcGxlX3J1bGUKKworCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBjb25kaXRpb25hbCByZWplY3Rpb24sIHVzaW5nIHRoZQorZm9ybSBDPEU8bHQ+cmVqZWN0Okk8Y29uZGl0aW9uPkU8Z3Q+Piwgd2hpY2ggb25seSByZWplY3RzIGlmIHRoZQorc3BlY2lmaWVkIGNvbmRpdGlvbiBpcyB0cnVlLiBUaGlzIGZvcm0gb2YgcmVqZWN0aW9uIGlzIGV4YWN0bHkKK2VxdWl2YWxlbnQgdG8gdGhlIGFjdGlvbiBDPHsoSTxjb25kaXRpb24+KT91bmRlZjoxfUU8Z3Q+Pi4KK0ZvciBleGFtcGxlOgorCisgICAgY29tbWFuZDogc2F2ZV9jb21tYW5kCisgICAgICAgfCByZXN0b3JlX2NvbW1hbmQKKyAgICAgICB8IDxyZWplY3Q6IGRlZmluZWQgJDo6dG9sZXJhbnQ+IHsgZXhpdCB9CisgICAgICAgfCA8ZXJyb3I6IFVua25vd24gY29tbWFuZC4gSWdub3JlZC4+CisKK0EgQzxFPGx0PnJlamVjdEU8Z3Q+PiBkaXJlY3RpdmUgbmV2ZXIgc3VjY2VlZHMgKGFuZCBoZW5jZSBoYXMgbm8KK2Fzc29jaWF0ZWQgdmFsdWUpLiBBIGNvbmRpdGlvbmFsIHJlamVjdGlvbiBtYXkgc3VjY2VlZCAoaWYgaXRzCitjb25kaXRpb24gaXMgbm90IHNhdGlzZmllZCksIGluIHdoaWNoIGNhc2UgaXRzIHZhbHVlIGlzIDEuCisKK0FzIGFuIGV4dHJhIG9wdGltaXphdGlvbiwgQzxQYXJzZTo6UmVjRGVzY2VudD4gaWdub3JlcyBhbnkgcHJvZHVjdGlvbgord2hpY2ggSTxiZWdpbnM+IHdpdGggYW4gdW5jb25kaXRpb25hbCBDPEU8bHQ+cmVqZWN0RTxndD4+IGRpcmVjdGl2ZSwKK3NpbmNlIGFueSBzdWNoIHByb2R1Y3Rpb24gY2FuIG5ldmVyIHN1Y2Nlc3NmdWxseSBtYXRjaCBvciBoYXZlIGFueQordXNlZnVsIHNpZGUtZWZmZWN0cy4gQSBsZXZlbCAxIHdhcm5pbmcgaXMgaXNzdWVkIGluIGFsbCBzdWNoIGNhc2VzLgorCitOb3RlIHRoYXQgcHJvZHVjdGlvbnMgYmVnaW5uaW5nIHdpdGggY29uZGl0aW9uYWwKK0M8RTxsdD5yZWplY3Q6Li4uRTxndD4+IGRpcmVjdGl2ZXMgYXJlIEk8bmV2ZXI+ICJvcHRpbWl6ZWQgYXdheSIgaW4KK3RoaXMgbWFubmVyLCBldmVuIGlmIHRoZXkgYXJlIGFsd2F5cyBndWFyYW50ZWVkIHRvIGZhaWwgKGZvciBleGFtcGxlOgorQzxFPGx0PnJlamVjdDoxRTxndD4+KQorCitEdWUgdG8gdGhlIHdheSBncmFtbWFycyBhcmUgcGFyc2VkLCB0aGVyZSBpcyBhIG1pbm9yIHJlc3RyaWN0aW9uIG9uIHRoZQorY29uZGl0aW9uIG9mIGEgY29uZGl0aW9uYWwgQzxFPGx0PnJlamVjdDouLi5FPGd0Pj46IGl0IGNhbm5vdAorY29udGFpbiBhbnkgcmF3ICc8JyBvciAnPicgY2hhcmFjdGVycy4gRm9yIGV4YW1wbGU6CisKKyAgICBsaW5lOiBjbWQgPHJlamVjdDogJHRoaXNjb2x1bW4gPiBtYXg+IGRhdGEKKworcmVzdWx0cyBpbiBhbiBlcnJvciB3aGVuIGEgcGFyc2VyIGlzIGJ1aWx0IGZyb20gdGhpcyBncmFtbWFyIChzaW5jZSB0aGUKK2dyYW1tYXIgcGFyc2VyIGhhcyBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBmaXJzdCA+IGlzIGEgImxlc3MgdGhhbiIKK29yIHRoZSBlbmQgb2YgdGhlIEM8RTxsdD5yZWplY3Q6Li4uRTxndD4+LgorCitUbyBvdmVyY29tZSB0aGlzIHByb2JsZW0sIHB1dCB0aGUgY29uZGl0aW9uIGluc2lkZSBhIGRve30gYmxvY2s6CisKKyAgICBsaW5lOiBjbWQgPHJlamVjdDogZG97JHRoaXNjb2x1bW4gPiBtYXh9PiBkYXRhCisKK05vdGUgdGhhdCB0aGUgc2FtZSBwcm9ibGVtIG1heSBvY2N1ciBpbiBvdGhlciBkaXJlY3RpdmVzIHRoYXQgdGFrZQorYXJndW1lbnRzLiBUaGUgc2FtZSBzb2x1dGlvbiB3aWxsIHdvcmsgaW4gYWxsIGNhc2VzLgorCisKKz1pdGVtIFNraXBwaW5nIGJldHdlZW4gdGVybWluYWxzCisKK1RoZSBDPEU8bHQ+c2tpcEU8Z3Q+PiBkaXJlY3RpdmUgZW5hYmxlcyB0aGUgdGVybWluYWwgcHJlZml4IHVzZWQgaW4KK2EgcHJvZHVjdGlvbiB0byBiZSBjaGFuZ2VkLiBGb3IgZXhhbXBsZToKKworICAgIE9uZUxpbmVyOiBDb21tYW5kIDxza2lwOidbIFx0XSonPiBBcmcocykgLzsvCisKK2NhdXNlcyBvbmx5IGJsYW5rcyBhbmQgdGFicyB0byBiZSBza2lwcGVkIGJlZm9yZSB0ZXJtaW5hbHMgaW4gdGhlIEM8QXJnPgorc3VicnVsZSAoYW5kIGFueSBvZiBJPGl0cz4gc3VicnVsZXM+LCBhbmQgYWxzbyBiZWZvcmUgdGhlIGZpbmFsIEM8LzsvPiB0ZXJtaW5hbC4KK09uY2UgdGhlIHByb2R1Y3Rpb24gaXMgY29tcGxldGUsIHRoZSBwcmV2aW91cyB0ZXJtaW5hbCBwcmVmaXggaXMKK3JlaW5zdGF0ZWQuIE5vdGUgdGhhdCB0aGlzIGltcGxpZXMgdGhhdCBkaXN0aW5jdCBwcm9kdWN0aW9ucyBvZiBhIHJ1bGUKK211c3QgcmVzZXQgdGhlaXIgdGVybWluYWwgcHJlZml4ZXMgaW5kaXZpZHVhbGx5LgorCitUaGUgQzxFPGx0PnNraXBFPGd0Pj4gZGlyZWN0aXZlIGV2YWx1YXRlcyB0byB0aGUgSTxwcmV2aW91cz4gdGVybWluYWwgcHJlZml4LAorc28gaXQncyBlYXN5IHRvIHJlaW5zdGF0ZSBhIHByZWZpeCBsYXRlciBpbiBhIHByb2R1Y3Rpb246CisKKyAgICBDb21tYW5kOiA8c2tpcDoiLCI+IENTVihzKSA8c2tpcDokaXRlbVsxXT4gTW9kaWZpZXIKKworVGhlIHZhbHVlIHNwZWNpZmllZCBhZnRlciB0aGUgY29sb24gaXMgaW50ZXJwb2xhdGVkIGludG8gYSBwYXR0ZXJuLCBzbyBhbGwgb2YKK3RoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQgKHRob3VnaCB0aGVpciBlZmZpY2llbmN5IGluY3JlYXNlcyBkb3duIHRoZSBsaXN0KToKKworICAgIDxza2lwOiAiJGNvbG9ufCRjb21tYSI+ICAgIyBBU1NVTUlORyBUSEUgVkFSUyBIT0xEIFRIRSBPQlZJT1VTIFZBTFVFUworCisgICAgPHNraXA6ICc6fCwnPgorCisgICAgPHNraXA6IHF7WzosXX0+CisKKyAgICA8c2tpcDogcXIvWzosXS8+CisKK1RoZXJlIGlzIG5vIHdheSBvZiBkaXJlY3RseSBzZXR0aW5nIHRoZSBwcmVmaXggZm9yCithbiBlbnRpcmUgcnVsZSwgZXhjZXB0IGFzIGZvbGxvd3M6CisKKyAgICBSdWxlOiA8c2tpcDogJ1sgXHRdKic+IFByb2QxCisgICAgICAgIHwgPHNraXA6ICdbIFx0XSonPiBQcm9kMmEgUHJvZDJiCisgICAgICAgIHwgPHNraXA6ICdbIFx0XSonPiBQcm9kMworCitvciwgYmV0dGVyOgorCisgICAgUnVsZTogPHNraXA6ICdbIFx0XSonPgorICAgICgKKyAgICAgICAgUHJvZDEKKyAgICAgIHwgUHJvZDJhIFByb2QyYgorICAgICAgfCBQcm9kMworICAgICkKKworVGhlIHNraXAgcGF0dGVybiBpcyBwYXNzZWQgZG93biB0byBzdWJydWxlcywgc28gc2V0dGluZyB0aGUgc2tpcCBmb3IKK3RoZSB0b3AtbGV2ZWwgcnVsZSBhcyBkZXNjcmliZWQgYWJvdmUgYWN0dWFsbHkgc2V0cyB0aGUgcHJlZml4IGZvciB0aGUKK2VudGlyZSBncmFtbWFyIChwcm92aWRlZCB0aGF0IHlvdSBvbmx5IGNhbGwgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nCit0byB0aGUgdG9wLWxldmVsIHJ1bGUgaXRzZWxmKS4gQWx0ZXJuYXRpdmVseSwgb3IgaWYgeW91IGhhdmUgbW9yZSB0aGFuCitvbmUgdG9wLWxldmVsIHJ1bGUgaW4geW91ciBncmFtbWFyLCB5b3UgY2FuIHByb3ZpZGUgYSBnbG9iYWwKK0M8RTxsdD5za2lwRTxndD4+IGRpcmVjdGl2ZSBwcmlvciB0byBkZWZpbmluZyBhbnkgcnVsZXMgaW4gdGhlCitncmFtbWFyLiBUaGVzZSBhcmUgdGhlIHByZWZlcnJlZCBhbHRlcm5hdGl2ZXMgdG8gc2V0dGluZworQzwkUGFyc2U6OlJlY0Rlc2NlbnQ6OnNraXA+LgorCitBZGRpdGlvbmFsbHksIHVzaW5nIEM8RTxsdD5za2lwRTxndD4+IGFjdHVhbGx5IGFsbG93cyB5b3UgdG8gaGF2ZQorYSBjb21wbGV0ZWx5IGR5bmFtaWMgc2tpcHBpbmcgYmVoYXZpb3VyLiBGb3IgZXhhbXBsZToKKworICAgUnVsZV93aXRoX2R5bmFtaWNfc2tpcDogPHNraXA6ICQ6OnNraXBfcGF0dGVybj4gUnVsZQorCitUaGVuIHlvdSBjYW4gc2V0IEM8JDo6c2tpcF9wYXR0ZXJuPiBiZWZvcmUgaW52b2tpbmcKK0M8UnVsZV93aXRoX2R5bmFtaWNfc2tpcD4gYW5kIGhhdmUgaXQgc2tpcCB3aGF0ZXZlciB5b3Ugc3BlY2lmaWVkLgorCitCPE5vdGU6IFVwIHRvIHJlbGVhc2UgMS41MSBvZiBQYXJzZTo6UmVjRGVzY2VudCwgYW4gZW50aXJlbHkgZGlmZmVyZW50CittZWNoYW5pc20gd2FzIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGVybWluYWwgcHJlZml4ZXMuIFRoZSBjdXJyZW50IG1ldGhvZAoraXMgbm90IGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggdGhhdCBlYXJseSBhcHByb2FjaC4gVGhlIGN1cnJlbnQgYXBwcm9hY2gKK2lzIHN0YWJsZSBhbmQgd2lsbCBub3QgdG8gY2hhbmdlIGFnYWluLj4KKworCis9aXRlbSBSZXN5bmNocm9uaXphdGlvbgorCitUaGUgQzxFPGx0PnJlc3luY0U8Z3Q+PiBkaXJlY3RpdmUgcHJvdmlkZXMgYSB2aXN1YWxseSBkaXN0aW5jdGl2ZQorbWVhbnMgb2YgY29uc3VtaW5nIHNvbWUgb2YgdGhlIHRleHQgYmVpbmcgcGFyc2VkLCB1c3VhbGx5IHRvIHNraXAgYW4KK2Vycm9uZW91cyBpbnB1dC4gSW4gaXRzIHNpbXBsZXN0IGZvcm0gQzxFPGx0PnJlc3luY0U8Z3Q+PiBzaW1wbHkKK2NvbnN1bWVzIHRleHQgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgbmV4dCBuZXdsaW5lIChDPCJcbiI+KQorY2hhcmFjdGVyLCBzdWNjZWVkaW5nIG9ubHkgaWYgdGhlIG5ld2xpbmUgaXMgZm91bmQsIGluIHdoaWNoIGNhc2UgaXQKK2NhdXNlcyBpdHMgc3Vycm91bmRpbmcgcnVsZSB0byByZXR1cm4gemVybyBvbiBzdWNjZXNzLgorCitJbiBvdGhlciB3b3JkcywgYSBDPEU8bHQ+cmVzeW5jRTxndD4+IGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byB0aGUgdG9rZW4KK0M8L1teXG5dKlxuLz4gZm9sbG93ZWQgYnkgdGhlIGFjdGlvbiBTPEM8eyAkcmV0dXJuID0gMCB9Pj4gKGV4Y2VwdCB0aGF0Citwcm9kdWN0aW9ucyBiZWdpbm5pbmcgd2l0aCBhIEM8RTxsdD5yZXN5bmNFPGd0Pj4gYXJlIGlnbm9yZWQgd2hlbiBnZW5lcmF0aW5nCitlcnJvciBtZXNzYWdlcykuIEEgdHlwaWNhbCB1c2UgbWlnaHQgYmU6CisKKyAgICBzY3JpcHQgOiBjb21tYW5kKHMpCisKKyAgICBjb21tYW5kOiBzYXZlX2NvbW1hbmQKKyAgICAgICB8IHJlc3RvcmVfY29tbWFuZAorICAgICAgIHwgPHJlc3luYz4gIyBUUlkgTkVYVCBMSU5FLCBJRiBQT1NTSUJMRQorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSBhIHJlc3luY2hyb25pemF0aW9uCitwYXR0ZXJuLCB1c2luZyB0aGUgQzxFPGx0PnJlc3luYzpJPHBhdHRlcm4+RTxndD4+IHZhcmlhbnQuIFRoaXMgdmVyc2lvbgorc3VjY2VlZHMgb25seSBpZiB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gbWF0Y2hlcyAoYW5kIGNvbnN1bWVzKSB0aGUKK3BhcnNlZCB0ZXh0LiBJbiBvdGhlciB3b3JkcywgQzxFPGx0PnJlc3luYzpJPHBhdHRlcm4+RTxndD4+IGlzIGV4YWN0bHkKK2VxdWl2YWxlbnQgdG8gdGhlIHRva2VuIEM8L0k8cGF0dGVybj4vPiAoZm9sbG93ZWQgYnkgYSBTPEM8eyAkcmV0dXJuID0gMCB9Pj4KK2FjdGlvbikuIEZvciBleGFtcGxlLCBpZiBjb21tYW5kcyB3ZXJlIHRlcm1pbmF0ZWQgYnkgbmV3bGluZXMgb3Igc2VtaS1jb2xvbnM6CisKKyAgICBjb21tYW5kOiBzYXZlX2NvbW1hbmQKKyAgICAgICB8IHJlc3RvcmVfY29tbWFuZAorICAgICAgIHwgPHJlc3luYzpbXjtcbl0qWztcbl0+CisKK1RoZSB2YWx1ZSBvZiBhIHN1Y2Nlc3NmdWxseSBtYXRjaGVkIEM8RTxsdD5yZXN5bmNFPGd0Pj4gZGlyZWN0aXZlIChvZiBlaXRoZXIKK3R5cGUpIGlzIHRoZSB0ZXh0IHRoYXQgaXQgY29uc3VtZWQuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgc2luY2UgdGhlCitkaXJlY3RpdmUgYWxzbyBzZXRzIEM8JHJldHVybj4sIGEgcHJvZHVjdGlvbiBjb25zaXN0aW5nIG9mIGEgbG9uZQorQzxFPGx0PnJlc3luY0U8Z3Q+PiBzdWNjZWVkcyBidXQgcmV0dXJucyB0aGUgdmFsdWUgemVybyAod2hpY2ggYSBjYWxsaW5nIHJ1bGUKK21heSBmaW5kIHVzZWZ1bCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuICJ0cnVlIiBtYXRjaGVzIGFuZCAidG9sZXJhbnQiIG1hdGNoZXMpLgorUmVtZW1iZXIgdGhhdCByZXR1cm5pbmcgYSB6ZXJvIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBydWxlIEk8c3VjY2VlZGVkPiAoc2luY2UKK29ubHkgYW4gQzx1bmRlZj4gZGVub3RlcyBmYWlsdXJlIHdpdGhpbiBDPFBhcnNlOjpSZWNEZXNjZW50PiBwYXJzZXJzLgorCisKKz1pdGVtIEVycm9yIGhhbmRsaW5nCisKK1RoZSBDPEU8bHQ+ZXJyb3JFPGd0Pj4gZGlyZWN0aXZlIHByb3ZpZGVzIGF1dG9tYXRpYyBvciB1c2VyLWRlZmluZWQKK2dlbmVyYXRpb24gb2YgZXJyb3IgbWVzc2FnZXMgZHVyaW5nIGEgcGFyc2UuIEluIGl0cyBzaW1wbGVzdCBmb3JtCitDPEU8bHQ+ZXJyb3JFPGd0Pj4gcHJlcGFyZXMgYW4gZXJyb3IgbWVzc2FnZSBiYXNlZCBvbgordGhlIG1pc21hdGNoIGJldHdlZW4gdGhlIGxhc3QgaXRlbSBleHBlY3RlZCBhbmQgdGhlIHRleHQgd2hpY2ggY2F1c2UKK2l0IHRvIGZhaWwuIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgcnVsZToKKworICAgIE1jQ295OiBjdXJzZSAnLCcgbmFtZSAnLCBJJ20gYSBkb2N0b3IsIG5vdCBhJyBhX3Byb2Zlc3Npb24gJyEnCisgICAgIHwgcHJvbm91biAnZGVhZCwnIG5hbWUgJyEnCisgICAgIHwgPGVycm9yPgorCit0aGUgZm9sbG93aW5nIHN0cmluZ3Mgd291bGQgcHJvZHVjZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2VzOgorCis9b3ZlciA0CisKKz1pdGVtICJBbWVuLCBKaW0hIgorCisgICAgICAgRVJST1IgKGxpbmUgMSk6IEludmFsaWQgTWNDb3k6IEV4cGVjdGVkIGN1cnNlIG9yIHByb25vdW4KKyAgICAgICAgICAgbm90IGZvdW5kCisKKz1pdGVtICJEYW1taXQsIEppbSwgSSdtIGEgZG9jdG9yISIKKworICAgICAgIEVSUk9SIChsaW5lIDEpOiBJbnZhbGlkIE1jQ295OiBFeHBlY3RlZCAiLCBJJ20gYSBkb2N0b3IsIG5vdCBhIgorICAgICAgICAgICBidXQgZm91bmQgIiwgSSdtIGEgZG9jdG9yISIgaW5zdGVhZAorCis9aXRlbSAiSGUncyBkZWFkLFxuIgorCisgICAgICAgRVJST1IgKGxpbmUgMik6IEludmFsaWQgTWNDb3k6IEV4cGVjdGVkIG5hbWUgbm90IGZvdW5kCisKKz1pdGVtICJIZSdzIGFsaXZlISIKKworICAgICAgIEVSUk9SIChsaW5lIDEpOiBJbnZhbGlkIE1jQ295OiBFeHBlY3RlZCAnZGVhZCwnIGJ1dCBmb3VuZAorICAgICAgICAgICAiYWxpdmUhIiBpbnN0ZWFkCisKKz1pdGVtICJEYW1taXQsIEppbSwgSSdtIGEgZG9jdG9yLCBub3QgYSBwb2ludHktZWFyZWQgVnVsY2FuISIKKworICAgICAgIEVSUk9SIChsaW5lIDEpOiBJbnZhbGlkIE1jQ295OiBFeHBlY3RlZCBhIHByb2Zlc3Npb24gYnV0IGZvdW5kCisgICAgICAgICAgICJwb2ludHktZWFyZWQgVnVsY2FuISIgaW5zdGVhZAorCisKKz1iYWNrCisKK05vdGUgdGhhdCwgd2hlbiBhdXRvZ2VuZXJhdGluZyBlcnJvciBtZXNzYWdlcywgYWxsIHVuZGVyc2NvcmVzIGluIGFueQorcnVsZSBuYW1lIHVzZWQgaW4gYSBtZXNzYWdlIGFyZSByZXBsYWNlZCBieSBzaW5nbGUgc3BhY2VzIChmb3IgZXhhbXBsZQorImFfcHJvZHVjdGlvbiIgYmVjb21lcyAiYSBwcm9kdWN0aW9uIikuIEp1ZGljaW91cyBjaG9pY2Ugb2YgcnVsZQorbmFtZXMgY2FuIHRoZXJlZm9yZSBjb25zaWRlcmFibHkgaW1wcm92ZSB0aGUgcmVhZGFiaWxpdHkgb2YgYXV0b21hdGljCitlcnJvciBtZXNzYWdlcyAoYXMgd2VsbCBhcyB0aGUgbWFpbnRhaW5hYmlsaXR5IG9mIHRoZSBvcmlnaW5hbAorZ3JhbW1hcikuCisKK0lmIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBlcnJvciBpcyBub3Qgc3VmZmljaWVudCwgaXQgaXMgcG9zc2libGUgdG8KK3Byb3ZpZGUgYW4gZXhwbGljaXQgbWVzc2FnZSBhcyBwYXJ0IG9mIHRoZSBlcnJvciBkaXJlY3RpdmUuIEZvciBleGFtcGxlOgorCisgICAgU3BvY2s6ICJGYXNjaW5hdGluZyAnLCcgKG5hbWUgfCAnQ2FwdGFpbicpICcuJworICAgICB8ICJIaWdobHkgaWxsb2dpY2FsLCBkb2N0b3IuIgorICAgICB8IDxlcnJvcjogSGUgbmV2ZXIgc2FpZCB0aGF0IT4KKword2hpY2ggd291bGQgcmVzdWx0IGluIEk8YWxsPiBmYWlsdXJlcyB0byBwYXJzZSBhICJTcG9jayIgc3VicnVsZSBwcmludGluZyB0aGUKK2ZvbGxvd2luZyBtZXNzYWdlOgorCisgICAgICAgRVJST1IgKGxpbmUgPE4+KTogSW52YWxpZCBTcG9jazogIEhlIG5ldmVyIHNhaWQgdGhhdCEKKworVGhlIGVycm9yIG1lc3NhZ2UgaXMgdHJlYXRlZCBhcyBhICJxcXsuLi59IiBzdHJpbmcgYW5kIGludGVycG9sYXRlZAord2hlbiB0aGUgZXJyb3IgaXMgZ2VuZXJhdGVkIChJPG5vdD4gd2hlbiB0aGUgZGlyZWN0aXZlIGlzIHNwZWNpZmllZCEpLgorSGVuY2U6CisKKyAgICA8ZXJyb3I6IE15c3RpY2FsIGVycm9yIG5lYXIgIiR0ZXh0Ij4KKword291bGQgY29ycmVjdGx5IGluc2VydCB0aGUgYW1iaWVudCB0ZXh0IHN0cmluZyB3aGljaCBjYXVzZWQgdGhlIGVycm9yLgorCitUaGVyZSBhcmUgdHdvIG90aGVyIGZvcm1zIG9mIGVycm9yIGRpcmVjdGl2ZTogQzxFPGx0PmVycm9yP0U8Z3Q+PiBhbmQKK1M8QzxFPGx0PmVycm9yPzogbXNnRTxndD4+Pi4gVGhlc2UgYmVoYXZlIGp1c3QgbGlrZSBDPEU8bHQ+ZXJyb3JFPGd0Pj4KK2FuZCBTPEM8RTxsdD5lcnJvcjogbXNnRTxndD4+PiByZXNwZWN0aXZlbHksIGV4Y2VwdCB0aGF0IHRoZXkgYXJlCitvbmx5IHRyaWdnZXJlZCBpZiB0aGUgcnVsZSBpcyAiY29tbWl0dGVkIiBhdCB0aGUgdGltZSB0aGV5IGFyZQorZW5jb3VudGVyZWQuIEZvciBleGFtcGxlOgorCisgICAgU2NvdHR5OiAiWWEga2VubmEgY2hhbmdlIHRoZSBMYXdzIG9mIFBodXNpY3MsIiA8Y29tbWl0PiBuYW1lCisgICAgICB8IG5hbWUgPGNvbW1pdD4gJywnICdzaGUncyBnb2FudGEgYmxhdyEnCisgICAgICB8IDxlcnJvcj8+CisKK3dpbGwgb25seSBnZW5lcmF0ZSBhbiBlcnJvciBmb3IgYSBzdHJpbmcgYmVnaW5uaW5nIHdpdGggIllhIGtlbm5hCitjaGFuZ2UgdGhlIExhd3MgbycgUGh1c2ljcywiIG9yIGEgdmFsaWQgbmFtZSwgYnV0IHdoaWNoIHN0aWxsIGZhaWxzIHRvIG1hdGNoIHRoZQorY29ycmVzcG9uZGluZyBwcm9kdWN0aW9uLiBUaGF0IGlzLCBDPCRwYXJzZXItRTxndD5TY290dHkoIkF5ZSwgQ2FwJ2FpbiIpPiB3aWxsCitmYWlsIHNpbGVudGx5IChzaW5jZSBuZWl0aGVyIHByb2R1Y3Rpb24gd2lsbCAiY29tbWl0IiB0aGUgcnVsZSBvbiB0aGF0CitpbnB1dCksIHdoZXJlYXMgUzxDPCRwYXJzZXItRTxndD5TY290dHkoIk1yIFNwb2NrLCBhaCBqZXN0IGtlbm5hIGRvJ3V0ISIpPj4KK3dpbGwgZmFpbCB3aXRoIHRoZSBlcnJvciBtZXNzYWdlOgorCisgICAgICAgRVJST1IgKGxpbmUgMSk6IEludmFsaWQgU2NvdHR5OiBleHBlY3RlZCAnc2hlJ3MgZ29hbnRhIGJsYXchJworICAgICAgICAgICBidXQgZm91bmQgJ0kgamVzdCBrZW5uYSBkbyd1dCEnIGluc3RlYWQuCisKK3NpbmNlIGluIHRoYXQgY2FzZSB0aGUgc2Vjb25kIHByb2R1Y3Rpb24gd291bGQgY29tbWl0IGFmdGVyIG1hdGNoaW5nCit0aGUgbGVhZGluZyBuYW1lLgorCitOb3RlIHRoYXQgdG8gYWxsb3cgdGhpcyBiZWhhdmlvdXIsIGFsbCBDPEU8bHQ+ZXJyb3JFPGd0Pj4gZGlyZWN0aXZlcyB3aGljaCBhcmUKK3RoZSBmaXJzdCBpdGVtIGluIGEgcHJvZHVjdGlvbiBhdXRvbWF0aWNhbGx5IHVuY29tbWl0IHRoZSBydWxlIGp1c3QKK2xvbmcgZW5vdWdoIHRvIGFsbG93IHRoZWlyIHByb2R1Y3Rpb24gdG8gYmUgYXR0ZW1wdGVkICh0aGF0IGlzLCB3aGVuCit0aGVpciBwcm9kdWN0aW9uIGZhaWxzLCB0aGUgY29tbWl0bWVudCBpcyByZWluc3RhdGVkIHNvIHRoYXQKK3N1YnNlcXVlbnQgcHJvZHVjdGlvbnMgYXJlIHNraXBwZWQpLgorCitJbiBvcmRlciB0byBJPHBlcm1hbmVudGx5PiB1bmNvbW1pdCB0aGUgcnVsZSBiZWZvcmUgYW4gZXJyb3IgbWVzc2FnZSwKK2l0IGlzIG5lY2Vzc2FyeSB0byBwdXQgYW4gZXhwbGljaXQgQzxFPGx0PnVuY29tbWl0RTxndD4+IGJlZm9yZSB0aGUKK0M8RTxsdD5lcnJvckU8Z3Q+Pi4gRm9yIGV4YW1wbGU6CisKKyAgICBsaW5lOiAnS2lyazonICA8Y29tbWl0PiBLaXJrCisgICAgfCAnU3BvY2s6JyA8Y29tbWl0PiBTcG9jaworICAgIHwgJ01jQ295OicgPGNvbW1pdD4gTWNDb3kKKyAgICB8IDx1bmNvbW1pdD4gPGVycm9yPz4gPHJlamVjdD4KKyAgICB8IDxyZXN5bmM+CisKKworRXJyb3IgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5IHRoZSB2YXJpb3VzIEM8RTxsdD5lcnJvci4uLkU8Z3Q+PiBkaXJlY3RpdmVzCithcmUgbm90IGRpc3BsYXllZCBpbW1lZGlhdGVseS4gSW5zdGVhZCwgdGhleSBhcmUgInF1ZXVlZCIgaW4gYSBidWZmZXIgYW5kCithcmUgb25seSBkaXNwbGF5ZWQgb25jZSBwYXJzaW5nIHVsdGltYXRlbHkgZmFpbHMuIE1vcmVvdmVyLAorQzxFPGx0PmVycm9yLi4uRTxndD4+IGRpcmVjdGl2ZXMgdGhhdCBjYXVzZSBvbmUgcHJvZHVjdGlvbiBvZiBhIHJ1bGUKK3RvIGZhaWwgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSBtZXNzYWdlIHF1ZXVlCitpZiBhbm90aGVyIHByb2R1Y3Rpb24gc3Vic2VxdWVudGx5IGNhdXNlcyB0aGUgZW50aXJlIHJ1bGUgdG8gc3VjY2VlZC4KK1RoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHB1dAorQzxFPGx0PmVycm9yLi4uRTxndD4+IGRpcmVjdGl2ZXMgd2hlcmV2ZXIgdXNlZnVsIGRpYWdub3NpcyBjYW4gYmUgZG9uZSwKK2FuZCBvbmx5IHRob3NlIGFzc29jaWF0ZWQgd2l0aCBhY3R1YWwgcGFyc2VyIGZhaWx1cmUgd2lsbCBldmVyIGJlCitkaXNwbGF5ZWQuIEFsc28gc2VlIEw8IkdPVENIQVMiPi4KKworQXMgYSBnZW5lcmFsIHJ1bGUsIHRoZSBtb3N0IHVzZWZ1bCBkaWFnbm9zdGljcyBhcmUgdXN1YWxseSBnZW5lcmF0ZWQKK2VpdGhlciBhdCB0aGUgdmVyeSBsb3dlc3QgbGV2ZWwgd2l0aGluIHRoZSBncmFtbWFyLCBvciBhdCB0aGUgdmVyeQoraGlnaGVzdC4gQSBnb29kIHJ1bGUgb2YgdGh1bWIgaXMgdG8gaWRlbnRpZnkgdGhvc2Ugc3VicnVsZXMgd2hpY2gKK2NvbnNpc3QgbWFpbmx5IChvciBlbnRpcmVseSkgb2YgdGVybWluYWxzLCBhbmQgdGhlbiBwdXQgYW4KK0M8RTxsdD5lcnJvci4uLkU8Z3Q+PiBkaXJlY3RpdmUgYXQgdGhlIGVuZCBvZiBhbnkgb3RoZXIgcnVsZSB3aGljaCBjYWxscworb25lIG9yIG1vcmUgb2YgdGhvc2Ugc3VicnVsZXMuCisKK1RoZXJlIGlzIG9uZSBvdGhlciBzaXR1YXRpb24gaW4gd2hpY2ggdGhlIG91dHB1dCBvZiB0aGUgdmFyaW91cyB0eXBlcyBvZgorZXJyb3IgZGlyZWN0aXZlIGlzIHN1cHByZXNzZWQ7IG5hbWVseSwgd2hlbiB0aGUgcnVsZSBjb250YWluaW5nIHRoZW0KK2lzIGJlaW5nIHBhcnNlZCBhcyBwYXJ0IG9mIGEgImxvb2stYWhlYWQiIChzZWUgTDwiTG9vay1haGVhZCI+KS4gSW4gdGhpcworY2FzZSwgdGhlIGVycm9yIGRpcmVjdGl2ZSB3aWxsIHN0aWxsIGNhdXNlIHRoZSBydWxlIHRvIGZhaWwsIGJ1dCB3aWxsIGRvCitzbyBzaWxlbnRseS4KKworQW4gdW5jb25kaXRpb25hbCBDPEU8bHQ+ZXJyb3JFPGd0Pj4gZGlyZWN0aXZlIGFsd2F5cyBmYWlscyAoYW5kIGhlbmNlIGhhcyBubworYXNzb2NpYXRlZCB2YWx1ZSkuIFRoaXMgbWVhbnMgdGhhdCBlbmNvdW50ZXJpbmcgc3VjaCBhIGRpcmVjdGl2ZQorYWx3YXlzIGNhdXNlcyB0aGUgcHJvZHVjdGlvbiBjb250YWluaW5nIGl0IHRvIGZhaWwuIEhlbmNlIGFuCitDPEU8bHQ+ZXJyb3JFPGd0Pj4gZGlyZWN0aXZlIHdpbGwgaW5ldml0YWJseSBiZSB0aGUgbGFzdCAodXNlZnVsKSBpdGVtIG9mIGEKK3J1bGUgKGEgbGV2ZWwgMyB3YXJuaW5nIGlzIGlzc3VlZCBpZiBhIHByb2R1Y3Rpb24gY29udGFpbnMgaXRlbXMgYWZ0ZXIgYW4gdW5jb25kaXRpb25hbAorQzxFPGx0PmVycm9yRTxndD4+IGRpcmVjdGl2ZSkuCisKK0FuIEM8RTxsdD5lcnJvcj9FPGd0Pj4gZGlyZWN0aXZlIHdpbGwgSTxzdWNjZWVkPiAodGhhdCBpczogZmFpbCB0byBmYWlsIDotKSwgaWYKK3RoZSBjdXJyZW50IHJ1bGUgaXMgdW5jb21taXR0ZWQgd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGVuY291bnRlcmVkLiBJbgordGhhdCBjYXNlIHRoZSBkaXJlY3RpdmUncyBhc3NvY2lhdGVkIHZhbHVlIGlzIHplcm8uIEhlbmNlLCB0aGlzIHR5cGUKK29mIGVycm9yIGRpcmVjdGl2ZSBJPGNhbj4gYmUgdXNlZCBiZWZvcmUgdGhlIGVuZCBvZiBhCitwcm9kdWN0aW9uLiBGb3IgZXhhbXBsZToKKworICAgIGNvbW1hbmQ6ICdkbycgPGNvbW1pdD4gc29tZXRoaW5nCisgICAgICAgfCAncmVwb3J0JyA8Y29tbWl0PiBzb21ldGhpbmcKKyAgICAgICB8IDxlcnJvcj86IFN5bnRheCBlcnJvcj4gPGVycm9yOiBVbmtub3duIGNvbW1hbmQ+CisKKworQjxXYXJuaW5nOj4gVGhlIEM8RTxsdD5lcnJvcj9FPGd0Pj4gZGlyZWN0aXZlIGRvZXMgSTxub3Q+IG1lYW4gImFsd2F5cyBmYWlsIChidXQKK2RvIHNvIHNpbGVudGx5IHVubGVzcyBjb21taXR0ZWQpIi4gSXQgYWN0dWFsbHkgbWVhbnMgIm9ubHkgZmFpbCAoYW5kIHJlcG9ydCkgaWYKK2NvbW1pdHRlZCwgb3RoZXJ3aXNlIEk8c3VjY2VlZD4iLiBUbyBhY2hpZXZlIHRoZSAiZmFpbCBzaWxlbnRseSBpZiB1bmNvbW1pdHRlZCIKK3NlbWFudGljcywgaXQgaXMgbmVjZXNzYXJ5IHRvIHVzZToKKworICAgIHJ1bGU6IGl0ZW0gPGNvbW1pdD4gaXRlbShzKQorICAgIHwgPGVycm9yPz4gPHJlamVjdD4gICMgRkFJTCBTSUxFTlRMWSBVTkxFU1MgQ09NTUlUVEVECisKK0hvd2V2ZXIsIGJlY2F1c2UgcGVvcGxlIHNlZW0gdG8gZXhwZWN0IGEgbG9uZSBDPEU8bHQ+ZXJyb3I/RTxndD4+IGRpcmVjdGl2ZQordG8gd29yayBsaWtlIHRoaXM6CisKKyAgICBydWxlOiBpdGVtIDxjb21taXQ+IGl0ZW0ocykKKyAgICB8IDxlcnJvcj86IEVycm9yIG1lc3NhZ2UgaWYgY29tbWl0dGVkPgorICAgIHwgPGVycm9yOiAgRXJyb3IgbWVzc2FnZSBpZiB1bmNvbW1pdHRlZD4KKworUGFyc2U6OlJlY0Rlc2NlbnQgYXV0b21hdGljYWxseSBhcHBlbmRzIGEKK0M8RTxsdD5yZWplY3RFPGd0Pj4gZGlyZWN0aXZlIGlmIHRoZSBDPEU8bHQ+ZXJyb3I/RTxndD4+IGRpcmVjdGl2ZQoraXMgdGhlIG9ubHkgaXRlbSBpbiBhIHByb2R1Y3Rpb24uIEEgbGV2ZWwgMiB3YXJuaW5nIChzZWUgYmVsb3cpCitpcyBpc3N1ZWQgd2hlbiB0aGlzIGhhcHBlbnMuCisKK1RoZSBsZXZlbCBvZiBlcnJvciByZXBvcnRpbmcgZHVyaW5nIGJvdGggcGFyc2VyIGNvbnN0cnVjdGlvbiBhbmQKK3BhcnNpbmcgaXMgY29udHJvbGxlZCBieSB0aGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBmb3VyIGdsb2JhbAordmFyaWFibGVzOiBDPCQ6OlJEX0VSUk9SUz4sIEM8JDo6UkRfV0FSTj4sIEM8JDo6UkRfSElOVD4sIGFuZAorPCQ6OlJEX1RSQUNFPi4gSWYgQzwkOjpSRF9FUlJPUlM+IGlzIGRlZmluZWQgKGFuZCwgYnkgZGVmYXVsdCwgaXQgaXMpCit0aGVuIGZhdGFsIGVycm9ycyBhcmUgcmVwb3J0ZWQuCisKK1doZW5ldmVyIEM8JDo6UkRfV0FSTj4gaXMgZGVmaW5lZCwgY2VydGFpbiBub24tZmF0YWwgcHJvYmxlbXMgYXJlIGFsc28gcmVwb3J0ZWQuCisKK1dhcm5pbmdzIGhhdmUgYW4gYXNzb2NpYXRlZCAibGV2ZWwiOiAxLCAyLCBvciAzLiBUaGUgaGlnaGVyIHRoZSBsZXZlbCwKK3RoZSBtb3JlIHNlcmlvdXMgdGhlIHdhcm5pbmcuIFRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBnbG9iYWwKK3ZhcmlhYmxlIChDPCQ6OlJEX1dBUk4+KSBkZXRlcm1pbmVzIHRoZSBJPGxvd2VzdD4gbGV2ZWwgb2Ygd2FybmluZyB0bworYmUgZGlzcGxheWVkLiBIZW5jZSwgdG8gc2VlIEk8YWxsPiB3YXJuaW5ncywgc2V0IEM8JDo6UkRfV0FSTj4gdG8gMS4KK1RvIHNlZSBvbmx5IHRoZSBtb3N0IHNlcmlvdXMgd2FybmluZ3Mgc2V0IEM8JDo6UkRfV0FSTj4gdG8gMy4KK0J5IGRlZmF1bHQgQzwkOjpSRF9XQVJOPiBpcyBpbml0aWFsaXplZCB0byAzLCBlbnN1cmluZyB0aGF0IHNlcmlvdXMgYnV0Citub24tZmF0YWwgZXJyb3JzIGFyZSBhdXRvbWF0aWNhbGx5IHJlcG9ydGVkLgorCitUaGVyZSBpcyBhbHNvIGEgZ3JhbW1hciBkaXJlY3RpdmUgdG8gdHVybiBvbiB3YXJuaW5ncyBmcm9tIHdpdGhpbiB0aGUKK2dyYW1tYXI6IEM8PCA8d2Fybj4gPj4uIEl0IHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LCB3aGljaCBzcGVjaWZpZXMKK3RoZSB3YXJuaW5nIGxldmVsOiBDPDwgPHdhcm46IDI+ID4+LgorCitTZWUgRjwiRElBR05PU1RJQ1MiPiBmb3IgYSBsaXN0IG9mIHRoZSB2YXJvdXMgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMKK3RoYXQgUGFyc2U6OlJlY0Rlc2NlbnQgZ2VuZXJhdGVzIHdoZW4gdGhlc2UgdHdvIHZhcmlhYmxlcyBhcmUgZGVmaW5lZC4KKworRGVmaW5pbmcgYW55IG9mIHRoZSByZW1haW5pbmcgdmFyaWFibGVzICh3aGljaCBhcmUgbm90IGRlZmluZWQgYnkKK2RlZmF1bHQpIGZ1cnRoZXIgaW5jcmVhc2VzIHRoZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gcmVwb3J0ZWQuCitEZWZpbmluZyBDPCQ6OlJEX0hJTlQ+IGNhdXNlcyB0aGUgcGFyc2VyIGdlbmVyYXRvciB0byBvZmZlcgorbW9yZSBkZXRhaWxlZCBhbmFseXNlcyBhbmQgaGludHMgb24gYm90aCBlcnJvcnMgYW5kIHdhcm5pbmdzLgorTm90ZSB0aGF0IHNldHRpbmcgQzwkOjpSRF9ISU5UPiBhdCBhbnkgcG9pbnQgYXV0b21hZ2ljYWxseQorc2V0cyBDPCQ6OlJEX1dBUk4+IHRvIDEuIFRoZXJlIGlzIGFsc28gYSBDPDwgPGhpbnQ+ID4+IGRpcmVjdGl2ZSwgd2hpY2ggY2FuCitiZSBoYXJkLWNvZGVkIGludG8gYSBncmFtbWFyLgorCitEZWZpbmluZyBDPCQ6OlJEX1RSQUNFPiBjYXVzZXMgdGhlIHBhcnNlciBnZW5lcmF0b3IgYW5kIHRoZSBwYXJzZXIgdG8KK3JlcG9ydCB0aGVpciBwcm9ncmVzcyB0byBTVERFUlIgaW4gZXhjcnVjaWF0aW5nIGRldGFpbCAoYWx0aG91Z2gsIHdpdGhvdXQgaGludHMKK3VubGVzcyAkOjpSRF9ISU5UIGlzIHNlcGFyYXRlbHkgZGVmaW5lZCkuIFRoaXMgZGV0YWlsCitjYW4gYmUgbW9kZXJhdGVkIGluIG9ubHkgb25lIHJlc3BlY3Q6IGlmIEM8JDo6UkRfVFJBQ0U+IGhhcyBhbgoraW50ZWdlciB2YWx1ZSAoSTxOPikgZ3JlYXRlciB0aGFuIDEsIG9ubHkgdGhlIEk8Tj4gY2hhcmFjdGVycyBvZgordGhlICJjdXJyZW50IHBhcnNpbmcgY29udGV4dCIgKHRoYXQgaXMsIHdoZXJlIGluIHRoZSBpbnB1dCBzdHJpbmcgd2UKK2FyZSBhdCBhbnkgcG9pbnQgaW4gdGhlIHBhcnNlKSBpcyByZXBvcnRlZCBhdCBhbnkgdGltZS4KKworQzwkOjpSRF9UUkFDRT4gaXMgbWFpbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIGEgZ3JhbW1hciB0aGF0IGlzbid0CitiZWhhdmluZyBhcyB5b3UgZXhwZWN0ZWQgaXQgdG8uIFRvIHRoaXMgZW5kLCBpZiBDPCQ6OlJEX1RSQUNFPiBpcworZGVmaW5lZCB3aGVuIGEgcGFyc2VyIGlzIGJ1aWx0LCBhbnkgYWN0dWFsIHBhcnNlciBjb2RlIHdoaWNoIGlzCitnZW5lcmF0ZWQgaXMgYWxzbyB3cml0dGVuIHRvIGEgZmlsZSBuYW1lZCAiUkRfVFJBQ0UiIGluIHRoZSBsb2NhbAorZGlyZWN0b3J5LgorCitUaGVyZSBhcmUgdHdvIGRpcmVjdGl2ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBDPCQ6OlJEX1RSQUNFPiB2YXJpYWJsZS4KK0lmIGEgZ3JhbW1hciBjb250YWlucyBhIEM8PCA8dHJhY2VfYnVpbGQ+ID4+IGRpcmVjdGl2ZSBhbnl3aGVyZSBpbiBpdHMKK3NwZWNpZmljYXRpb24sIEM8JDo6UkRfVFJBQ0U+IGlzIHR1cm5lZCBvbiBkdXJpbmcgdGhlIHBhcnNlciBjb25zdHJ1Y3Rpb24KK3BoYXNlLiAgSWYgYSBncmFtbWFyIGNvbnRhaW5zIGEgQzw8IDx0cmFjZV9wYXJzZT4gPj4gZGlyZWN0aXZlIGFueXdoZXJlIGluIGl0cworc3BlY2lmaWNhdGlvbiwgQzwkOjpSRF9UUkFDRT4gaXMgdHVybmVkIG9uIGR1cmluZyBhbnkgcGFyc2UgdGhlIHBhcnNlcgorcGVyZm9ybXMuCisKK05vdGUgdGhhdCB0aGUgZm91ciB2YXJpYWJsZXMgYmVsb25nIHRvIHRoZSAibWFpbiIgcGFja2FnZSwgd2hpY2gKK21ha2VzIHRoZW0gZWFzaWVyIHRvIHJlZmVyIHRvIGluIHRoZSBjb2RlIGNvbnRyb2xsaW5nIHRoZSBwYXJzZXIsIGFuZAorYWxzbyBtYWtlcyBpdCBlYXN5IHRvIHR1cm4gdGhlbSBpbnRvIGNvbW1hbmQgbGluZSBmbGFncyAoIi1SRF9FUlJPUlMiLAorIi1SRF9XQVJOIiwgIi1SRF9ISU5UIiwgIi1SRF9UUkFDRSIpIHVuZGVyIEI8cGVybCAtcz4uCisKK1RoZSBjb3JyZXNwb25kaW5nIGRpcmVjdGl2ZXMgYXJlIHVzZWZ1bCB0byAiaGFyZHdpcmUiIHRoZSB2YXJpb3VzCitkZWJ1Z2dpbmcgZmVhdHVyZXMgaW50byBhIHBhcnRpY3VsYXIgZ3JhbW1hciAocmF0aGVyIHRoYW4gaGF2aW5nIHRvIHNldAorYW5kIHJlc2V0IGV4dGVybmFsIHZhcmlhYmxlcykuCisKKz1pdGVtIFJlZGlyZWN0aW5nIGRpYWdub3N0aWNzCisKK1RoZSBkaWFnbm9zdGljcyBwcm92aWRlZCBieSB0aGUgdHJhY2luZyBtZWNoYW5pc20gYWx3YXlzIGdvIHRvIFNUREVSUi4KK0lmIHlvdSBuZWVkIHRoZW0gdG8gZ28gZWxzZXdoZXJlLCBsb2NhbGl6ZSBhbmQgcmVvcGVuIFNUREVSUiBwcmlvciB0byB0aGUKK3BhcnNlLgorCitGb3IgZXhhbXBsZToKKworICAgIHsKKyAgICAgICAgbG9jYWwgKlNUREVSUiA9IElPOjpGaWxlLT5uZXcoIj4kZmlsZW5hbWUiKSBvciBkaWUgJCE7CisKKyAgICAgICAgbXkgJHJlc3VsdCA9ICRwYXJzZXItPnN0YXJ0cnVsZSgkdGV4dCk7CisgICAgfQorCisKKz1pdGVtIENvbnNpc3RlbmN5IGNoZWNrcworCitXaGVuZXZlciBhIHBhcnNlciBpcyBidWlsZCwgUGFyc2U6OlJlY0Rlc2NlbnQgY2FycmllcyBvdXQgYSBudW1iZXIgb2YKKyhwb3RlbnRpYWxseSBleHBlbnNpdmUpIGNvbnNpc3RlbmN5IGNoZWNrcy4gVGhlc2UgaW5jbHVkZTogdmVyaWZ5aW5nIHRoYXQgdGhlCitncmFtbWFyIGlzIG5vdCBsZWZ0LXJlY3Vyc2l2ZSBhbmQgdGhhdCBubyBydWxlcyBoYXZlIGJlZW4gbGVmdCB1bmRlZmluZWQuCisKK1RoZXNlIGNoZWNrcyBhcmUgaW1wb3J0YW50IHNhZmVndWFyZHMgZHVyaW5nIGRldmVsb3BtZW50LCBidXQgdW5uZWNlc3NhcnkKK292ZXJoZWFkcyB3aGVuIHRoZSBncmFtbWFyIGlzIHN0YWJsZSBhbmQgcmVhZHkgdG8gYmUgZGVwbG95ZWQuIFNvCitQYXJzZTo6UmVjRGVzY2VudCBwcm92aWRlcyBhIGRpcmVjdGl2ZSB0byBkaXNhYmxlIHRoZW06IEM8PCA8bm9jaGVjaz4gPj4uCisKK0lmIGEgZ3JhbW1hciBjb250YWlucyBhIEM8PCA8bm9jaGVjaz4gPj4gZGlyZWN0aXZlIGFueXdoZXJlIGluIGl0cworc3BlY2lmaWNhdGlvbiwgdGhlIGV4dHJhIGNvbXBpbGUtdGltZSBjaGVja3MgYXJlIGJ5LXBhc3NlZC4KKworCis9aXRlbSBTcGVjaWZ5aW5nIGxvY2FsIHZhcmlhYmxlcworCitJdCBpcyBvY2Nhc2lvbmFsbHkgY29udmVuaWVudCB0byBzcGVjaWZ5IHZhcmlhYmxlcyB3aGljaCBhcmUgbG9jYWwKK3RvIGEgc2luZ2xlIHJ1bGUuIFRoaXMgbWF5IGJlIGFjaGlldmVkIGJ5IGluY2x1ZGluZyBhCitDPEU8bHQ+cnVsZXZhcjouLi5FPGd0Pj4gZGlyZWN0aXZlIGFueXdoZXJlIGluIHRoZSBydWxlLiBGb3IgZXhhbXBsZToKKworICAgIG1hcmt1cDogPHJ1bGV2YXI6ICR0YWc+CisKKyAgICBtYXJrdXA6IHRhZyB7KCR0YWc9JGl0ZW1bMV0pID1+IHMvXjx8PiQvL2d9IGJvZHlbJHRhZ10KKworVGhlIGV4YW1wbGUgQzxFPGx0PnJ1bGV2YXI6ICR0YWdFPGd0Pj4gZGlyZWN0aXZlIGNhdXNlcyBhICJteSIgdmFyaWFibGUgbmFtZWQKK0M8JHRhZz4gdG8gYmUgZGVjbGFyZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdWJyb3V0aW5lIGltcGxlbWVudGluZyB0aGUKK0M8bWFya3VwPiBydWxlICh0aGF0IGlzLCBJPGJlZm9yZT4gdGhlIGZpcnN0IHByb2R1Y3Rpb24sIHJlZ2FyZGxlc3Mgb2YKK3doZXJlIGluIHRoZSBydWxlIGl0IGlzIHNwZWNpZmllZCkuCisKK1NwZWNpZmljYWxseSwgYW55IGRpcmVjdGl2ZSBvZiB0aGUgZm9ybToKK0M8RTxsdD5ydWxldmFyOkk8dGV4dD5FPGd0Pj4gY2F1c2VzIGEgbGluZSBvZiB0aGUgZm9ybSBDPG15IEk8dGV4dD47PgordG8gYmUgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcnVsZSBzdWJyb3V0aW5lLCBpbW1lZGlhdGVseSBhZnRlcgordGhlIGRlZmluaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbG9jYWwgdmFyaWFibGVzOgorCisgICAgJHRoaXNwYXJzZXIgJGNvbW1pdAorICAgICR0aGlzcnVsZSAgIEBpdGVtCisgICAgJHRoaXNsaW5lICAgQGFyZworICAgICR0ZXh0ICAgJWFyZworCitUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBDPEU8bHQ+cnVsZXZhckU8Z3Q+PiBkaXJlY3RpdmVzIHdvcmsKK2FzIGV4cGVjdGVkOgorCisgICAgPHJ1bGV2YXI6ICRjb3VudCA9IDAgPgorCisgICAgPHJ1bGV2YXI6ICRmaXJzdGFyZyA9ICRhcmdbMF0gfHwgJycgPgorCisgICAgPHJ1bGV2YXI6ICRteUl0ZW1zID0gXEBpdGVtID4KKworICAgIDxydWxldmFyOiBAY29udGV4dCA9ICggJHRoaXNsaW5lLCAkdGV4dCwgQGFyZyApID4KKworICAgIDxydWxldmFyOiAoJG5hbWUsJGFnZSkgPSAkYXJneyJuYW1lIiwiYWdlIn0gPgorCitJZiBhIHZhcmlhYmxlIHRoYXQgaXMgYWxzbyB2aXNpYmxlIHRvIHN1YnJ1bGVzIGlzIHJlcXVpcmVkLCBpdCBuZWVkcwordG8gYmUgQzxsb2NhbD4nZCwgbm90IEM8bXk+J2QuIEM8cnVsZXZhcj4gZGVmYXVsdHMgdG8gQzxteT4sIGJ1dCBpZiBDPGxvY2FsPgoraXMgZXhwbGljaXRseSBzcGVjaWZpZWQ6CisKKyAgICA8cnVsZXZhcjogbG9jYWwgJGNvdW50ID0gMCA+CisKK3RoZW4gYSBDPGxvY2FsPi1pemVkIHZhcmlhYmxlIGlzIGRlY2xhcmVkIGluc3RlYWQsIGFuZCB3aWxsIGJlIGF2YWlsYWJsZQord2l0aGluIHN1YnJ1bGVzLgorCitOb3RlIGhvd2V2ZXIgdGhhdCwgYmVjYXVzZSBhbGwgc3VjaCB2YXJpYWJsZXMgYXJlICJteSIgdmFyaWFibGVzLCB0aGVpcgordmFsdWVzIEk8ZG8gbm90IHBlcnNpc3Q+IGJldHdlZW4gbWF0Y2ggYXR0ZW1wdHMgb24gYSBnaXZlbiBydWxlLiBUbworcHJlc2VydmUgdmFsdWVzIGJldHdlZW4gbWF0Y2ggYXR0ZW1wdHMsIHZhbHVlcyBjYW4gYmUgc3RvcmVkIHdpdGhpbiB0aGUKKyJsb2NhbCIgbWVtYmVyIG9mIHRoZSBDPCR0aGlzcnVsZT4gb2JqZWN0OgorCisgICAgY291bnRlZHJ1bGU6IHsgJHRoaXNydWxlLT57ImxvY2FsIn17ImNvdW50In0rKyB9CisgICAgICAgICA8cmVqZWN0PgorICAgICAgIHwgc3VicnVsZTEKKyAgICAgICB8IHN1YnJ1bGUyCisgICAgICAgfCA8cmVqZWN0OiAkdGhpc3J1bGUtPnsibG9jYWwifXsiY291bnQifSA9PSAxPgorICAgICAgICAgc3VicnVsZTMKKworCitXaGVuIG1hdGNoaW5nIGEgcnVsZSwgZWFjaCBDPEU8bHQ+cnVsZXZhckU8Z3Q+PiBkaXJlY3RpdmUgaXMgbWF0Y2hlZCBhcworaWYgaXQgd2VyZSBhbiB1bmNvbmRpdGlvbmFsIEM8RTxsdD5yZWplY3RFPGd0Pj4gZGlyZWN0aXZlICh0aGF0IGlzLCBpdAorY2F1c2VzIGFueSBwcm9kdWN0aW9uIGluIHdoaWNoIGl0IGFwcGVhcnMgdG8gaW1tZWRpYXRlbHkgZmFpbCB0byBtYXRjaCkuCitGb3IgdGhpcyByZWFzb24gKGFuZCB0byBpbXByb3ZlIHJlYWRhYmlsaXR5KSBpdCBpcyB1c3VhbCB0byBzcGVjaWZ5IGFueQorQzxFPGx0PnJ1bGV2YXJFPGd0Pj4gZGlyZWN0aXZlIGluIGEgc2VwYXJhdGUgcHJvZHVjdGlvbiBhdCB0aGUgc3RhcnQgb2YKK3RoZSBydWxlICh0aGlzIGhhcyB0aGUgYWRkZWQgYWR2YW50YWdlIHRoYXQgaXQgZW5hYmxlcworQzxQYXJzZTo6UmVjRGVzY2VudD4gdG8gb3B0aW1pemUgYXdheSBzdWNoIHByb2R1Y3Rpb25zLCBqdXN0IGFzIGl0IGRvZXMKK2ZvciB0aGUgQzxFPGx0PnJlamVjdEU8Z3Q+PiBkaXJlY3RpdmUpLgorCisKKz1pdGVtIER5bmFtaWNhbGx5IG1hdGNoZWQgcnVsZXMKKworQmVjYXVzZSByZWdleGVzIGFuZCBkb3VibGUtcXVvdGVkIHN0cmluZ3MgYXJlIGludGVycG9sYXRlZCwgaXQgaXMgcmVsYXRpdmVseQorZWFzeSB0byBzcGVjaWZ5IHByb2R1Y3Rpb25zIHdpdGggImNvbnRleHQgc2Vuc2l0aXZlIiB0b2tlbnMuIEZvciBleGFtcGxlOgorCisgICAgY29tbWFuZDogIGtleXdvcmQgIGJvZHkgICJlbmQgJGl0ZW1bMV0iCisKK3doaWNoIGVuc3VyZXMgdGhhdCBhIGNvbW1hbmQgYmxvY2sgaXMgYm91bmRlZCBieSBhCisiSTxFPGx0PmtleXdvcmRFPGd0Pj4uLi5lbmQgSTxFPGx0PnNhbWUga2V5d29yZEU8Z3Q+PiIgcGFpci4KKworQnVpbGRpbmcgcHJvZHVjdGlvbnMgaW4gd2hpY2ggc3VicnVsZXMgYXJlIGNvbnRleHQgc2Vuc2l0aXZlIGlzIGFsc28gcG9zc2libGUsCit2aWEgdGhlIEM8RTxsdD5tYXRjaHJ1bGU6Li4uRTxndD4+IGRpcmVjdGl2ZS4gVGhpcyBkaXJlY3RpdmUgYmVoYXZlcworaWRlbnRpY2FsbHkgdG8gYSBzdWJydWxlIGl0ZW0sIGV4Y2VwdCB0aGF0IHRoZSBydWxlIHdoaWNoIGlzIGludm9rZWQgdG8gbWF0Y2gKK2l0IGlzIGRldGVybWluZWQgYnkgdGhlIHN0cmluZyBzcGVjaWZpZWQgYWZ0ZXIgdGhlIGNvbG9uLiBGb3IgZXhhbXBsZSwgd2UgY291bGQKK3Jld3JpdGUgdGhlIEM8Y29tbWFuZD4gcnVsZSBsaWtlIHRoaXM6CisKKyAgICBjb21tYW5kOiAga2V5d29yZCAgPG1hdGNocnVsZTpib2R5PiAgImVuZCAkaXRlbVsxXSIKKworV2hhdGV2ZXIgYXBwZWFycyBhZnRlciB0aGUgY29sb24gaW4gdGhlIGRpcmVjdGl2ZSBpcyB0cmVhdGVkIGFzIGFuIGludGVycG9sYXRlZAorc3RyaW5nICh0aGF0IGlzLCBhcyBpZiBpdCBhcHBlYXJlZCBpbiBDPHFxey4uLn0+IG9wZXJhdG9yKSBhbmQgdGhlIHZhbHVlIG9mCit0aGF0IGludGVycG9sYXRlZCBzdHJpbmcgaXMgdGhlIG5hbWUgb2YgdGhlIHN1YnJ1bGUgdG8gYmUgbWF0Y2hlZC4KKworT2YgY291cnNlLCBqdXN0IHB1dHRpbmcgYSBjb25zdGFudCBzdHJpbmcgbGlrZSBDPGJvZHk+IGluIGEKK0M8RTxsdD5tYXRjaHJ1bGU6Li4uRTxndD4+IGRpcmVjdGl2ZSBpcyBvZiBsaXR0bGUgaW50ZXJlc3Qgb3IgYmVuZWZpdC4KK1RoZSBwb3dlciBvZiBkaXJlY3RpdmUgaXMgc2VlbiB3aGVuIHdlIHVzZSBhIHN0cmluZyB0aGF0IGludGVycG9sYXRlcwordG8gc29tZXRoaW5nIGludGVyZXN0aW5nLiBGb3IgZXhhbXBsZToKKworICAgIGNvbW1hbmQ6ICAgIGtleXdvcmQgPG1hdGNocnVsZTokaXRlbVsxXV9ib2R5PiAiZW5kICRpdGVtWzFdIgorCisgICAga2V5d29yZDogICAgJ3doaWxlJyB8ICdpZicgfCAnZnVuY3Rpb24nCisKKyAgICB3aGlsZV9ib2R5OiBjb25kaXRpb24gYmxvY2sKKworICAgIGlmX2JvZHk6ICAgIGNvbmRpdGlvbiBibG9jayAoJ2Vsc2UnIGJsb2NrKSg/KQorCisgICAgZnVuY3Rpb25fYm9keTogIGFyZ2xpc3QgYmxvY2sKKworTm93IHRoZSBDPGNvbW1hbmQ+IHJ1bGUgc2VsZWN0cyBob3cgdG8gcHJvY2VlZCBvbiB0aGUgYmFzaXMgb2YgdGhlIGtleXdvcmQKK3RoYXQgaXMgZm91bmQuIEl0IGlzIGFzIGlmIEM8Y29tbWFuZD4gd2VyZSBkZWNsYXJlZDoKKworICAgIGNvbW1hbmQ6ICAgICd3aGlsZScgICAgd2hpbGVfYm9keSAgICAiZW5kIHdoaWxlIgorICAgICAgIHwgICAgJ2lmJyAgICAgICBpZl9ib2R5ICAgImVuZCBpZiIKKyAgICAgICB8ICAgICdmdW5jdGlvbicgZnVuY3Rpb25fYm9keSAiZW5kIGZ1bmN0aW9uIgorCisKK1doZW4gYSBDPEU8bHQ+bWF0Y2hydWxlOi4uLkU8Z3Q+PiBkaXJlY3RpdmUgaXMgdXNlZCBhcyBhIHJlcGVhdGVkCitzdWJydWxlLCB0aGUgcnVsZSBuYW1lIGV4cHJlc3Npb24gaXMgImxhdGUtYm91bmQiLiBUaGF0IGlzLCB0aGUgbmFtZSBvZgordGhlIHJ1bGUgdG8gYmUgY2FsbGVkIGlzIHJlLWV2YWx1YXRlZCBJPGVhY2ggdGltZT4gYSBtYXRjaCBhdHRlbXB0IGlzCittYWRlLiBIZW5jZSwgdGhlIGZvbGxvd2luZyBncmFtbWFyOgorCisgICAgeyAkOjpzcGVjaWVzID0gJ2RvZ3MnIH0KKworICAgIHBhaXI6ICAgJ3R3bycgPG1hdGNocnVsZTokOjpzcGVjaWVzPihzKQorCisgICAgZG9nczogICAvZG9ncy8geyAkOjpzcGVjaWVzID0gJ2NhdHMnIH0KKworICAgIGNhdHM6ICAgL2NhdHMvCisKK3dpbGwgbWF0Y2ggdGhlIHN0cmluZyAidHdvIGRvZ3MgY2F0cyBjYXRzIiBjb21wbGV0ZWx5LCB3aGVyZWFzIGl0IHdpbGwKK29ubHkgbWF0Y2ggdGhlIHN0cmluZyAidHdvIGRvZ3MgZG9ncyBkb2dzIiB1cCB0byB0aGUgZWlnaHRoIGxldHRlci4gSWYKK3RoZSBydWxlIG5hbWUgd2VyZSAiZWFybHkgYm91bmQiICh0aGF0IGlzLCBldmFsdWF0ZWQgb25seSB0aGUgZmlyc3QKK3RpbWUgdGhlIGRpcmVjdGl2ZSBpcyBlbmNvdW50ZXJlZCBpbiBhIHByb2R1Y3Rpb24pLCB0aGUgcmV2ZXJzZQorYmVoYXZpb3VyIHdvdWxkIGJlIGV4cGVjdGVkLgorCitOb3RlIHRoYXQgdGhlIEM8bWF0Y2hydWxlPiBkaXJlY3RpdmUgdGFrZXMgYSBzdHJpbmcgdGhhdCBpcyB0byBiZSB0cmVhdGVkCithcyBhIHJ1bGUgbmFtZSwgSTxub3Q+IGFzIGEgcnVsZSBpbnZvY2F0aW9uLiBUaGF0IGlzLAoraXQncyBsaWtlIGEgUGVybCBzeW1ib2xpYyByZWZlcmVuY2UsIG5vdCBhbiBDPGV2YWw+LiBKdXN0IGFzIHlvdSBjYW4gc2F5OgorCisgICAgJHN1Ym5hbWUgPSAnZm9vJzsKKworICAgICMgYW5kIGxhdGVyLi4uCisKKyAgICAmeyRmb299KEBhcmdzKTsKKworYnV0IG5vdDoKKworICAgICRzdWJuYW1lID0gJ2ZvbyhAYXJncyknOworCisgICAgIyBhbmQgbGF0ZXIuLi4KKworICAgICZ7JGZvb307CisKK2xpa2V3aXNlIHlvdSBjYW4gc2F5OgorCisgICAgJHJ1bGVuYW1lID0gJ2Zvbyc7CisKKyAgICAjIGFuZCBpbiB0aGUgZ3JhbW1hci4uLgorCisgICAgPG1hdGNocnVsZTokcnVsZW5hbWU+W0BhcmdzXQorCitidXQgbm90OgorCisgICAgJHJ1bGVuYW1lID0gJ2Zvb1tAYXJnc10nOworCisgICAgIyBhbmQgaW4gdGhlIGdyYW1tYXIuLi4KKworICAgIDxtYXRjaHJ1bGU6JHJ1bGVuYW1lPgorCisKKz1pdGVtIERlZmVycmVkIGFjdGlvbnMKKworVGhlIEM8RTxsdD5kZWZlcjouLi5FPGd0Pj4gZGlyZWN0aXZlIGlzIHVzZWQgdG8gc3BlY2lmeSBhbiBhY3Rpb24gdG8gYmUKK3BlcmZvcm1lZCB3aGVuIChhbmQgb25seSBpZiEpIHRoZSBjdXJyZW50IHByb2R1Y3Rpb24gdWx0aW1hdGVseSBzdWNjZWVkcy4KKworV2hlbmV2ZXIgYSBDPEU8bHQ+ZGVmZXI6Li4uRTxndD4+IGRpcmVjdGl2ZSBhcHBlYXJzLCB0aGUgY29kZSBpdCBzcGVjaWZpZXMKK2lzIGNvbnZlcnRlZCB0byBhIGNsb3N1cmUgKGFuIGFub255bW91cyBzdWJyb3V0aW5lIHJlZmVyZW5jZSkgd2hpY2ggaXMKK3F1ZXVlZCB3aXRoaW4gdGhlIGFjdGl2ZSBwYXJzZXIgb2JqZWN0LiBOb3RlIHRoYXQsCitiZWNhdXNlIHRoZSBkZWZlcnJlZCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhIGNsb3N1cmUsIHRoZSB2YWx1ZXMgb2YgYW55CisibG9jYWwiIHZhcmlhYmxlIChzdWNoIGFzIEM8JHRleHQ+LCA8QGl0ZW0+LCBldGMuKSBhcmUgcHJlc2VydmVkCit1bnRpbCB0aGUgZGVmZXJyZWQgY29kZSBpcyBhY3R1YWxseSBleGVjdXRlZC4KKworSWYgdGhlIHBhcnNlIHVsdGltYXRlbHkgc3VjY2VlZHMKK0k8YW5kPiB0aGUgcHJvZHVjdGlvbiBpbiB3aGljaCB0aGUgQzxFPGx0PmRlZmVyOi4uLkU8Z3Q+PiBkaXJlY3RpdmUgd2FzCitldmFsdWF0ZWQgZm9ybWVkIHBhcnQgb2YgdGhlIHN1Y2Nlc3NmdWwgcGFyc2UsIHRoZW4gdGhlIGRlZmVycmVkIGNvZGUgaXMKK2V4ZWN1dGVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgcGFyc2UgcmV0dXJucy4gSWYgaG93ZXZlciB0aGUgcHJvZHVjdGlvbgord2hpY2ggcXVldWVkIGEgZGVmZXJyZWQgYWN0aW9uIGZhaWxzLCBvciBvbmUgb2YgdGhlIGhpZ2hlci1sZXZlbAorcnVsZXMgd2hpY2ggY2FsbGVkIHRoYXQgcHJvZHVjdGlvbiBmYWlscywgdGhlbiB0aGUgZGVmZXJyZWQgYWN0aW9uIGlzCityZW1vdmVkIGZyb20gdGhlIHF1ZXVlLCBhbmQgaGVuY2UgaXMgbmV2ZXIgZXhlY3V0ZWQuCisKK0ZvciBleGFtcGxlLCBnaXZlbiB0aGUgZ3JhbW1hcjoKKworICAgIHNlbnRlbmNlOiBub3VuIHRyYW5zIG5vdW4KKyAgICB8IG5vdW4gaW50cmFucworCisgICAgbm91bjogICAgICd0aGUgZG9nJworICAgICAgICB7IHByaW50ICIkaXRlbVsxXVx0KG5vdW4pXG4iIH0KKyAgICB8ICAgICAndGhlIG1lYXQnCisgICAgICAgIHsgcHJpbnQgIiRpdGVtWzFdXHQobm91bilcbiIgfQorCisgICAgdHJhbnM6ICAgICdhdGUnCisgICAgICAgIHsgcHJpbnQgIiRpdGVtWzFdXHQodHJhbnNpdGl2ZSlcbiIgfQorCisgICAgaW50cmFuczogICdhdGUnCisgICAgICAgIHsgcHJpbnQgIiRpdGVtWzFdXHQoaW50cmFuc2l0aXZlKVxuIiB9CisgICAgICAgfCAgJ2JhcmtlZCcKKyAgICAgICAgeyBwcmludCAiJGl0ZW1bMV1cdChpbnRyYW5zaXRpdmUpXG4iIH0KKwordGhlbiBwYXJzaW5nIHRoZSBzZW50ZW5jZSBDPCJ0aGUgZG9nIGF0ZSI+IHdvdWxkIHByb2R1Y2UgdGhlIG91dHB1dDoKKworICAgIHRoZSBkb2cgIChub3VuKQorICAgIGF0ZSAgKHRyYW5zaXRpdmUpCisgICAgdGhlIGRvZyAgKG5vdW4pCisgICAgYXRlICAoaW50cmFuc2l0aXZlKQorCitUaGlzIGlzIGJlY2F1c2UsIGV2ZW4gdGhvdWdoIHRoZSBmaXJzdCBwcm9kdWN0aW9uIG9mIEM8c2VudGVuY2U+Cit1bHRpbWF0ZWx5IGZhaWxzLCBpdHMgaW5pdGlhbCBzdWJydWxlcyBDPG5vdW4+IGFuZCBDPHRyYW5zPiBkbyBtYXRjaCwKK2FuZCBoZW5jZSB0aGV5IGV4ZWN1dGUgdGhlaXIgYXNzb2NpYXRlZCBhY3Rpb25zLgorVGhlbiB0aGUgc2Vjb25kIHByb2R1Y3Rpb24gb2YgQzxzZW50ZW5jZT4gc3VjY2VlZHMsIGNhdXNpbmcgdGhlCithY3Rpb25zIG9mIHRoZSBzdWJydWxlcyBDPG5vdW4+IGFuZCBDPGludHJhbnM+IHRvIGJlIGV4ZWN1dGVkIGFzIHdlbGwuCisKK09uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgYWN0aW9ucyB3ZXJlIHJlcGxhY2VkIGJ5IEM8RTxsdD5kZWZlcjouLi5FPGd0Pj4KK2RpcmVjdGl2ZXM6CisKKyAgICBzZW50ZW5jZTogbm91biB0cmFucyBub3VuCisgICAgfCBub3VuIGludHJhbnMKKworICAgIG5vdW46ICAgICAndGhlIGRvZycKKyAgICAgICAgPGRlZmVyOiBwcmludCAiJGl0ZW1bMV1cdChub3VuKVxuIiA+CisgICAgfCAgICAgJ3RoZSBtZWF0JworICAgICAgICA8ZGVmZXI6IHByaW50ICIkaXRlbVsxXVx0KG5vdW4pXG4iID4KKworICAgIHRyYW5zOiAgICAnYXRlJworICAgICAgICA8ZGVmZXI6IHByaW50ICIkaXRlbVsxXVx0KHRyYW5zaXRpdmUpXG4iID4KKworICAgIGludHJhbnM6ICAnYXRlJworICAgICAgICA8ZGVmZXI6IHByaW50ICIkaXRlbVsxXVx0KGludHJhbnNpdGl2ZSlcbiIgPgorICAgICAgIHwgICdiYXJrZWQnCisgICAgICAgIDxkZWZlcjogcHJpbnQgIiRpdGVtWzFdXHQoaW50cmFuc2l0aXZlKVxuIiA+CisKK3RoZSBvdXRwdXQgd291bGQgYmU6CisKKyAgICB0aGUgZG9nICAobm91bikKKyAgICBhdGUgIChpbnRyYW5zaXRpdmUpCisKK3NpbmNlIGRlZmVycmVkIGFjdGlvbnMgYXJlIG9ubHkgZXhlY3V0ZWQgaWYgdGhleSB3ZXJlIGV2YWx1YXRlZCBpbgorYSBwcm9kdWN0aW9uIHdoaWNoIHVsdGltYXRlbHkgY29udHJpYnV0ZXMgdG8gdGhlIHN1Y2Nlc3NmdWwgcGFyc2UuCisKK0luIHRoaXMgY2FzZSwgZXZlbiB0aG91Z2ggdGhlIGZpcnN0IHByb2R1Y3Rpb24gb2YgQzxzZW50ZW5jZT4gY2F1c2VkCit0aGUgc3VicnVsZXMgQzxub3VuPiBhbmQgQzx0cmFucz4gdG8gbWF0Y2gsIHRoYXQgcHJvZHVjdGlvbiB1bHRpbWF0ZWx5CitmYWlsZWQgYW5kIHNvIHRoZSBkZWZlcnJlZCBhY3Rpb25zIHF1ZXVlZCBieSB0aG9zZSBzdWJydWxlcyB3ZXJlIHN1YnNlcXVlbnRseQorZGlzZ2FyZGVkLiBUaGUgc2Vjb25kIHByb2R1Y3Rpb24gdGhlbiBzdWNjZWVkZWQsIGNhdXNpbmcgdGhlIGVudGlyZQorcGFyc2UgdG8gc3VjY2VlZCwgYW5kIHNvIHRoZSBkZWZlcnJlZCBhY3Rpb25zIHF1ZXVlZCBieSB0aGUgKHNlY29uZCkgbWF0Y2ggb2YKK3RoZSBDPG5vdW4+IHN1YnJ1bGUgYW5kIHRoZSBzdWJzZXF1ZW50IG1hdGNoIG9mIEM8aW50cmFucz4gSTxhcmU+IHByZXNlcnZlZCBhbmQKK2V2ZW50dWFsbHkgZXhlY3V0ZWQuCisKK0RlZmVycmVkIGFjdGlvbnMgcHJvdmlkZSBhIG1lYW5zIG9mIGltcHJvdmluZyB0aGUgcGVyZm9ybWFuY2Ugb2YgYSBwYXJzZXIsCitieSBvbmx5IGV4ZWN1dGluZyB0aG9zZSBhY3Rpb25zIHdoaWNoIGFyZSBwYXJ0IG9mIHRoZSBmaW5hbCBwYXJzZS10cmVlCitmb3IgdGhlIGlucHV0IGRhdGEuCisKK0FsdGVybmF0aXZlbHksIGRlZmVycmVkIGFjdGlvbnMgY2FuIGJlIHZpZXdlZCBhcyBhIG1lY2hhbmlzbSBmb3IgYnVpbGRpbmcKKyhhbmQgZXhlY3V0aW5nKSBhCitjdXN0b21pemVkIHN1YnJvdXRpbmUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaW5wdXQgZGF0YSwgbXVjaCBpbiB0aGUKK3NhbWUgd2F5IHRoYXQgYXV0b2FjdGlvbnMgKHNlZSBMPCJBdXRvYWN0aW9ucyI+KSBjYW4gYmUgdXNlZCB0byBidWlsZCBhCitjdXN0b21pemVkIGRhdGEgc3RydWN0dXJlIGZvciBzcGVjaWZpYyBpbnB1dC4KKworV2hldGhlciBvciBub3QgdGhlIGFjdGlvbiBpdCBzcGVjaWZpZXMgaXMgZXZlciBleGVjdXRlZCwKK2EgQzxFPGx0PmRlZmVyOi4uLkU8Z3Q+PiBkaXJlY3RpdmUgYWx3YXlzIHN1Y2NlZWRzLCByZXR1cm5pbmcgdGhlCitudW1iZXIgb2YgZGVmZXJyZWQgYWN0aW9ucyBjdXJyZW50bHkgcXVldWVkIGF0IHRoYXQgcG9pbnQuCisKKworPWl0ZW0gUGFyc2luZyBQZXJsCisKK1BhcnNlOjpSZWNEZXNjZW50IHByb3ZpZGVzIGxpbWl0ZWQgc3VwcG9ydCBmb3IgcGFyc2luZyBzdWJzZXRzIG9mIFBlcmwsCituYW1lbHk6IHF1b3RlLWxpa2Ugb3BlcmF0b3JzLCBQZXJsIHZhcmlhYmxlcywgYW5kIGNvbXBsZXRlIGNvZGUgYmxvY2tzLgorCitUaGUgQzxFPGx0PnBlcmxfcXVvdGVsaWtlRTxndD4+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBwYXJzZSBhbnkgUGVybAorcXVvdGUtbGlrZSBvcGVyYXRvcjogQzwnYSBzdHJpbmcnPiwgQzxtL2EgcGF0dGVybi8+LCBDPHRye2Fuc317bGF0aW9ufT4sCitldGMuICBJdCBkb2VzIHRoaXMgYnkgY2FsbGluZyBUZXh0OjpCYWxhbmNlZDo6cXVvdGVsaWtlKCkuCisKK0lmIGEgcXVvdGUtbGlrZSBvcGVyYXRvciBpcyBmb3VuZCwgYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgb2YgZWlnaHQgZWxlbWVudHMKK2lzIHJldHVybmVkLiBUaG9zZSBlbGVtZW50cyBhcmUgaWRlbnRpY2FsIHRvIHRoZSBsYXN0IGVpZ2h0IGVsZW1lbnRzIHJldHVybmVkCitieSBUZXh0OjpCYWxhbmNlZDo6ZXh0cmFjdF9xdW90ZWxpa2UoKSBpbiBhbiBhcnJheSBjb250ZXh0LCBuYW1lbHk6CisKKz1vdmVyIDQKKworPWl0ZW0gWzBdCisKK3RoZSBuYW1lIG9mIHRoZSBxdW90ZWxpa2Ugb3BlcmF0b3IgLS0gJ3EnLCAncXEnLCAnbScsICdzJywgJ3RyJyAtLSBpZiB0aGUKK29wZXJhdG9yIHdhcyBuYW1lZDsgb3RoZXJ3aXNlIEM8dW5kZWY+LAorCis9aXRlbSBbMV0KKwordGhlIGxlZnQgZGVsaW1pdGVyIG9mIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgb3BlcmF0aW9uLAorCis9aXRlbSBbMl0KKwordGhlIHRleHQgb2YgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBvcGVyYXRpb24KKyh0aGF0IGlzLCB0aGUgY29udGVudHMgb2YKK2EgcXVvdGUsIHRoZSByZWdleCBvZiBhIG1hdGNoLCBvciBzdWJzdGl0dXRpb24gb3IgdGhlIHRhcmdldCBsaXN0IG9mIGEKK3RyYW5zbGF0aW9uKSwKKworPWl0ZW0gWzNdCisKK3RoZSByaWdodCBkZWxpbWl0ZXIgb2YgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBvcGVyYXRpb24sCisKKz1pdGVtIFs0XQorCit0aGUgbGVmdCBkZWxpbWl0ZXIgb2YgdGhlIHNlY29uZCBibG9jayBvZiB0aGUgb3BlcmF0aW9uIGlmIHRoZXJlIGlzIG9uZQorKHRoYXQgaXMsIGlmIGl0IGlzIGEgQzxzPiwgQzx0cj4sIG9yIEM8eT4pOyBvdGhlcndpc2UgQzx1bmRlZj4sCisKKz1pdGVtIFs1XQorCit0aGUgdGV4dCBvZiB0aGUgc2Vjb25kIGJsb2NrIG9mIHRoZSBvcGVyYXRpb24gaWYgdGhlcmUgaXMgb25lCisodGhhdCBpcywgdGhlIHJlcGxhY2VtZW50IG9mIGEgc3Vic3RpdHV0aW9uIG9yIHRoZSB0cmFuc2xhdGlvbiBsaXN0CitvZiBhIHRyYW5zbGF0aW9uKTsgb3RoZXJ3aXNlIEM8dW5kZWY+LAorCis9aXRlbSBbNl0KKwordGhlIHJpZ2h0IGRlbGltaXRlciBvZiB0aGUgc2Vjb25kIGJsb2NrIG9mIHRoZSBvcGVyYXRpb24gKGlmIGFueSk7CitvdGhlcndpc2UgQzx1bmRlZj4sCisKKz1pdGVtIFs3XQorCit0aGUgdHJhaWxpbmcgbW9kaWZpZXJzIG9uIHRoZSBvcGVyYXRpb24gKGlmIGFueSk7IG90aGVyd2lzZSBDPHVuZGVmPi4KKworPWJhY2sKKworSWYgYSBxdW90ZS1saWtlIGV4cHJlc3Npb24gaXMgbm90IGZvdW5kLCB0aGUgZGlyZWN0aXZlIGZhaWxzIHdpdGggdGhlIHVzdWFsCitDPHVuZGVmPiB2YWx1ZS4KKworVGhlIEM8RTxsdD5wZXJsX3ZhcmlhYmxlRTxndD4+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBwYXJzZSBhbnkgUGVybAordmFyaWFibGU6ICRzY2FsYXIsIEBhcnJheSwgJWhhc2gsICRyZWYtPntmaWVsZH1bJGluZGV4XSwgZXRjLgorSXQgZG9lcyB0aGlzIGJ5IGNhbGxpbmcgVGV4dDo6QmFsYW5jZWQ6OmV4dHJhY3RfdmFyaWFibGUoKS4KKworSWYgdGhlIGRpcmVjdGl2ZSBtYXRjaGVzIHRleHQgcmVwcmVzZW50aW5nIGEgdmFsaWQgUGVybCB2YXJpYWJsZQorc3BlY2lmaWNhdGlvbiwgaXQgcmV0dXJucyB0aGF0IHRleHQuIE90aGVyd2lzZSBpdCBmYWlscyB3aXRoIHRoZSB1c3VhbAorQzx1bmRlZj4gdmFsdWUuCisKK1RoZSBDPEU8bHQ+cGVybF9jb2RlYmxvY2tFPGd0Pj4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIHBhcnNlIGN1cmx5LWJyYWNlLWRlbGltaXRlZCBibG9jayBvZiBQZXJsIGNvZGUsIHN1Y2ggYXM6IHsgJGEgPSAxOyBmKCkgPX4gbS9wYXQvOyB9LgorSXQgZG9lcyB0aGlzIGJ5IGNhbGxpbmcgVGV4dDo6QmFsYW5jZWQ6OmV4dHJhY3RfY29kZWJsb2NrKCkuCisKK0lmIHRoZSBkaXJlY3RpdmUgbWF0Y2hlcyB0ZXh0IHJlcHJlc2VudGluZyBhIHZhbGlkIFBlcmwgY29kZSBibG9jaywKK2l0IHJldHVybnMgdGhhdCB0ZXh0LiBPdGhlcndpc2UgaXQgZmFpbHMgd2l0aCB0aGUgdXN1YWwgQzx1bmRlZj4gdmFsdWUuCisKK1lvdSBjYW4gYWxzbyB0ZWxsIGl0IHdoYXQga2luZCBvZiBicmFja2V0cyB0byB1c2UgYXMgdGhlIG91dGVybW9zdAorZGVsaW1pdGVycy4gRm9yIGV4YW1wbGU6CisKKyAgICBhcmdsaXN0OiA8cGVybF9jb2RlYmxvY2sgKCk+CisKK2NhdXNlcyBhbiBhcmdsaXN0IHRvIG1hdGNoIGEgcGVybCBjb2RlIGJsb2NrIHdob3NlIG91dGVybW9zdCBkZWxpbWl0ZXJzCithcmUgQzwoLi4uKT4gKHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IEM8ey4uLn0+KS4KKworCis9aXRlbSBDb25zdHJ1Y3RpbmcgdG9rZW5zCisKK0V2ZW50dWFsbHksIFBhcnNlOjpSZWNEZXNjZW50IHdpbGwgYmUgYWJsZSB0byBwYXJzZSB0b2tlbml6ZWQgaW5wdXQsIGFzCit3ZWxsIGFzIG9yZGluYXJ5IHN0cmluZ3MuIEluIHByZXBhcmF0aW9uIGZvciB0aGlzIGpveW91cyBkYXksIHRoZQorQzxFPGx0PnRva2VuOi4uLkU8Z3Q+PiBkaXJlY3RpdmUgaGFzIGJlZW4gcHJvdmlkZWQuCitUaGlzIGRpcmVjdGl2ZSBjcmVhdGVzIGEgdG9rZW4gd2hpY2ggd2lsbCBiZSBzdWl0YWJsZSBmb3IKK2lucHV0IHRvIGEgUGFyc2U6OlJlY0Rlc2NlbnQgcGFyc2VyICh3aGVuIGl0IGV2ZW50dWFsbHkgc3VwcG9ydHMKK3Rva2VuaXplZCBpbnB1dCkuCisKK1RoZSB0ZXh0IG9mIHRoZSB0b2tlbiBpcyB0aGUgdmFsdWUgb2YgdGhlCitpbW1lZGlhdGVseSBwcmVjZWRpbmcgaXRlbSBpbiB0aGUgcHJvZHVjdGlvbi4gQQorQzxFPGx0PnRva2VuOi4uLkU8Z3Q+PiBkaXJlY3RpdmUgYWx3YXlzIHN1Y2NlZWRzIHdpdGggYSByZXR1cm4KK3ZhbHVlIHdoaWNoIGlzIHRoZSBoYXNoIHJlZmVyZW5jZSB0aGF0IGlzIHRoZSBuZXcgdG9rZW4uIEl0IGFsc28KK3NldHMgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIHByb2R1Y3Rpb24gdG8gdGhhdCBoYXNoIHJlZi4KKworVGhlIEM8RTxsdD50b2tlbjouLi5FPGd0Pj4gZGlyZWN0aXZlIG1ha2VzIGl0IGVhc3kgdG8gYnVpbGQKK2EgUGFyc2U6OlJlY0Rlc2NlbnQtY29tcGF0aWJsZSBsZXhlciBpbiBQYXJzZTo6UmVjRGVzY2VudDoKKworICAgIG15ICRsZXhlciA9IG5ldyBQYXJzZTo6UmVjRGVzY2VudCBxCisgICAgeworICAgIGxleDogICAgdG9rZW4ocykKKworICAgIHRva2VuOiAgL2FcYi8gICAgICAgICAgPHRva2VuOklOREVGPgorICAgICAgICAgfCAgL3RoZVxiLyAgICAgICAgPHRva2VuOkRFRj4KKyAgICAgICAgIHwgIC9mbHlcYi8gICAgICAgIDx0b2tlbjpOT1VOLFZFUkI+CisgICAgICAgICB8ICAvW2Etel0rL2kgeyBsYyAkaXRlbVsxXSB9ICA8dG9rZW46QUxQSEE+CisgICAgICAgICB8ICA8ZXJyb3I6IFVua25vd24gdG9rZW4+CisKKyAgICB9OworCit3aGljaCB3aWxsIGV2ZW50dWFsbHkgYmUgYWJsZSB0byBiZSB1c2VkIHdpdGggYSByZWd1bGFyIFBhcnNlOjpSZWNEZXNjZW50CitncmFtbWFyOgorCisgICAgbXkgJHBhcnNlciA9IG5ldyBQYXJzZTo6UmVjRGVzY2VudCBxCisgICAgeworICAgIHN0YXJ0cnVsZTogc3VicnVsZTEgc3VicnVsZSAyCisKKyAgICAjIEVUQy4uLgorICAgIH07CisKK2VpdGhlciB3aXRoIGEgcHJlLWxleGluZyBwaGFzZToKKworICAgICRwYXJzZXItPnN0YXJ0cnVsZSggJGxleGVyLT5sZXgoJGRhdGEpICk7CisKK29yIHdpdGggYSBsZXgtb24tZGVtYW5kIGFwcHJvYWNoOgorCisgICAgJHBhcnNlci0+c3RhcnRydWxlKCBzdWJ7JGxleGVyLT50b2tlbihcJGRhdGEpfSApOworCitCdXQgYXQgcHJlc2VudCwgb25seSB0aGUgQzxFPGx0PnRva2VuOi4uLkU8Z3Q+PiBkaXJlY3RpdmUgaXMKK2FjdHVhbGx5IGltcGxlbWVudGVkLiBUaGUgcmVzdCBpcyB2YXBvdXJ3YXJlLgorCis9aXRlbSBTcGVjaWZ5aW5nIG9wZXJhdGlvbnMKKworT25lIG9mIHRoZSBjb21tb25lc3QgcmVxdWlyZW1lbnRzIHdoZW4gYnVpbGRpbmcgYSBwYXJzZXIgaXMgdG8gc3BlY2lmeQorYmluYXJ5IG9wZXJhdG9ycy4gVW5mb3J0dW5hdGVseSwgaW4gYSBub3JtYWwgZ3JhbW1hciwgdGhlIHJ1bGVzIGZvcgorc3VjaCB0aGluZ3MgYXJlIGF3a3dhcmQ6CisKKyAgICBkaXNqdW5jdGlvbjogICAgY29uanVuY3Rpb24gKCdvcicgY29uanVuY3Rpb24pKHM/KQorICAgICAgICB7ICRyZXR1cm4gPSBbICRpdGVtWzFdLCBAeyRpdGVtWzJdfSBdIH0KKworICAgIGNvbmp1bmN0aW9uOiAgICBhdG9tICgnYW5kJyBhdG9tKShzPykKKyAgICAgICAgeyAkcmV0dXJuID0gWyAkaXRlbVsxXSwgQHskaXRlbVsyXX0gXSB9CisKK29yIGluZWZmaWNpZW50OgorCisgICAgZGlzanVuY3Rpb246ICAgIGNvbmp1bmN0aW9uICdvcicgZGlzanVuY3Rpb24KKyAgICAgICAgeyAkcmV0dXJuID0gWyAkaXRlbVsxXSwgQHskaXRlbVsyXX0gXSB9CisgICAgICAgfCAgICBjb25qdW5jdGlvbgorICAgICAgICB7ICRyZXR1cm4gPSBbICRpdGVtWzFdIF0gfQorCisgICAgY29uanVuY3Rpb246ICAgIGF0b20gJ2FuZCcgY29uanVuY3Rpb24KKyAgICAgICAgeyAkcmV0dXJuID0gWyAkaXRlbVsxXSwgQHskaXRlbVsyXX0gXSB9CisgICAgICAgfCAgICBhdG9tCisgICAgICAgIHsgJHJldHVybiA9IFsgJGl0ZW1bMV0gXSB9CisKK2FuZCBlaXRoZXIgd2F5IGlzIHVnbHkgYW5kIGhhcmQgdG8gZ2V0IHJpZ2h0LgorCitUaGUgQzxFPGx0PmxlZnRvcDouLi5FPGd0Pj4gYW5kIEM8RTxsdD5yaWdodG9wOi4uLkU8Z3Q+PiBkaXJlY3RpdmVzIHByb3ZpZGUgYW4KK2Vhc2llciB3YXkgb2Ygc3BlY2lmeWluZyBzdWNoIG9wZXJhdGlvbnMuIFVzaW5nIEM8RTxsdD5sZWZ0b3A6Li4uRTxndD4+IHRoZQorYWJvdmUgZXhhbXBsZXMgYmVjb21lOgorCisgICAgZGlzanVuY3Rpb246ICAgIDxsZWZ0b3A6IGNvbmp1bmN0aW9uICdvcicgY29uanVuY3Rpb24+CisgICAgY29uanVuY3Rpb246ICAgIDxsZWZ0b3A6IGF0b20gJ2FuZCcgYXRvbT4KKworVGhlIEM8RTxsdD5sZWZ0b3A6Li4uRTxndD4+IGRpcmVjdGl2ZSBzcGVjaWZpZXMgYSBsZWZ0LWFzc29jaWF0aXZlIGJpbmFyeSBvcGVyYXRvci4KK0l0IGlzIHNwZWNpZmllZCBhcm91bmQgdGhyZWUgb3RoZXIgZ3JhbW1hciBlbGVtZW50cworKHR5cGljYWxseSBzdWJydWxlcyBvciB0ZXJtaW5hbHMpLCB3aGljaCBtYXRjaCB0aGUgbGVmdCBvcGVyYW5kLAordGhlIG9wZXJhdG9yIGl0c2VsZiwgYW5kIHRoZSByaWdodCBvcGVyYW5kIHJlc3BlY3RpdmVseS4KKworQSBDPEU8bHQ+bGVmdG9wOi4uLkU8Z3Q+PiBkaXJlY3RpdmUgc3VjaCBhczoKKworICAgIGRpc2p1bmN0aW9uOiAgICA8bGVmdG9wOiBjb25qdW5jdGlvbiAnb3InIGNvbmp1bmN0aW9uPgorCitpcyBjb252ZXJ0ZWQgdG8gdGhlIGZvbGxvd2luZzoKKworICAgIGRpc2p1bmN0aW9uOiAgICAoIGNvbmp1bmN0aW9uICgnb3InIGNvbmp1bmN0aW9uKShzPykKKyAgICAgICAgeyAkcmV0dXJuID0gWyAkaXRlbVsxXSwgQHskaXRlbVsyXX0gXSB9ICkKKworSW4gb3RoZXIgd29yZHMsIGEgQzxFPGx0PmxlZnRvcDouLi5FPGd0Pj4gZGlyZWN0aXZlIG1hdGNoZXMgdGhlIGxlZnQgb3BlcmFuZCBmb2xsb3dlZCBieSB6ZXJvCitvciBtb3JlIHJlcGV0aXRpb25zIG9mIGJvdGggdGhlIG9wZXJhdG9yIGFuZCB0aGUgcmlnaHQgb3BlcmFuZC4gSXQgdGhlbgorZmxhdHRlbnMgdGhlIG1hdGNoZWQgaXRlbXMgaW50byBhbiBhbm9ueW1vdXMgYXJyYXkgd2hpY2ggYmVjb21lcyB0aGUKKyhzaW5nbGUpIHZhbHVlIG9mIHRoZSBlbnRpcmUgQzxFPGx0PmxlZnRvcDouLi5FPGd0Pj4gZGlyZWN0aXZlLgorCitGb3IgZXhhbXBsZSwgYW4gQzxFPGx0PmxlZnRvcDouLi5FPGd0Pj4gZGlyZWN0aXZlIHN1Y2ggYXM6CisKKyAgICBvdXRwdXQ6ICA8bGVmdG9wOiBpZGVudCAnPDwnIGV4cHIgPgorCit3aGVuIGdpdmVuIGEgc3RyaW5nIHN1Y2ggYXM6CisKKyAgICBjb3V0IDw8IHZhciA8PCAic3RyIiA8PCAzCisKK3dvdWxkIG1hdGNoLCBhbmQgQzwkaXRlbVsxXT4gd291bGQgYmUgc2V0IHRvOgorCisgICAgWyAnY291dCcsICd2YXInLCAnInN0ciInLCAnMycgXQorCitJbiBvdGhlciB3b3JkczoKKworICAgIG91dHB1dDogIDxsZWZ0b3A6IGlkZW50ICc8PCcgZXhwciA+CisKK2lzIGVxdWl2YWxlbnQgdG8gYSBsZWZ0LWFzc29jaWF0aXZlIG9wZXJhdG9yOgorCisgICAgb3V0cHV0OiAgaWRlbnQgICAgICAgICAgeyAkcmV0dXJuID0gWyRpdGVtWzFdXSAgIH0KKyAgICAgICAgICB8ICBpZGVudCAnPDwnIGV4cHIgICAgICAgIHsgJHJldHVybiA9IFtAaXRlbVsxLDNdXSAgICAgfQorICAgICAgICAgIHwgIGlkZW50ICc8PCcgZXhwciAnPDwnIGV4cHIgICAgICB7ICRyZXR1cm4gPSBbQGl0ZW1bMSwzLDVdXSAgIH0KKyAgICAgICAgICB8ICBpZGVudCAnPDwnIGV4cHIgJzw8JyBleHByICc8PCcgZXhwciAgICB7ICRyZXR1cm4gPSBbQGl0ZW1bMSwzLDUsN11dIH0KKyAgICAgICAgICAjICAuLi5ldGMuLi4KKworCitTaW1pbGFybHksIHRoZSBDPEU8bHQ+cmlnaHRvcDouLi5FPGd0Pj4gZGlyZWN0aXZlIHRha2VzIGEgbGVmdCBvcGVyYW5kLCBhbiBvcGVyYXRvciwgYW5kIGEgcmlnaHQgb3BlcmFuZDoKKworICAgIGFzc2lnbjogIDxyaWdodG9wOiB2YXIgJz0nIGV4cHIgPgorCithbmQgY29udmVydHMgdGhlbSB0bzoKKworICAgIGFzc2lnbjogICggKHZhciAnPScgeyRyZXR1cm49JGl0ZW1bMV19KShzPykgZXhwcgorICAgICAgICB7ICRyZXR1cm4gPSBbIEB7JGl0ZW1bMV19LCAkaXRlbVsyXSBdIH0gKQorCit3aGljaCBpcyBlcXVpdmFsZW50IHRvIGEgcmlnaHQtYXNzb2NpYXRpdmUgb3BlcmF0b3I6CisKKyAgICBhc3NpZ246ICBleHByICAgICAgIHsgJHJldHVybiA9IFskaXRlbVsxXV0gICAgICAgfQorICAgICAgICAgIHwgIHZhciAnPScgZXhwciAgICAgICB7ICRyZXR1cm4gPSBbQGl0ZW1bMSwzXV0gICAgIH0KKyAgICAgICAgICB8ICB2YXIgJz0nIHZhciAnPScgZXhwciAgIHsgJHJldHVybiA9IFtAaXRlbVsxLDMsNV1dICAgfQorICAgICAgICAgIHwgIHZhciAnPScgdmFyICc9JyB2YXIgJz0nIGV4cHIgICB7ICRyZXR1cm4gPSBbQGl0ZW1bMSwzLDUsN11dIH0KKyAgICAgICAgICAjICAuLi5ldGMuLi4KKworCitOb3RlIHRoYXQgZm9yIGJvdGggdGhlIEM8RTxsdD5sZWZ0b3A6Li4uRTxndD4+IGFuZCBDPEU8bHQ+cmlnaHRvcDouLi5FPGd0Pj4gZGlyZWN0aXZlcywgdGhlIGRpcmVjdGl2ZSBkb2VzIG5vdCBub3JtYWxseQorcmV0dXJuIHRoZSBvcGVyYXRvciBpdHNlbGYsIGp1c3QgYSBsaXN0IG9mIHRoZSBvcGVyYW5kcyBpbnZvbHZlZC4gVGhpcyBpcworcGFydGljdWxhcmx5IGhhbmR5IGZvciBzcGVjaWZ5aW5nIGxpc3RzOgorCisgICAgbGlzdDogJygnIDxsZWZ0b3A6IGxpc3RfaXRlbSAnLCcgbGlzdF9pdGVtPiAnKScKKyAgICAgICAgeyAkcmV0dXJuID0gJGl0ZW1bMl0gfQorCitUaGVyZSBpcywgaG93ZXZlciwgYSBwcm9ibGVtOiBzb21ldGltZXMgdGhlIG9wZXJhdG9yIGlzIGl0c2VsZiBzaWduaWZpY2FudC4KK0ZvciBleGFtcGxlLCBpbiBhIFBlcmwgbGlzdCBhIGNvbW1hIGFuZCBhIEM8PUU8Z3Q+PiBhcmUgYm90aAordmFsaWQgc2VwYXJhdG9ycywgYnV0IHRoZSBDPD1FPGd0Pj4gaGFzIGFkZGl0aW9uYWwgc3RyaW5naWZpY2F0aW9uIHNlbWFudGljcy4KK0hlbmNlIGl0J3MgaW1wb3J0YW50IHRvIGtub3cgd2hpY2ggd2FzIHVzZWQgaW4gZWFjaCBjYXNlLgorCitUbyBzb2x2ZSB0aGlzIHByb2JsZW0gdGhlCitDPEU8bHQ+bGVmdG9wOi4uLkU8Z3Q+PiBhbmQgQzxFPGx0PnJpZ2h0b3A6Li4uRTxndD4+IGRpcmVjdGl2ZXMKK0k8ZG8+IHJldHVybiB0aGUgb3BlcmF0b3IocykgYXMgd2VsbCwgdW5kZXIgdHdvIGNpcmN1bXN0YW5jZXMuCitUaGUgZmlyc3QgY2FzZSBpcyB3aGVyZSB0aGUgb3BlcmF0b3IgaXMgc3BlY2lmaWVkIGFzIGEgc3VicnVsZS4gSW4gdGhhdCBpbnN0YW5jZSwKK3doYXRldmVyIHRoZSBvcGVyYXRvciBtYXRjaGVzIGlzIHJldHVybmVkIChvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGlmIHRoZSBvcGVyYXRvcgoraXMgaW1wb3J0YW50IGVub3VnaCB0byBoYXZlIGl0cyBvd24gc3VicnVsZSwgdGhlbiBpdCdzIGltcG9ydGFudCBlbm91Z2ggdG8gcmV0dXJuKS4KKworVGhlIHNlY29uZCBjYXNlIGlzIHdoZXJlIHRoZSBvcGVyYXRvciBpcyBzcGVjaWZpZWQgYXMgYSByZWd1bGFyCitleHByZXNzaW9uLiBJbiB0aGF0IGNhc2UsIGlmIHRoZSBmaXJzdCBicmFja2V0ZWQgc3VicGF0dGVybiBvZiB0aGUKK3JlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzLCB0aGF0IG1hdGNoaW5nIHZhbHVlIGlzIHJldHVybmVkICh0aGlzIGlzIGFuYWxvZ291cyB0bwordGhlIGJlaGF2aW91ciBvZiB0aGUgUGVybCBDPHNwbGl0PiBmdW5jdGlvbiwgZXhjZXB0IHRoYXQgb25seSB0aGUgZmlyc3Qgc3VicGF0dGVybgoraXMgcmV0dXJuZWQpLgorCitJbiBvdGhlciB3b3JkcywgZ2l2ZW4gdGhlIGlucHV0OgorCisgICAgKCBhPT4xLCBiPT4yICkKKwordGhlIHNwZWNpZmljYXRpb25zOgorCisgICAgbGlzdDogICAgICAnKCcgIDxsZWZ0b3A6IGxpc3RfaXRlbSBzZXBhcmF0b3IgbGlzdF9pdGVtPiAgJyknCisKKyAgICBzZXBhcmF0b3I6ICcsJyB8ICc9PicKKworb3I6CisKKyAgICBsaXN0OiAgICAgICcoJyAgPGxlZnRvcDogbGlzdF9pdGVtIC8oLHw9PikvIGxpc3RfaXRlbT4gICcpJworCitjYXVzZSB0aGUgbGlzdCBzZXBhcmF0b3JzIHRvIGJlIGludGVybGVhdmVkIHdpdGggdGhlIG9wZXJhbmRzIGluIHRoZQorYW5vbnltb3VzIGFycmF5IGluIEM8JGl0ZW1bMl0+OgorCisgICAgWyAnYScsICc9PicsICcxJywgJywnLCAnYicsICc9PicsICcyJyBdCisKKworQnV0IHRoZSBmb2xsb3dpbmcgdmVyc2lvbjoKKworICAgIGxpc3Q6ICAgICAgJygnICA8bGVmdG9wOiBsaXN0X2l0ZW0gLyx8PT4vIGxpc3RfaXRlbT4gICcpJworCityZXR1cm5zIG9ubHkgdGhlIG9wZXJhdG9yczoKKworICAgIFsgJ2EnLCAnMScsICdiJywgJzInIF0KKworT2YgY291cnNlLCBub25lIG9mIHRoZSBhYm92ZSBzcGVjaWZpY2F0aW9ucyBoYW5kbGUgdGhlIGNhc2Ugb2YgYW4gZW1wdHkKK2xpc3QsIHNpbmNlIHRoZSBDPEU8bHQ+bGVmdG9wOi4uLkU8Z3Q+PiBhbmQgQzxFPGx0PnJpZ2h0b3A6Li4uRTxndD4+IGRpcmVjdGl2ZXMKK3JlcXVpcmUgYXQgbGVhc3QgYSBzaW5nbGUgcmlnaHQgb3IgbGVmdCBvcGVyYW5kIHRvIG1hdGNoLiBUbyBzcGVjaWZ5Cit0aGF0IHRoZSBvcGVyYXRvciBjYW4gbWF0Y2ggInRyaXZpYWxseSIsCitpdCdzIG5lY2Vzc2FyeSB0byBhZGQgYSBDPChzPyk+IHF1YWxpZmllciB0byB0aGUgZGlyZWN0aXZlOgorCisgICAgbGlzdDogICAgICAnKCcgIDxsZWZ0b3A6IGxpc3RfaXRlbSAvKCx8PT4pLyBsaXN0X2l0ZW0+KHM/KSAgJyknCisKK05vdGUgdGhhdCBpbiBhbG1vc3QgYWxsIHRoZSBhYm92ZSBleGFtcGxlcywgdGhlIGZpcnN0IGFuZCB0aGlyZCBhcmd1bWVudHMKK29mIHRoZSBDPDxsZWZ0b3A6Li4uRTxndD4+IGRpcmVjdGl2ZSB3ZXJlIHRoZSBzYW1lIHN1YnJ1bGUuIFRoYXQgaXMgYmVjYXVzZQorQzw8bGVmdG9wOi4uLkU8Z3Q+PidzIGFyZSBmcmVxdWVudGx5IHVzZWQgdG8gc3BlY2lmeSAic2VwYXJhdGVkIiBsaXN0cyBvZiB0aGUKK3NhbWUgdHlwZSBvZiBpdGVtLiBUbyBtYWtlIHN1Y2ggbGlzdHMgZWFzaWVyIHRvIHNwZWNpZnksIHRoZSBmb2xsb3dpbmcKK3N5bnRheDoKKworICAgIGxpc3Q6ICAgZWxlbWVudChzIC8sLykKKworaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvOgorCisgICAgbGlzdDogICA8bGVmdG9wOiBlbGVtZW50IC8sLyBlbGVtZW50PgorCitOb3RlIHRoYXQgdGhlIHNlcGFyYXRvciBtdXN0IGJlIHNwZWNpZmllZCBhcyBhIHJhdyBwYXR0ZXJuIChpLmUuCitub3QgYSBzdHJpbmcgb3Igc3VicnVsZSkuCisKKworPWl0ZW0gU2NvcmVkIHByb2R1Y3Rpb25zCisKK0J5IGRlZmF1bHQsIFBhcnNlOjpSZWNEZXNjZW50IGdyYW1tYXIgcnVsZXMgYWx3YXlzIGFjY2VwdCB0aGUgZmlyc3QKK3Byb2R1Y3Rpb24gdGhhdCBtYXRjaGVzIHRoZSBpbnB1dC4gQnV0IGlmIHR3byBvciBtb3JlIHByb2R1Y3Rpb25zIG1heQorcG90ZW50aWFsbHkgbWF0Y2ggdGhlIHNhbWUgaW5wdXQsIGNob29zaW5nIHRoZSBmaXJzdCB0aGF0IGRvZXMgc28gbWF5Citub3QgYmUgb3B0aW1hbC4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSB3ZXJlIHBhcnNpbmcgdGhlIHNlbnRlbmNlICJ0aW1lIGZsaWVzIGxpa2UgYW4gYXJyb3ciLAoreW91IG1pZ2h0IHVzZSBhIHJ1bGUgbGlrZSB0aGlzOgorCisgICAgc2VudGVuY2U6IHZlcmIgbm91biBwcmVwb3NpdGlvbiBhcnRpY2xlIG5vdW4geyBbQGl0ZW1dIH0KKyAgICB8IGFkamVjdGl2ZSBub3VuIHZlcmIgYXJ0aWNsZSBub3VuICAgeyBbQGl0ZW1dIH0KKyAgICB8IG5vdW4gdmVyYiBwcmVwb3NpdGlvbiBhcnRpY2xlIG5vdW4geyBbQGl0ZW1dIH0KKworRWFjaCBvZiB0aGVzZSBwcm9kdWN0aW9ucyBtYXRjaGVzIHRoZSBzZW50ZW5jZSwgYnV0IHRoZSB0aGlyZCBvbmUKK2lzIHRoZSBtb3N0IGxpa2VseSBpbnRlcnByZXRhdGlvbi4gSG93ZXZlciwgaWYgdGhlIHNlbnRlbmNlIGhhZCBiZWVuCisiZnJ1aXQgZmxpZXMgbGlrZSBhIGJhbmFuYSIsIHRoZW4gdGhlIHNlY29uZCBwcm9kdWN0aW9uIGlzIHByb2JhYmx5Cit0aGUgcmlnaHQgbWF0Y2guCisKK1RvIGNhdGVyIGZvciBzdWNoIHNpdHV0YXRpb25zLCB0aGUgQzxFPGx0PnNjb3JlOi4uLkU8Z3Q+PiBjYW4gYmUgdXNlZC4KK1RoZSBkaXJlY3RpdmUgaXMgZXF1aXZhbGVudCB0byBhbiB1bmNvbmRpdGlvbmFsIEM8RTxsdD5yZWplY3RFPGd0Pj4sCitleGNlcHQgdGhhdCBpdCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYSAic2NvcmUiIGZvciB0aGUgY3VycmVudAorcHJvZHVjdGlvbi4gSWYgdGhhdCBzY29yZSBpcyBudW1lcmljYWxseSBncmVhdGVyIHRoYW4gdGhlIGJlc3QKK3Njb3JlIG9mIGFueSBwcmVjZWRpbmcgcHJvZHVjdGlvbiwgdGhlIGN1cnJlbnQgcHJvZHVjdGlvbiBpcyBjYWNoZWQgZm9yIGxhdGVyCitjb25zaWRlcmF0aW9uLiBJZiBubyBsYXRlciBwcm9kdWN0aW9uIG1hdGNoZXMsIHRoZW4gdGhlIGNhY2hlZAorcHJvZHVjdGlvbiBpcyB0cmVhdGVkIGFzIGhhdmluZyBtYXRjaGVkLCBhbmQgdGhlIHZhbHVlIG9mIHRoZQoraXRlbSBpbW1lZGlhdGVseSBiZWZvcmUgaXRzIEM8RTxsdD5zY29yZTouLi5FPGd0Pj4gZGlyZWN0aXZlIGlzIHJldHVybmVkIGFzIHRoZQorcmVzdWx0LgorCitJbiBvdGhlciB3b3JkcywgYnkgcHV0dGluZyBhIEM8RTxsdD5zY29yZTouLi5FPGd0Pj4gZGlyZWN0aXZlIGF0IHRoZSBlbmQgb2YKK2VhY2ggcHJvZHVjdGlvbiwgeW91IGNhbiBzZWxlY3Qgd2hpY2ggcHJvZHVjdGlvbiBtYXRjaGVzIHVzaW5nCitjcml0ZXJpYSBvdGhlciB0aGFuIHNwZWNpZmljYXRpb24gb3JkZXIuIEZvciBleGFtcGxlOgorCisgICAgc2VudGVuY2U6IHZlcmIgbm91biBwcmVwb3NpdGlvbiBhcnRpY2xlIG5vdW4geyBbQGl0ZW1dIH0gPHNjb3JlOiBzZW5zaWJsZShAaXRlbSk+CisgICAgfCBhZGplY3RpdmUgbm91biB2ZXJiIGFydGljbGUgbm91biAgIHsgW0BpdGVtXSB9IDxzY29yZTogc2Vuc2libGUoQGl0ZW0pPgorICAgIHwgbm91biB2ZXJiIHByZXBvc2l0aW9uIGFydGljbGUgbm91biB7IFtAaXRlbV0gfSA8c2NvcmU6IHNlbnNpYmxlKEBpdGVtKT4KKworTm93LCB3aGVuIGVhY2ggcHJvZHVjdGlvbiByZWFjaGVzIGl0cyByZXNwZWN0aXZlIEM8RTxsdD5zY29yZTouLi5FPGd0Pj4KK2RpcmVjdGl2ZSwgdGhlIHN1YnJvdXRpbmUgQzxzZW5zaWJsZT4gd2lsbCBiZSBjYWxsZWQgdG8gZXZhbHVhdGUgdGhlCittYXRjaGVkIGl0ZW1zIChzb21laG93KS4gT25jZSBhbGwgcHJvZHVjdGlvbnMgaGF2ZSBiZWVuIHRyaWVkLCB0aGUKK29uZSB3aGljaCBDPHNlbnNpYmxlPiBzY29yZWQgbW9zdCBoaWdobHkgd2lsbCBiZSB0aGUgb25lIHRoYXQgaXMKK2FjY2VwdGVkIGFzIGEgbWF0Y2ggZm9yIHRoZSBydWxlLgorCitUaGUgdmFyaWFibGUgJHNjb3JlIGFsd2F5cyBob2xkcyB0aGUgY3VycmVudCBiZXN0IHNjb3JlIG9mIGFueSBwcm9kdWN0aW9uLAorYW5kIHRoZSB2YXJpYWJsZSAkc2NvcmVfcmV0dXJuIGhvbGRzIHRoZSBjb3JyZXNwb25kaW5nIHJldHVybiB2YWx1ZS4KKworQXMgYW5vdGhlciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGdyYW1tYXIgbWF0Y2hlcyBsaW5lcyB0aGF0IG1heSBiZQorc2VwYXJhdGVkIGJ5IGNvbW1hcywgY29sb25zLCBvciBzZW1pLWNvbG9ucy4gVGhpcyBjYW4gYmUgdHJpY2t5IGlmCithIGNvbG9uLXNlcGFyYXRlZCBsaW5lIGFsc28gY29udGFpbnMgY29tbWFzLCBvciB2aWNlIHZlcnNhLiBUaGUgZ3JhbW1hcgorcmVzb2x2ZXMgdGhlIGFtYmlndWl0eSBieSBzZWxlY3RpbmcgdGhlIHJ1bGUgdGhhdCByZXN1bHRzIGluIHRoZQorZmV3ZXN0IGZpZWxkczoKKworICAgIGxpbmU6IHNlcGxpc3Rbc2VwPT4nLCddICA8c2NvcmU6IC1AeyRpdGVtWzFdfT4KKyAgICB8IHNlcGxpc3Rbc2VwPT4nOiddICA8c2NvcmU6IC1AeyRpdGVtWzFdfT4KKyAgICB8IHNlcGxpc3Rbc2VwPT4iICJdICA8c2NvcmU6IC1AeyRpdGVtWzFdfT4KKworICAgIHNlcGxpc3Q6IDxza2lwOiIiPiA8bGVmdG9wOiAvW14kYXJne3NlcH1dKi8gIiRhcmd7c2VwfSIgL1teJGFyZ3tzZXB9XSovPgorCitOb3RlIHRoZSB1c2Ugb2YgbmVnYXRpb24gd2l0aGluIHRoZSBDPEU8bHQ+c2NvcmU6Li4uRTxndD4+IGRpcmVjdGl2ZQordG8gZW5zdXJlIHRoYXQgdGhlIHNlcGxpc3Qgd2l0aCB0aGUgbW9zdCBpdGVtcyBnZXRzIHRoZSBsb3dlc3Qgc2NvcmUuCisKK0FzIHRoZSBhYm92ZSBleGFtcGxlcyBpbmRpY2F0ZSwgaXQgaXMgb2Z0ZW4gdGhlIGNhc2UgdGhhdCBhbGwgcHJvZHVjdGlvbnMKK2luIGEgcnVsZSB1c2UgZXhhY3RseSB0aGUgc2FtZSBDPEU8bHQ+c2NvcmU6Li4uRTxndD4+IGRpcmVjdGl2ZS4gSXQgaXMKK3RlZGlvdXMgdG8gaGF2ZSB0byByZXBlYXQgdGhpcyBpZGVudGljYWwgZGlyZWN0aXZlIGluIGV2ZXJ5IHByb2R1Y3Rpb24sIHNvCitQYXJzZTo6UmVjRGVzY2VudCBhbHNvIHByb3ZpZGVzIHRoZSBDPEU8bHQ+YXV0b3Njb3JlOi4uLkU8Z3Q+PiBkaXJlY3RpdmUuCisKK0lmIGFuIEM8RTxsdD5hdXRvc2NvcmU6Li4uRTxndD4+IGRpcmVjdGl2ZSBhcHBlYXJzIGluIGFueQorcHJvZHVjdGlvbiBvZiBhIHJ1bGUsIHRoZSBjb2RlIGl0IHNwZWNpZmllcyBpcyB1c2VkIGFzIHRoZSBzY29yaW5nCitjb2RlIGZvciBldmVyeSBwcm9kdWN0aW9uIG9mIHRoYXQgcnVsZSwgZXhjZXB0IHByb2R1Y3Rpb25zIHRoYXQgYWxyZWFkeQorZW5kIHdpdGggYW4gZXhwbGljaXQgQzxFPGx0PnNjb3JlOi4uLkU8Z3Q+PiBkaXJlY3RpdmUuIFRodXMgdGhlIHJ1bGVzIGFib3ZlIGNvdWxkCitiZSByZXdyaXR0ZW46CisKKyAgICBsaW5lOiA8YXV0b3Njb3JlOiAtQHskaXRlbVsxXX0+CisgICAgbGluZTogc2VwbGlzdFtzZXA9PicsJ10KKyAgICB8IHNlcGxpc3Rbc2VwPT4nOiddCisgICAgfCBzZXBsaXN0W3NlcD0+IiAiXQorCisKKyAgICBzZW50ZW5jZTogPGF1dG9zY29yZTogc2Vuc2libGUoQGl0ZW0pPgorICAgIHwgdmVyYiBub3VuIHByZXBvc2l0aW9uIGFydGljbGUgbm91biB7IFtAaXRlbV0gfQorICAgIHwgYWRqZWN0aXZlIG5vdW4gdmVyYiBhcnRpY2xlIG5vdW4gICB7IFtAaXRlbV0gfQorICAgIHwgbm91biB2ZXJiIHByZXBvc2l0aW9uIGFydGljbGUgbm91biB7IFtAaXRlbV0gfQorCitOb3RlIHRoYXQgdGhlIEM8RTxsdD5hdXRvc2NvcmU6Li4uRTxndD4+IGRpcmVjdGl2ZSBpdHNlbGYgYWN0cyBhcyBhbgordW5jb25kaXRpb25hbCBDPEU8bHQ+cmVqZWN0RTxndD4+LCBhbmQgKGxpa2UgdGhlIEM8RTxsdD5ydWxldmFyOi4uLkU8Z3Q+PgorZGlyZWN0aXZlKSBpcyBwcnVuZWQgYXQgY29tcGlsZS10aW1lIHdoZXJldmVyIHBvc3NpYmxlLgorCisKKz1pdGVtIERpc3BlbnNpbmcgd2l0aCBncmFtbWFyIGNoZWNrcworCitEdXJpbmcgdGhlIGNvbXBpbGF0aW9uIHBoYXNlIG9mIHBhcnNlciBjb25zdHJ1Y3Rpb24sIFBhcnNlOjpSZWNEZXNjZW50IHBlcmZvcm1zCithIHNtYWxsIG51bWJlciBvZiBjaGVja3Mgb24gdGhlIGdyYW1tYXIgaXQncyBnaXZlbi4gU3BlY2lmaWNhbGx5IGl0IGNoZWNrcyB0aGF0Cit0aGUgZ3JhbW1hciBpcyBub3QgbGVmdC1yZWN1cnNpdmUsIHRoYXQgdGhlcmUgYXJlIG5vICJpbnNhdGlhYmxlIiBjb25zdHJ1Y3RzIG9mCit0aGUgZm9ybToKKworICAgIHJ1bGU6IHN1YnJ1bGUocykgc3VicnVsZQorCithbmQgdGhhdCB0aGVyZSBhcmUgbm8gcnVsZXMgbWlzc2luZyAoaS5lLiByZWZlcnJlZCB0bywgYnV0IG5ldmVyIGRlZmluZWQpLgorCitUaGVzZSBjaGVja3MgYXJlIGltcG9ydGFudCBkdXJpbmcgZGV2ZWxvcG1lbnQsIGJ1dCBjYW4gc2xvdyBkb3duIHBhcnNlcgorY29uc3RydWN0aW9uIGluIHN0YWJsZSBjb2RlLiBTbyBQYXJzZTo6UmVjRGVzY2VudCBwcm92aWRlcyB0aGUKK0U8bHQ+bm9jaGVja0U8Z3Q+IGRpcmVjdGl2ZSB0byB0dXJuIHRoZW0gb2ZmLiBUaGUgZGlyZWN0aXZlIGNhbiBvbmx5IGFwcGVhcgorYmVmb3JlIHRoZSBmaXJzdCBydWxlIGRlZmluaXRpb24sIGFuZCBzd2l0Y2hlcyBvZmYgY2hlY2tpbmcgdGhyb3VnaG91dCB0aGUgcmVzdAorb2YgdGhlIGN1cnJlbnQgZ3JhbW1hci4KKworVHlwaWNhbGx5LCB0aGlzIGRpcmVjdGl2ZSB3b3VsZCBiZSBhZGRlZCB3aGVuIGEgcGFyc2VyIGhhcyBiZWVuIHRob3JvdWdobHkKK3Rlc3RlZCBhbmQgaXMgcmVhZHkgZm9yIHJlbGVhc2UuCisKKz1iYWNrCisKKworPWhlYWQyIFN1YnJ1bGUgYXJndW1lbnQgbGlzdHMKKworSXQgaXMgb2NjYXNpb25hbGx5IHVzZWZ1bCB0byBwYXNzIGRhdGEgdG8gYSBzdWJydWxlIHdoaWNoIGlzIGJlaW5nIGludm9rZWQuIEZvcgorZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBncmFtbWFyIGZyYWdtZW50OgorCisgICAgY2xhc3NkZWNsOiBrZXl3b3JkIGRlY2wKKworICAgIGtleXdvcmQ6ICAgJ3N0cnVjdCcgfCAnY2xhc3MnOworCisgICAgZGVjbDogICAgICAjIFdIQVRFVkVSCisKK1RoZSBDPGRlY2w+IHJ1bGUgbWlnaHQgd2lzaCB0byBrbm93IHdoaWNoIG9mIHRoZSB0d28ga2V5d29yZHMgd2FzIHVzZWQKKyhzaW5jZSBpdCBtYXkgYWZmZWN0IHNvbWUgYXNwZWN0IG9mIHRoZSB3YXkgdGhlIHN1YnNlcXVlbnQgZGVjbGFyYXRpb24KK2lzIGludGVycHJldGVkKS4gQzxQYXJzZTo6UmVjRGVzY2VudD4gYWxsb3dzIHRoZSBncmFtbWFyIGRlc2lnbmVyIHRvCitwYXNzIGRhdGEgaW50byBhIHJ1bGUsIGJ5IHBsYWNpbmcgdGhhdCBkYXRhIGluIGFuIEk8YXJndW1lbnQgbGlzdD4KKyh0aGF0IGlzLCBpbiBzcXVhcmUgYnJhY2tldHMpIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBzdWJydWxlIGl0ZW0gaW4gYQorcHJvZHVjdGlvbi4gSGVuY2UsIHdlIGNvdWxkIHBhc3MgdGhlIGtleXdvcmQgdG8gQzxkZWNsPiBhcyBmb2xsb3dzOgorCisgICAgY2xhc3NkZWNsOiBrZXl3b3JkIGRlY2xbICRpdGVtWzFdIF0KKworICAgIGtleXdvcmQ6ICAgJ3N0cnVjdCcgfCAnY2xhc3MnOworCisgICAgZGVjbDogICAgICAjIFdIQVRFVkVSCisKK1RoZSBhcmd1bWVudCBsaXN0IGNhbiBjb25zaXN0IG9mIGFueSBudW1iZXIgKGluY2x1ZGluZyB6ZXJvISkgb2YgY29tbWEtc2VwYXJhdGVkCitQZXJsIGV4cHJlc3Npb25zLiBJbiBvdGhlciB3b3JkcywgaXQgbG9va3MgZXhhY3RseSBsaWtlIGEgUGVybCBhbm9ueW1vdXMKK2FycmF5IHJlZmVyZW5jZS4gRm9yIGV4YW1wbGUsIHdlIGNvdWxkIHBhc3MgdGhlIGtleXdvcmQsIHRoZSBuYW1lIG9mIHRoZQorc3Vycm91bmRpbmcgcnVsZSwgYW5kIHRoZSBsaXRlcmFsICdrZXl3b3JkJyB0byBDPGRlY2w+IGxpa2Ugc286CisKKyAgICBjbGFzc2RlY2w6IGtleXdvcmQgZGVjbFskaXRlbVsxXSwkaXRlbVswXSwna2V5d29yZCddCisKKyAgICBrZXl3b3JkOiAgICdzdHJ1Y3QnIHwgJ2NsYXNzJzsKKworICAgIGRlY2w6ICAgICAgIyBXSEFURVZFUgorCitXaXRoaW4gdGhlIHJ1bGUgdG8gd2hpY2ggdGhlIGRhdGEgaXMgcGFzc2VkIChDPGRlY2w+IGluIHRoZSBhYm92ZSBleGFtcGxlcykKK3RoYXQgZGF0YSBpcyBhdmFpbGFibGUgYXMgdGhlIGVsZW1lbnRzIG9mIGEgbG9jYWwgdmFyaWFibGUgQzxAYXJnPi4gSGVuY2UKK0M8ZGVjbD4gbWlnaHQgcmVwb3J0IGl0cyBpbnRlbnRpb25zIGFzIGZvbGxvd3M6CisKKyAgICBjbGFzc2RlY2w6IGtleXdvcmQgZGVjbFskaXRlbVsxXSwkaXRlbVswXSwna2V5d29yZCddCisKKyAgICBrZXl3b3JkOiAgICdzdHJ1Y3QnIHwgJ2NsYXNzJzsKKworICAgIGRlY2w6ICAgICAgeyBwcmludCAiRGVjbGFyaW5nICRhcmdbMF0gKGEgJGFyZ1syXSlcbiI7CisgICAgICAgICBwcmludCAiKHRoaXMgcnVsZSBjYWxsZWQgYnkgJGFyZ1sxXSkiIH0KKworU3VicnVsZSBhcmd1bWVudCBsaXN0cyBjYW4gYWxzbyBiZSBpbnRlcnByZXRlZCBhcyBoYXNoZXMsIHNpbXBseSBieSB1c2luZwordGhlIGxvY2FsIHZhcmlhYmxlIEM8JWFyZz4gaW5zdGVhZCBvZiBDPEBhcmc+LiBIZW5jZSB3ZSBjb3VsZCByZXdyaXRlIHRoZQorcHJldmlvdXMgZXhhbXBsZToKKworICAgIGNsYXNzZGVjbDoga2V5d29yZCBkZWNsW2tleXdvcmQgPT4gJGl0ZW1bMV0sCisgICAgICAgIGNhbGxlciAgPT4gJGl0ZW1bMF0sCisgICAgICAgIHR5cGUgICAgPT4gJ2tleXdvcmQnXQorCisgICAga2V5d29yZDogICAnc3RydWN0JyB8ICdjbGFzcyc7CisKKyAgICBkZWNsOiAgICAgIHsgcHJpbnQgIkRlY2xhcmluZyAkYXJne2tleXdvcmR9IChhICRhcmd7dHlwZX0pXG4iOworICAgICAgICAgcHJpbnQgIih0aGlzIHJ1bGUgY2FsbGVkIGJ5ICRhcmd7Y2FsbGVyfSkiIH0KKworQm90aCBDPEBhcmc+IGFuZCBDPCVhcmc+IGFyZSBhbHdheXMgYXZhaWxhYmxlLCBzbyB0aGUgZ3JhbW1hciBkZXNpZ25lciBtYXkKK2Nob29zZSB3aGljaGV2ZXIgY29udmVudGlvbiAob3IgY29tYmluYXRpb24gb2YgY29udmVudGlvbnMpIHN1aXRzIGJlc3QuCisKK1N1YnJ1bGUgYXJndW1lbnQgbGlzdHMgYXJlIGFsc28gdXNlZnVsIGZvciBjcmVhdGluZyAicnVsZSB0ZW1wbGF0ZXMiCisoZXNwZWNpYWxseSB3aGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQzxFPGx0Pm1hdGNocnVsZTouLi5FPGd0Pj4KK2RpcmVjdGl2ZSkuIEZvciBleGFtcGxlLCB0aGUgc3VicnVsZToKKworICAgIGxpc3Q6ICAgICA8bWF0Y2hydWxlOiRhcmd7cnVsZX0+IC8kYXJne3NlcH0vIGxpc3RbJWFyZ10KKyAgICAgICAgeyAkcmV0dXJuID0gWyAkaXRlbVsxXSwgQHskaXRlbVszXX0gXSB9CisgICAgfCAgICAgPG1hdGNocnVsZTokYXJne3J1bGV9PgorICAgICAgICB7ICRyZXR1cm4gPSBbICRpdGVtWzFdXSB9CisKK2lzIGEgaGFuZHkgdGVtcGxhdGUgZm9yIHRoZSBjb21tb24gcHJvYmxlbSBvZiBtYXRjaGluZyBhIHNlcGFyYXRlZCBsaXN0LgorRm9yIGV4YW1wbGU6CisKKyAgICBmdW5jdGlvbjogJ2Z1bmMnIG5hbWUgJygnIGxpc3RbcnVsZT0+J3BhcmFtJyxzZXA9Pic7J10gJyknCisKKyAgICBwYXJhbTogICAgbGlzdFtydWxlPT4nbmFtZScsc2VwPT4nLCddICc6JyB0eXBlbmFtZQorCisgICAgbmFtZTogICAgIC9cdysvCisKKyAgICB0eXBlbmFtZTogbmFtZQorCisKK1doZW4gYSBzdWJydWxlIGFyZ3VtZW50IGxpc3QgaXMgdXNlZCB3aXRoIGEgcmVwZWF0ZWQgc3VicnVsZSwgdGhlIGFyZ3VtZW50IGxpc3QKK2dvZXMgSTxiZWZvcmU+IHRoZSByZXBldGl0aW9uIHNwZWNpZmllcjoKKworICAgIGxpc3Q6ICAgL3NvbWV8bWFueS8gdGhpbmdbICRpdGVtWzFdIF0ocykKKworVGhlIGFyZ3VtZW50IGxpc3QgaXMgImxhdGUgYm91bmQiLiBUaGF0IGlzLCBpdCBpcyByZS1ldmFsdWF0ZWQgZm9yIGV2ZXJ5CityZXBldGl0aW9uIG9mIHRoZSByZXBlYXRlZCBzdWJydWxlLgorVGhpcyBtZWFucyB0aGF0IGVhY2ggcmVwZWF0ZWQgYXR0ZW1wdCB0byBtYXRjaCB0aGUgc3VicnVsZSBtYXkgYmUKK3Bhc3NlZCBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNldCBvZiBhcmd1bWVudHMgaWYgdGhlIHZhbHVlIG9mIHRoZQorZXhwcmVzc2lvbiBpbiB0aGUgYXJndW1lbnQgbGlzdCBjaGFuZ2VzIGJldHdlZW4gYXR0ZW1wdHMuIFNvLCBmb3IKK2V4YW1wbGUsIHRoZSBncmFtbWFyOgorCisgICAgeyAkOjpzcGVjaWVzID0gJ2RvZ3MnIH0KKworICAgIHBhaXI6ICAgJ3R3bycgYW5pbWFsWyQ6OnNwZWNpZXNdKHMpCisKKyAgICBhbmltYWw6IC8kYXJnWzBdLyB7ICQ6OnNwZWNpZXMgPSAnY2F0cycgfQorCit3aWxsIG1hdGNoIHRoZSBzdHJpbmcgInR3byBkb2dzIGNhdHMgY2F0cyIgY29tcGxldGVseSwgd2hlcmVhcworaXQgd2lsbCBvbmx5IG1hdGNoIHRoZSBzdHJpbmcgInR3byBkb2dzIGRvZ3MgZG9ncyIgdXAgdG8gdGhlCitlaWdodGggbGV0dGVyLiBJZiB0aGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50IGxpc3Qgd2VyZSAiZWFybHkgYm91bmQiCisodGhhdCBpcywgZXZhbHVhdGVkIG9ubHkgdGhlIGZpcnN0IHRpbWUgYSByZXBlYXRlZCBzdWJydWxlIG1hdGNoIGlzCithdHRlbXB0ZWQpLCBvbmUgd291bGQgZXhwZWN0IHRoZSBtYXRjaGluZyBiZWhhdmlvdXJzIHRvIGJlIHJldmVyc2VkLgorCitPZiBjb3Vyc2UsIGl0IGlzIHBvc3NpYmxlIHRvIGVmZmVjdGl2ZWx5ICJlYXJseSBiaW5kIiBzdWNoIGFyZ3VtZW50IGxpc3RzCitieSBwYXNzaW5nIHRoZW0gYSB2YWx1ZSB3aGljaCBkb2VzIG5vdCBjaGFuZ2Ugb24gZWFjaCByZXBldGl0aW9uLiBGb3IgZXhhbXBsZToKKworICAgIHsgJDo6c3BlY2llcyA9ICdkb2dzJyB9CisKKyAgICBwYWlyOiAgICd0d28nIHsgJDo6c3BlY2llcyB9IGFuaW1hbFskaXRlbVsyXV0ocykKKworICAgIGFuaW1hbDogLyRhcmdbMF0vIHsgJDo6c3BlY2llcyA9ICdjYXRzJyB9CisKKworQXJndW1lbnRzIGNhbiBhbHNvIGJlIHBhc3NlZCB0byB0aGUgc3RhcnQgcnVsZSwgc2ltcGx5IGJ5IGFwcGVuZGluZyB0aGVtCit0byB0aGUgYXJndW1lbnQgbGlzdCB3aXRoIHdoaWNoIHRoZSBzdGFydCBydWxlIGlzIGNhbGxlZCAoSTxhZnRlcj4gdGhlCisibGluZSBudW1iZXIiIHBhcmFtZXRlcikuIEZvciBleGFtcGxlLCBnaXZlbjoKKworICAgICRwYXJzZXIgPSBuZXcgUGFyc2U6OlJlY0Rlc2NlbnQgKCAkZ3JhbW1hciApOworCisgICAgJHBhcnNlci0+ZGF0YSgkdGV4dCwgMSwgInN0ciIsIDIsIFxAYXJyKTsKKworICAgICMgICAgICAgICBeXl5eXiAgXiAgXl5eXl5eXl5eXl5eXl5eCisgICAgIyAgICAgICB8ICAgIHwgICAgIHwKKyAgICAjIFRFWFQgVE8gQkUgUEFSU0VEICB8ICAgICB8CisgICAgIyBTVEFSVElORyBMSU5FIE5VTUJFUiAgICAgfAorICAgICMgRUxFTUVOVFMgT0YgQGFyZyBXSElDSCBJUyBQQVNTRUQgVE8gUlVMRSBkYXRhCisKK3RoZW4gd2l0aGluIHRoZSBwcm9kdWN0aW9ucyBvZiB0aGUgcnVsZSBDPGRhdGE+LCB0aGUgYXJyYXkgQzxAYXJnPiB3aWxsIGNvbnRhaW4KK0M8KCJzdHIiLCAyLCBcQGFycik+LgorCisKKz1oZWFkMiBBbHRlcm5hdGlvbnMKKworQWx0ZXJuYXRpb25zIGFyZSBpbXBsaWNpdCAodW5uYW1lZCkgcnVsZXMgZGVmaW5lZCBhcyBwYXJ0IG9mIGEgcHJvZHVjdGlvbi4gQW4KK2FsdGVybmF0aW9uIGlzIGRlZmluZWQgYXMgYSBzZXJpZXMgb2YgJ3wnLXNlcGFyYXRlZCBwcm9kdWN0aW9ucyBpbnNpZGUgYQorcGFpciBvZiByb3VuZCBicmFja2V0cy4gRm9yIGV4YW1wbGU6CisKKyAgICBjaGFyYWN0ZXI6ICd0aGUnICggZ29vZCB8IGJhZCB8IHVnbHkgKSAvZHVkZS8KKworRXZlcnkgYWx0ZXJuYXRpb24gaW1wbGljaXRseSBkZWZpbmVzIGEgbmV3IHN1YnJ1bGUsIHdob3NlCithdXRvbWF0aWNhbGx5LWdlbmVyYXRlZCBuYW1lIGluZGljYXRlcyBpdHMgb3JpZ2luOgorIl9hbHRlcm5hdGlvbl88ST5fb2ZfcHJvZHVjdGlvbl88UD5fb2ZfcnVsZTxSPiIgZm9yIHRoZSBhcHByb3ByaWF0ZQordmFsdWVzIG9mIDxJPiwgPFA+LCBhbmQgPFI+LiBBIGNhbGwgdG8gdGhpcyBpbXBsaWNpdCBzdWJydWxlIGlzIHRoZW4KK2luc2VydGVkIGluIHBsYWNlIG9mIHRoZSBicmFja2V0cy4gSGVuY2UgdGhlIGFib3ZlIGV4YW1wbGUgaXMgbWVyZWx5IGEKK2NvbnZlbmllbnQgc2hvcnQtaGFuZCBmb3I6CisKKyAgICBjaGFyYWN0ZXI6ICd0aGUnCisgICAgICAgX2FsdGVybmF0aW9uXzFfb2ZfcHJvZHVjdGlvbl8xX29mX3J1bGVfY2hhcmFjdGVyCisgICAgICAgL2R1ZGUvCisKKyAgICBfYWx0ZXJuYXRpb25fMV9vZl9wcm9kdWN0aW9uXzFfb2ZfcnVsZV9jaGFyYWN0ZXI6CisgICAgICAgZ29vZCB8IGJhZCB8IHVnbHkKKworU2luY2UgYWx0ZXJuYXRpb25zIGFyZSBwYXJzZWQgYnkgcmVjdXJzaXZlbHkgY2FsbGluZyB0aGUgcGFyc2VyIGdlbmVyYXRvciwKK2FueSB0eXBlKHMpIG9mIGl0ZW0gY2FuIGFwcGVhciBpbiBhbiBhbHRlcm5hdGlvbi4gRm9yIGV4YW1wbGU6CisKKyAgICBjaGFyYWN0ZXI6ICd0aGUnICggJ2hpZ2gnICJwbGFpbnMiICAjIFNpbGVudCwgd2l0aCBwb25jaG8KKyAgICAgICAgIHwgL25vWy0gXW5hbWUvICMgU2lsZW50LCBubyBwb25jaG8KKyAgICAgICAgIHwgdmVuZ2VhbmNlX3NlZWtpbmcgICAgIyBQb25jaG8tb3B0aW9uYWwKKyAgICAgICAgIHwgPGVycm9yPgorICAgICAgICAgKSBkcmlmdGVyCisKK0luIHRoaXMgY2FzZSwgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorbWVzc2FnZSB3b3VsZCBiZToKKworICAgIEVSUk9SIChsaW5lIDxOPik6IEludmFsaWQgaW1wbGljaXQgc3VicnVsZTogRXhwZWN0ZWQKKyAgICAgICAgICAnaGlnaCcgb3IgL25vWy0gXW5hbWUvIG9yIGdlbmVyaWMsCisgICAgICAgICAgYnV0IGZvdW5kICJwYWNpZmlzdCIgaW5zdGVhZAorCitTaW5jZSBldmVyeSBhbHRlcm5hdGlvbiBhY3R1YWxseSBoYXMgYSBuYW1lLCBpdCdzIGV2ZW4gcG9zc2libGUKK3RvIGV4dGVuZCBvciByZXBsYWNlIHRoZW06CisKKyAgICBwYXJzZXItPlJlcGxhY2UoCisgICAgIl9hbHRlcm5hdGlvbl8xX29mX3Byb2R1Y3Rpb25fMV9vZl9ydWxlX2NoYXJhY3RlcjoKKyAgICAgICAgJ2dlbmVyaWMgRWFzdHdvb2QnIgorICAgICAgICApOworCitNb3JlIGltcG9ydGFudGx5LCBzaW5jZSBhbHRlcm5hdGlvbnMgYXJlIGEgZm9ybSBvZiBzdWJydWxlLCB0aGV5IGNhbiBiZSBnaXZlbgorcmVwZXRpdGlvbiBzcGVjaWZpZXJzOgorCisgICAgY2hhcmFjdGVyOiAndGhlJyAoIGdvb2QgfCBiYWQgfCB1Z2x5ICkoPykgL2R1ZGUvCisKKworPWhlYWQyIEluY3JlbWVudGFsIFBhcnNpbmcKKworQzxQYXJzZTo6UmVjRGVzY2VudD4gcHJvdmlkZXMgdHdvIG1ldGhvZHMgLSBDPEV4dGVuZD4gYW5kIEM8UmVwbGFjZT4gLSB3aGljaAorY2FuIGJlIHVzZWQgdG8gYWx0ZXIgdGhlIGdyYW1tYXIgbWF0Y2hlZCBieSBhIHBhcnNlci4gQm90aCBtZXRob2RzCit0YWtlIHRoZSBzYW1lIGFyZ3VtZW50IGFzIEM8UGFyc2U6OlJlY0Rlc2NlbnQ6Om5ldz4sIG5hbWVseSBhCitncmFtbWFyIHNwZWNpZmljYXRpb24gc3RyaW5nCisKK0M8UGFyc2U6OlJlY0Rlc2NlbnQ6OkV4dGVuZD4gaW50ZXJwcmV0cyB0aGUgZ3JhbW1hciBzcGVjaWZpY2F0aW9uIGFuZCBhZGRzIGFueQorcHJvZHVjdGlvbnMgaXQgZmluZHMgdG8gdGhlIGVuZCBvZiB0aGUgcnVsZXMgZm9yIHdoaWNoIHRoZXkgYXJlIHNwZWNpZmllZC4gRm9yCitleGFtcGxlOgorCisgICAgJGFkZCA9ICJuYW1lOiAnSmltbXktQm9iJyB8ICdCb2JieS1KaW0nXG5kZXNjOiBjb2xvdXIgL25lY2tzPy8iOworICAgIHBhcnNlci0+RXh0ZW5kKCRhZGQpOworCithZGRzIHR3byBwcm9kdWN0aW9ucyB0byB0aGUgcnVsZSAibmFtZSIgKGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeSkgYW5kIG9uZQorcHJvZHVjdGlvbiB0byB0aGUgcnVsZSAiZGVzYyIuCisKK0M8UGFyc2U6OlJlY0Rlc2NlbnQ6OlJlcGxhY2U+IGlzIGlkZW50aWNhbCwgZXhjZXB0IHRoYXQgaXQgZmlyc3QgcmVzZXRzIGFyZQorcnVsZSBzcGVjaWZpZWQgaW4gdGhlIGFkZGl0aW9uYWwgZ3JhbW1hciwgcmVtb3ZpbmcgYW55IGV4aXN0aW5nIHByb2R1Y3Rpb25zLgorSGVuY2UgYWZ0ZXI6CisKKyAgICAkYWRkID0gIm5hbWU6ICdKaW1teS1Cb2InIHwgJ0JvYmJ5LUppbSdcbmRlc2M6IGNvbG91ciAvbmVja3M/LyI7CisgICAgcGFyc2VyLT5SZXBsYWNlKCRhZGQpOworCithcmUgYXJlIEk8b25seT4gdmFsaWQgIm5hbWUicyBhbmQgdGhlIG9uZSBwb3NzaWJsZSBkZXNjcmlwdGlvbi4KKworQSBtb3JlIGludGVyZXN0aW5nIHVzZSBvZiB0aGUgQzxFeHRlbmQ+IGFuZCBDPFJlcGxhY2U+IG1ldGhvZHMgaXMgdG8gY2FsbCB0aGVtCitpbnNpZGUgdGhlIGFjdGlvbiBvZiBhbiBleGVjdXRpbmcgcGFyc2VyLiBGb3IgZXhhbXBsZToKKworICAgIHR5cGVkZWY6ICd0eXBlZGVmJyB0eXBlX25hbWUgaWRlbnRpZmllciAnOycKKyAgICAgICAgICAgeyAkdGhpc3BhcnNlci0+RXh0ZW5kKCJ0eXBlX25hbWU6ICckaXRlbVszXSciKSB9CisgICAgICAgfCA8ZXJyb3I+CisKKyAgICBpZGVudGlmaWVyOiAuLi4hdHlwZV9uYW1lIC9bQS1aYS16X113Ki8KKword2hpY2ggYXV0b21hdGljYWxseSBwcmV2ZW50cyB0eXBlIG5hbWVzIGZyb20gYmVpbmcgdHlwZWRlZidkLCBvcjoKKworICAgIGNvbW1hbmQ6ICdtYXAnIGtleV9uYW1lICd0bycgYWJvcnRfa2V5CisgICAgICAgICAgIHsgJHRoaXNwYXJzZXItPlJlcGxhY2UoImFib3J0X2tleTogJyRpdGVtWzJdJyIpIH0KKyAgICAgICB8ICdtYXAnIGtleV9uYW1lICd0bycga2V5X25hbWUKKyAgICAgICAgICAgeyBtYXBfa2V5KCRpdGVtWzJdLCRpdGVtWzRdKSB9CisgICAgICAgfCBhYm9ydF9rZXkKKyAgICAgICAgICAgeyBleGl0IGlmIGNvbmZpcm0oImFib3J0PyIpIH0KKworICAgIGFib3J0X2tleTogJ3EnCisKKyAgICBrZXlfbmFtZTogLi4uIWFib3J0X2tleSAvW0EtWmEtel0vCisKK3doaWNoIGFsbG93cyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIGFib3J0IGtleSBiaW5kaW5nLCBidXQgbm90IHRvIHVuYmluZCBpdC4KKworVGhlIGNhcmVmdWwgdXNlIG9mIHN1Y2ggY29uc3RydWN0cyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWNvbmZpZ3VyZSBhCithIHJ1bm5pbmcgcGFyc2VyLCBlbGltaW5hdGluZyB0aGUgbmVlZCBmb3Igc2VtYW50aWMgZmVlZGJhY2sgYnkKK3Byb3ZpZGluZyBzeW50YWN0aWMgZmVlZGJhY2sgaW5zdGVhZC4gSG93ZXZlciwgYXMgY3VycmVudGx5IGltcGxlbWVudGVkLAorQzxSZXBsYWNlKCk+IGFuZCBDPEV4dGVuZCgpPiBoYXZlIHRvIHJlZ2VuZXJhdGUgYW5kIHJlLUM8ZXZhbD4gdGhlCitlbnRpcmUgcGFyc2VyIHdoZW5ldmVyIHRoZXkgYXJlIGNhbGxlZC4gVGhpcyBtYWtlcyB0aGVtIHF1aXRlIHNsb3cgZm9yCitsYXJnZSBncmFtbWFycy4KKworSW4gc3VjaCBjYXNlcywgdGhlIGp1ZGljaW91cyB1c2Ugb2YgYW4gaW50ZXJwb2xhdGVkIHJlZ2V4IGlzIGxpa2VseSB0bworYmUgZmFyIG1vcmUgZWZmaWNpZW50OgorCisgICAgdHlwZWRlZjogJ3R5cGVkZWYnIHR5cGVfbmFtZS8gaWRlbnRpZmllciAnOycKKyAgICAgICAgICAgeyAkdGhpc3BhcnNlci0+e2xvY2FsfXt0eXBlX25hbWV9IC49ICJ8JGl0ZW1bM10iIH0KKyAgICAgICB8IDxlcnJvcj4KKworICAgIGlkZW50aWZpZXI6IC4uLiF0eXBlX25hbWUgL1tBLVphLXpfXXcqLworCisgICAgdHlwZV9uYW1lOiAvJHRoaXNwYXJzZXItPntsb2NhbH17dHlwZV9uYW1lfS8KKworCis9aGVhZDIgUHJlY29tcGlsaW5nIHBhcnNlcnMKKworTm9ybWFsbHkgUGFyc2U6OlJlY0Rlc2NlbnQgYnVpbGRzIGEgcGFyc2VyIGZyb20gYSBncmFtbWFyIGF0IHJ1bi10aW1lLgorVGhhdCBhcHByb2FjaCBzaW1wbGlmaWVzIHRoZSBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHBhcnNpbmcgY29kZSwKK2J1dCBoYXMgdGhlIGRpc2FkdmFudGFnZSB0aGF0IGl0IHNsb3dzIHRoZSBwYXJzaW5nIHByb2Nlc3MgZG93biAtIHlvdQoraGF2ZSB0byB3YWl0IGZvciBQYXJzZTo6UmVjRGVzY2VudCB0byBidWlsZCB0aGUgcGFyc2VyIGV2ZXJ5IHRpbWUgdGhlCitwcm9ncmFtIHJ1bnMuIExvbmcgb3IgY29tcGxleCBncmFtbWFycyBjYW4gYmUgcGFydGljdWxhcmx5IHNsb3cgdG8KK2J1aWxkLCBsZWFkaW5nIHRvIHVuYWNjZXB0YWJsZSBkZWxheXMgYXQgc3RhcnQtdXAuCisKK1RvIG92ZXJjb21lIHRoaXMsIHRoZSBtb2R1bGUgcHJvdmlkZXMgYSB3YXkgb2YgInByZS1idWlsZGluZyIgYSBwYXJzZXIKK29iamVjdCBhbmQgc2F2aW5nIGl0IGluIGEgc2VwYXJhdGUgbW9kdWxlLiBUaGF0IG1vZHVsZSBjYW4gdGhlbiBiZSB1c2VkCit0byBjcmVhdGUgY2xvbmVzIG9mIHRoZSBvcmlnaW5hbCBwYXJzZXIuCisKK0EgZ3JhbW1hciBtYXkgYmUgcHJlY29tcGlsZWQgdXNpbmcgdGhlIEM8UHJlY29tcGlsZT4gY2xhc3MgbWV0aG9kLgorRm9yIGV4YW1wbGUsIHRvIHByZWNvbXBpbGUgYSBncmFtbWFyIHN0b3JlZCBpbiB0aGUgc2NhbGFyICRncmFtbWFyLAorYW5kIHByb2R1Y2UgYSBjbGFzcyBuYW1lZCBQcmVHcmFtbWFyIGluIGEgbW9kdWxlIGZpbGUgbmFtZWQgUHJlR3JhbW1hci5wbSwKK3lvdSBjb3VsZCB1c2U6CisKKyAgICB1c2UgUGFyc2U6OlJlY0Rlc2NlbnQ7CisKKyAgICBQYXJzZTo6UmVjRGVzY2VudC0+UHJlY29tcGlsZShbJG9wdGlvbnNfaGFzaHJlZl0sICRncmFtbWFyLCAiUHJlR3JhbW1hciIpOworCitUaGUgZmlyc3QgcmVxdWlyZWQgYXJndW1lbnQgaXMgdGhlIGdyYW1tYXIgc3RyaW5nLCB0aGUgc2Vjb25kIGlzIHRoZQorbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgYnVpbHQuIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgZmlsZSBpcworZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXBwZW5kaW5nICIucG0iIHRvIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlCitjbGFzcyBuYW1lLiBUaHVzCisKKyAgICBQYXJzZTo6UmVjRGVzY2VudC0+UHJlY29tcGlsZSgkZ3JhbW1hciwgIk15OjpOZXc6OlBhcnNlciIpOworCit3b3VsZCBwcm9kdWNlIGEgbW9kdWxlIGZpbGUgbmFtZWQgUGFyc2VyLnBtLgorCitBbiBvcHRpb25hbCBoYXNoIHJlZmVyZW5jZSBtYXkgYmUgc3VwcGxpZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvCitDPFByZWNvbXBpbGU+LiAgVGhpcyBhcmd1bWVudCBpcyBjdXJyZW50bHkgRVhQRVJJTUVOVEFMLCBhbmQgbWF5IGNoYW5nZQoraW4gYSBmdXR1cmUgcmVsZWFzZSBvZiBQYXJzZTo6UmVjRGVzY2VudC4gIFRoZSBvbmx5IHN1cHBvcnRlZCBvcHRpb24KK2lzIGN1cnJlbnRseSBDPC1zdGFuZGFsb25lPiwgc2VlIEw8LyJTdGFuZGFsb25lIFByZWNvbXBpbGVkIFBhcnNlcnMiPi4KKworSXQgaXMgc29tZXdoYXQgdGVkaW91cyB0byBoYXZlIHRvIHdyaXRlIGEgc21hbGwgUGVybCBwcm9ncmFtIGp1c3QgdG8KK2dlbmVyYXRlIGEgcHJlY29tcGlsZWQgZ3JhbW1hciBjbGFzcywgc28gUGFyc2U6OlJlY0Rlc2NlbnQgaGFzIHNvbWUgc3BlY2lhbAorbWFnaWMgdGhhdCBhbGxvd3MgeW91IHRvIGRvIHRoZSBqb2IgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZC1saW5lLgorCitJZiB5b3VyIGdyYW1tYXIgaXMgc3BlY2lmaWVkIGluIGEgZmlsZSBuYW1lZCBGPGdyYW1tYXI+LCB5b3UgY2FuIGdlbmVyYXRlCithIGNsYXNzIG5hbWVkIFlldDo6QW5vdGhlcjo6R3JhbW1hciBsaWtlIHNvOgorCisgICAgPiBwZXJsIC1NUGFyc2U6OlJlY0Rlc2NlbnQgLSBncmFtbWFyIFlldDo6QW5vdGhlcjo6R3JhbW1hcgorCitUaGlzIHdvdWxkIHByb2R1Y2UgYSBmaWxlIG5hbWVkIEY8R3JhbW1hci5wbT4gY29udGFpbmluZyB0aGUgZnVsbAorZGVmaW5pdGlvbiBvZiBhIGNsYXNzIGNhbGxlZCBZZXQ6OkFub3RoZXI6OkdyYW1tYXIuIE9mIGNvdXJzZSwgdG8gdXNlCit0aGF0IGNsYXNzLCB5b3Ugd291bGQgbmVlZCB0byBwdXQgdGhlIEY8R3JhbW1hci5wbT4gZmlsZSBpbiBhCitkaXJlY3RvcnkgbmFtZWQgRjxZZXQvQW5vdGhlcj4sIHNvbWV3aGVyZSBpbiB5b3VyIFBlcmwgaW5jbHVkZSBwYXRoLgorCitIYXZpbmcgY3JlYXRlZCB0aGUgbmV3IGNsYXNzLCBpdCdzIHZlcnkgZWFzeSB0byB1c2UgaXQgdG8gYnVpbGQKK2EgcGFyc2VyLiBZb3Ugc2ltcGx5IEM8dXNlPiB0aGUgbmV3IG1vZHVsZSwgYW5kIHRoZW4gY2FsbCBpdHMKK0M8bmV3PiBtZXRob2QgdG8gY3JlYXRlIGEgcGFyc2VyIG9iamVjdC4gRm9yIGV4YW1wbGU6CisKKyAgICB1c2UgWWV0OjpBbm90aGVyOjpHcmFtbWFyOworICAgIG15ICRwYXJzZXIgPSBZZXQ6OkFub3RoZXI6OkdyYW1tYXItPm5ldygpOworCitUaGUgZWZmZWN0IG9mIHRoZXNlIHR3byBsaW5lcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzOgorCisgICAgdXNlIFBhcnNlOjpSZWNEZXNjZW50OworCisgICAgb3BlbiBHUkFNTUFSX0ZJTEUsICJncmFtbWFyIiBvciBkaWU7CisgICAgbG9jYWwgJC87CisgICAgbXkgJGdyYW1tYXIgPSA8R1JBTU1BUl9GSUxFPjsKKworICAgIG15ICRwYXJzZXIgPSBQYXJzZTo6UmVjRGVzY2VudC0+bmV3KCRncmFtbWFyKTsKKworb25seSBjb25zaWRlcmFibHkgZmFzdGVyLgorCitOb3RlIGhvd2V2ZXIgdGhhdCB0aGUgcGFyc2VycyBwcm9kdWNlZCBieSBlaXRoZXIgYXBwcm9hY2ggYXJlIGV4YWN0bHkKK3RoZSBzYW1lLCBzbyB3aGlsc3QgcHJlY29tcGlsYXRpb24gaGFzIGFuIGVmZmVjdCBvbiBJPHNldC11cD4gc3BlZWQsCitpdCBoYXMgbm8gZWZmZWN0IG9uIEk8cGFyc2luZz4gc3BlZWQuIFJlY0Rlc2NlbnQgMi4wIHdpbGwgYWRkcmVzcyB0aGF0Citwcm9ibGVtLgorCis9aGVhZDMgU3RhbmRhbG9uZSBQcmVjb21waWxlZCBQYXJzZXJzCisKK1VudGlsIHZlcnNpb24gMS45NjcwMDMgb2YgUGFyc2U6OlJlY0Rlc2NlbnQsIHBhcnNlciBtb2R1bGVzIGJ1aWx0IHdpdGgKK0M8UHJlY29tcGlsZT4gd2VyZSBkZXBlbmRlbnQgb24gUGFyc2U6OlJlY0Rlc2NlbnQuICBGdXR1cmUKK1BhcnNlOjpSZWNEZXNjZW50IHJlbGVhc2VzIHdpdGggZGlmZmVyZW50IGludGVybmFsIGltcGxlbWVudGF0aW9ucword291bGQgYnJlYWsgcHJlLWV4aXN0aW5nIHByZWNvbXBpbGVkIHBhcnNlcnMuCisKK1ZlcnNpb24gMS45NjdfMDA1IGFkZGVkIHRoZSBhYmlsaXR5IGZvciBQYXJzZTo6UmVjRGVzY2VudCB0byBpbmNsdWRlCitpdHNlbGYgaW4gdGhlIHJlc3VsdGluZyAucG0gZmlsZSBpZiB5b3UgcGFzcyB0aGUgYm9vbGVhbiBvcHRpb24KK0M8LXN0YW5kYWxvbmU+IHRvIEM8UHJlY29tcGlsZT46CisKKyAgICBQYXJzZTo6UmVjRGVzY2VudC0+UHJlY29tcGlsZSh7IC1zdGFuZGFsb25lID0gMSwgfSwKKyAgICAgICAgJGdyYW1tYXIsICJNeTo6TmV3OjpQYXJzZXIiKTsKKworUGFyc2U6OlJlY0Rlc2NlbnQgaXMgaW5jbHVkZWQgYXMgUGFyc2U6OlJlY0Rlc2NlbnQ6Ol9SdW50aW1lIGluIG9yZGVyCit0byBhdm9pZCBjb25mbGljdHMgYmV0d2VlbiBhbiBpbnN0YWxsZWQgdmVyc2lvbiBvZiBQYXJzZTo6UmVjRGVzY2VudAorYW5kIGEgcHJlY29tcGlsZWQsIHN0YW5kYWxvbmUgcGFyc2VyIG1hZGUgd2l0aCBhbm90aGVyIHZlcnNpb24gb2YKK1BhcnNlOjpSZWNEZXNjZW50LiAgVGhpcyByZW5hbWluZyBpcyBleHBlcmltZW50YWwsIGFuZCBpcyBzdWJqZWN0IHRvCitjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zLgorCitQcmVjb21waWxlZCBwYXJzZXJzIHJlbWFpbiBkZXBlbmRlbnQgb24gUGFyc2U6OlJlY0Rlc2NlbnQgYnkgZGVmYXVsdCwKK2FzIHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbC4gIEluIHRoZSBmdXR1cmUsCitzdGFuZGFsb25lIHBhcnNlcnMgd2lsbCBiZWNvbWUgdGhlIGRlZmF1bHQuCisKKz1oZWFkMSBHT1RDSEFTCisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgY29tbW9uIG1pc3Rha2VzIHRoYXQgZ3JhbW1hciB3cml0ZXJzIHNlZW0gdG8KK21ha2Ugb24gYSByZWd1bGFyIGJhc2lzLgorCis9aGVhZDIgMS4gRXhwZWN0aW5nIGFuIGVycm9yIHRvIGFsd2F5cyBpbnZhbGlkYXRlIGEgcGFyc2UKKworQSBjb21tb24gbWlzdGFrZSB3aGVuIHVzaW5nIGVycm9yIG1lc3NhZ2VzIGlzIHRvIHdyaXRlIHRoZSBncmFtbWFyIGxpa2UgdGhpczoKKworICAgIGZpbGU6IGxpbmUocykKKworICAgIGxpbmU6IGxpbmVfdHlwZV8xCisgICAgfCBsaW5lX3R5cGVfMgorICAgIHwgbGluZV90eXBlXzMKKyAgICB8IDxlcnJvcj4KKworVGhlIGV4cGVjdGF0aW9uIHNlZW1zIHRvIGJlIHRoYXQgYW55IGxpbmUgdGhhdCBpcyBub3Qgb2YgdHlwZSAxLCAyIG9yIDMgd2lsbAoraW52b2tlIHRoZSBDPEU8bHQ+ZXJyb3JFPGd0Pj4gZGlyZWN0aXZlIGFuZCB0aGVyZWJ5IGNhdXNlIHRoZSBwYXJzZSB0byBmYWlsLgorCitVbmZvcnR1bmF0ZWx5LCB0aGF0IG9ubHkgaGFwcGVucyBpZiB0aGUgZXJyb3Igb2NjdXJzIGluIHRoZSB2ZXJ5IGZpcnN0IGxpbmUuCitUaGUgZmlyc3QgcnVsZSBzdGF0ZXMgdGhhdCBhIEM8ZmlsZT4gaXMgbWF0Y2hlZCBieSBvbmUgb3IgbW9yZSBsaW5lcywgc28gaWYKK2V2ZW4gYSBzaW5nbGUgbGluZSBzdWNjZWVkcywgdGhlIGZpcnN0IHJ1bGUgaXMgY29tcGxldGVseSBzYXRpc2ZpZWQgYW5kIHRoZQorcGFyc2UgYXMgYSB3aG9sZSBzdWNjZWVkcy4gVGhhdCBtZWFucyB0aGF0IGFueSBlcnJvciBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkKK3N1YnNlcXVlbnQgZmFpbHVyZXMgaW4gdGhlIEM8bGluZT4gcnVsZSBhcmUgcXVpZXRseSBpZ25vcmVkLgorCitUeXBpY2FsbHkgd2hhdCdzIHJlYWxseSBuZWVkZWQgaXMgdGhpczoKKworICAgIGZpbGU6IGxpbmUocykgZW9maWxlICAgIHsgJHJldHVybiA9ICRpdGVtWzFdIH0KKworICAgIGxpbmU6IGxpbmVfdHlwZV8xCisgICAgfCBsaW5lX3R5cGVfMgorICAgIHwgbGluZV90eXBlXzMKKyAgICB8IDxlcnJvcj4KKworICAgIGVvZmlsZTogL15cWi8KKworVGhlIGFkZGl0aW9uIG9mIHRoZSBDPGVvZmlsZT4gc3VicnVsZSAgdG8gdGhlIGZpcnN0IHByb2R1Y3Rpb24gbWVhbnMgdGhhdAorYSBmaWxlIG9ubHkgbWF0Y2hlcyBhIHNlcmllcyBvZiBzdWNjZXNzZnVsIEM8bGluZT4gbWF0Y2hlcyBJPHRoYXQgY29uc3VtZSB0aGUKK2NvbXBsZXRlIGlucHV0IHRleHQ+LiBJZiBhbnkgaW5wdXQgdGV4dCByZW1haW5zIGFmdGVyIHRoZSBsaW5lcyBhcmUgbWF0Y2hlZCwKK3RoZXJlIG11c3QgaGF2ZSBiZWVuIGFuIGVycm9yIGluIHRoZSBsYXN0IEM8bGluZT4uIEluIHRoYXQgY2FzZSB0aGUgQzxlb2ZpbGU+CitydWxlIHdpbGwgZmFpbCwgY2F1c2luZyB0aGUgZW50aXJlIEM8ZmlsZT4gcnVsZSB0byBmYWlsIHRvby4KKworTm90ZSB0b28gdGhhdCBDPGVvZmlsZT4gbXVzdCBtYXRjaCBDPC9eXFovPiAoZW5kLW9mLXRleHQpLCBJPG5vdD4KK0M8L15cY1ovPiBvciBDPC9eXGNELz4gKGVuZC1vZi1maWxlKS4KKworQW5kIGRvbid0IGZvcmdldCB0aGUgYWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHByb2R1Y3Rpb24uIElmIHlvdSBqdXN0Cit3cml0ZToKKworICAgIGZpbGU6IGxpbmUocykgZW9maWxlCisKK3RoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBDPGZpbGU+IHJ1bGUgd2lsbCBiZSB0aGUgdmFsdWUgb2YgaXRzCitsYXN0IGl0ZW06IEM8ZW9maWxlPi4gU2luY2UgQzxlb2ZpbGU+IGFsd2F5cyByZXR1cm5zIGFuIGVtcHR5IHN0cmluZworb24gc3VjY2VzcywgdGhhdCB3aWxsIGNhdXNlIHRoZSBDPGZpbGU+IHJ1bGUgdG8gcmV0dXJuIHRoYXQgZW1wdHkKK3N0cmluZy4gQXBhcnQgZnJvbSByZXR1cm5pbmcgdGhlIHdyb25nIHZhbHVlLCByZXR1cm5pbmcgYW4gZW1wdHkgc3RyaW5nCit3aWxsIHRyaXAgdXAgY29kZSBzdWNoIGFzOgorCisgICAgJHBhcnNlci0+ZmlsZSgkZmlsZXRleHQpIHx8IGRpZTsKKworKHNpbmNlICIiIGlzIGZhbHNlKS4KKworUmVtZW1iZXIgdGhhdCBQYXJzZTo6UmVjRGVzY2VudCByZXR1cm5zIHVuZGVmIG9uIGZhaWx1cmUsCitzbyB0aGUgb25seSBzYWZlIHRlc3QgZm9yIGZhaWx1cmUgaXM6CisKKyAgICBkZWZpbmVkKCRwYXJzZXItPmZpbGUoJGZpbGV0ZXh0KSkgfHwgZGllOworCisKKz1oZWFkMiAyLiBVc2luZyBhIEM8cmV0dXJuPiBpbiBhbiBhY3Rpb24KKworQW4gYWN0aW9uIGlzIGxpa2UgYSBDPGRvPiBibG9jayBpbnNpZGUgdGhlIHN1YnJvdXRpbmUgaW1wbGVtZW50aW5nIHRoZQorc3Vycm91bmRpbmcgcnVsZS4gU28gaWYgeW91IHB1dCBhIEM8cmV0dXJuPiBzdGF0ZW1lbnQgaW4gYW4gYWN0aW9uOgorCisgICAgcmFuZ2U6ICcoJyBzdGFydCAnLi4nIGVuZCApJworICAgICAgICB7IHJldHVybiAkaXRlbXtlbmR9IH0KKyAgICAgICAvXHMrLworCit0aGF0IHN1YnJvdXRpbmUgd2lsbCBpbW1lZGlhdGVseSByZXR1cm4sIHdpdGhvdXQgY2hlY2tpbmcgdGhlIHJlc3Qgb2YKK3RoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBwcm9kdWN0aW9uIChlLmcuIHRoZSBDPC9ccysvPikgYW5kIHdpdGhvdXQKK3NldHRpbmcgdXAgdGhlIG5lY2Vzc2FyeSBkYXRhIHN0cnVjdHVyZXMgdG8gdGVsbCB0aGUgcGFyc2VyIHRoYXQgdGhlCitydWxlIGhhcyBzdWNjZWVkZWQuCisKK1RoZSBjb3JyZWN0IHdheSB0byBzZXQgYSByZXR1cm4gdmFsdWUgaW4gYW4gYWN0aW9uIGlzIHRvIHNldCB0aGUgQzwkcmV0dXJuPgordmFyaWFibGU6CisKKyAgICByYW5nZTogJygnIHN0YXJ0ICcuLicgZW5kICknCisgICAgICAgICAgICAgICAgeyAkcmV0dXJuID0gJGl0ZW17ZW5kfSB9CisgICAgICAgICAgIC9ccysvCisKKworPWhlYWQyIDIuIFNldHRpbmcgQzwkUGFyc2U6OlJlY0Rlc2NlbnQ6OnNraXA+IGF0IHBhcnNlIHRpbWUKKworSWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHNraXBwaW5nIGJlaGF2aW91ciAoc2VlCitMPFRlcm1pbmFsIFNlcGFyYXRvcnM+IGFuZCB0aGUgQzxFPGx0PnNraXA6Li4uRTxndD4+IGRpcmVjdGl2ZSkgYnkgc2V0dGluZworQzwkUGFyc2U6OlJlY0Rlc2NlbnQ6OnNraXA+IHlvdSBoYXZlIHRvIHJlbWVtYmVyIHRvIHNldCB0aGlzIHZhcmlhYmxlCitJPGJlZm9yZT4gY3JlYXRpbmcgdGhlIGdyYW1tYXIgb2JqZWN0LgorCitGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gc2tpcCBhbGwgUGVybC1saWtlIGNvbW1lbnRzIHdpdGggdGhpcworcmVndWxhciBleHByZXNzaW9uOgorCisgICBteSAkc2tpcF9zcGFjZXNfYW5kX2NvbW1lbnRzID0gcXIvCisgICAgICAgICAoP214czoKKyAgICAgICAgICAgIFxzKyAgICAgICAgICMgZWl0aGVyIHNwYWNlcworICAgICAgICAgICAgfCBcIyAuKj8kICAgIyBvciBhIGRhc2ggYW5kIHdoYXRldmVyIHVwIHRvIHRoZSBlbmQgb2YgbGluZQorICAgICAgICAgKSogICAgICAgICAgICAgIyByZXBlYXRlZCBhdCB3aWxsIChpbiB3aGF0ZXZlciBvcmRlcikKKyAgICAgIC87CisKK0FuZCB0aGVuOgorCisgICBteSAkcGFyc2VyMSA9IFBhcnNlOjpSZWNEZXNjZW50LT5uZXcoJGdyYW1tYXIpOworCisgICAkUGFyc2U6OlJlY0Rlc2NlbnQ6OnNraXAgPSAkc2tpcF9zcGFjZXNfYW5kX2NvbW1lbnRzOworCisgICBteSAkcGFyc2VyMiA9IFBhcnNlOjpSZWNEZXNjZW50LT5uZXcoJGdyYW1tYXIpOworCisgICAkcGFyc2VyMS0+cGFyc2UoJHRleHQpOyAjIHRoaXMgZG9lcyBub3QgY29wZSB3aXRoIGNvbW1lbnRzCisgICAkcGFyc2VyMi0+cGFyc2UoJHRleHQpOyAjIHRoaXMgc2tpcHMgY29tbWVudHMgY29ycmVjdGx5CisKK1RoZSB0d28gcGFyc2VycyBiZWhhdmUgZGlmZmVyZW50bHksIGJlY2F1c2UgYW55IHNraXBwaW5nIGJlaGF2aW91cgorc3BlY2lmaWVkIHZpYSBDPCRQYXJzZTo6UmVjRGVzY2VudDo6c2tpcD4gaXMgaGFyZC1jb2RlZCB3aGVuIHRoZQorZ3JhbW1hciBvYmplY3QgaXMgYnVpbHQsIG5vdCBhdCBwYXJzZSB0aW1lLgorCisKKz1oZWFkMSBESUFHTk9TVElDUworCitEaWFnbm9zdGljcyBhcmUgaW50ZW5kZWQgdG8gYmUgc2VsZi1leHBsYW5hdG9yeSAocGFydGljdWxhcmx5IGlmIHlvdQordXNlIEI8LVJEX0hJTlQ+ICh1bmRlciBCPHBlcmwgLXM+KSBvciBkZWZpbmUgQzwkOjpSRF9ISU5UPiBpbnNpZGUgdGhlIHByb2dyYW0pLgorCitDPFBhcnNlOjpSZWNEZXNjZW50PiBjdXJyZW50bHkgZGlhZ25vc2VzIHRoZSBmb2xsb3dpbmc6CisKKz1vdmVyIDQKKworPWl0ZW0gKgorCitJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZCBhcyBwYXR0ZXJuIHRlcm1pbmFscyAoZmF0YWwgZXJyb3IpLgorCis9aXRlbSAqCisKK0ludmFsaWQgUGVybCBjb2RlIGluIGNvZGUgYmxvY2tzIChmYXRhbCBlcnJvcikuCisKKz1pdGVtICoKKworTG9va2FoZWFkIHVzZWQgaW4gdGhlIHdyb25nIHBsYWNlIG9yIGluIGEgbm9uc2Vuc2ljYWwgd2F5IChmYXRhbCBlcnJvcikuCisKKz1pdGVtICoKKworIk9idmlvdXMiIGNhc2VzIG9mIGxlZnQtcmVjdXJzaW9uIChmYXRhbCBlcnJvcikuCisKKz1pdGVtICoKKworTWlzc2luZyBvciBleHRyYSBjb21wb25lbnRzIGluIGEgQzxFPGx0PmxlZnRvcEU8Z3Q+PiBvciBDPEU8bHQ+cmlnaHRvcEU8Z3Q+PgorZGlyZWN0aXZlLgorCis9aXRlbSAqCisKK1VucmVjb2duaXNhYmxlIGNvbXBvbmVudHMgaW4gdGhlIGdyYW1tYXIgc3BlY2lmaWNhdGlvbiAoZmF0YWwgZXJyb3IpLgorCis9aXRlbSAqCisKKyJPcnBoYW5lZCIgcnVsZSBjb21wb25lbnRzIHNwZWNpZmllZCBiZWZvcmUgdGhlIGZpcnN0IHJ1bGUgKGZhdGFsIGVycm9yKQorb3IgYWZ0ZXIgYW4gQzxFPGx0PmVycm9yRTxndD4+IGRpcmVjdGl2ZSAobGV2ZWwgMyB3YXJuaW5nKS4KKworPWl0ZW0gKgorCitNaXNzaW5nIHJ1bGUgZGVmaW5pdGlvbnMgKHRoaXMgb25seSBnZW5lcmF0ZXMgYSBsZXZlbCAzIHdhcm5pbmcsIHNpbmNlIHlvdQorbWF5IGJlIHByb3ZpZGluZyB0aGVtIGxhdGVyIHZpYSBDPFBhcnNlOjpSZWNEZXNjZW50OjpFeHRlbmQoKT4pLgorCis9aXRlbSAqCisKK0luc3RhbmNlcyB3aGVyZSBncmVlZHkgcmVwZXRpdGlvbiBiZWhhdmlvdXIgd2lsbCBhbG1vc3QgY2VydGFpbmx5CitjYXVzZSB0aGUgZmFpbHVyZSBvZiBhIHByb2R1Y3Rpb24gKGEgbGV2ZWwgMyB3YXJuaW5nIC0gc2VlCitMPCJPTi1HT0lORyBJU1NVRVMgQU5EIEZVVFVSRSBESVJFQ1RJT05TIj4gYmVsb3cpLgorCis9aXRlbSAqCisKK0F0dGVtcHRzIHRvIGRlZmluZSBydWxlcyBuYW1lZCAnUmVwbGFjZScgb3IgJ0V4dGVuZCcsIHdoaWNoIGNhbm5vdCBiZQorY2FsbGVkIGRpcmVjdGx5IHRocm91Z2ggdGhlIHBhcnNlciBvYmplY3QgYmVjYXVzZSBvZiB0aGUgcHJlZGVmaW5lZAorbWVhbmluZyBvZiBDPFBhcnNlOjpSZWNEZXNjZW50OjpSZXBsYWNlPiBhbmQKK0M8UGFyc2U6OlJlY0Rlc2NlbnQ6OkV4dGVuZD4uIChPbmx5IGEgbGV2ZWwgMiB3YXJuaW5nIGlzIGdlbmVyYXRlZCwgc2luY2UKK3N1Y2ggcnVsZXMgSTxjYW4+IHN0aWxsIGJlIHVzZWQgYXMgc3VicnVsZXMpLgorCis9aXRlbSAqCisKK1Byb2R1Y3Rpb25zIHdoaWNoIGNvbnNpc3Qgb2YgYSBzaW5nbGUgQzxFPGx0PmVycm9yP0U8Z3Q+PgorZGlyZWN0aXZlLCBhbmQgd2hpY2ggdGhlcmVmb3JlIG1heSBzdWNjZWVkIHVuZXhwZWN0ZWRseQorKGEgbGV2ZWwgMiB3YXJuaW5nLCBzaW5jZSB0aGlzIG1pZ2h0IGNvbmNlaXZhYmx5IGJlIHRoZSBkZXNpcmVkIGVmZmVjdCkuCisKKz1pdGVtICoKKworTXVsdGlwbGUgY29uc2VjdXRpdmUgbG9va2FoZWFkIHNwZWNpZmllcnMgKGEgbGV2ZWwgMSB3YXJuaW5nIG9ubHksIHNpbmNlIHRoZWlyCitlZmZlY3RzIHNpbXBseSBhY2N1bXVsYXRlKS4KKworPWl0ZW0gKgorCitQcm9kdWN0aW9ucyB3aGljaCBzdGFydCB3aXRoIGEgQzxFPGx0PnJlamVjdEU8Z3Q+PiBvciBDPEU8bHQ+cnVsZXZhcjouLi5FPGd0Pj4KK2RpcmVjdGl2ZS4gU3VjaCBwcm9kdWN0aW9ucyBhcmUgb3B0aW1pemVkIGF3YXkgKGEgbGV2ZWwgMSB3YXJuaW5nKS4KKworPWl0ZW0gKgorCitSdWxlcyB3aGljaCBhcmUgYXV0b2dlbmVyYXRlZCB1bmRlciBDPCQ6OkFVVE9TVFVCPiAoYSBsZXZlbCAxIHdhcm5pbmcpLgorCis9YmFjaworCis9aGVhZDEgQVVUSE9SCisKK0RhbWlhbiBDb253YXkgKGRhbWlhbkBjb253YXkub3JnKQorSmVyZW15IFQuIEJyYXVuIChKVEJSQVVOQENQQU4ub3JnKSBbY3VycmVudCBtYWludGFpbmVyXQorCis9aGVhZDEgQlVHUyBBTkQgSVJSSVRBVElPTlMKKworVGhlcmUgYXJlIHVuZG91YnRlZGx5IHNlcmlvdXMgYnVncyBsdXJraW5nIHNvbWV3aGVyZSBpbiB0aGlzIG11Y2ggY29kZSA6LSkKK0J1ZyByZXBvcnRzLCB0ZXN0IGNhc2VzIGFuZCBvdGhlciBmZWVkYmFjayBhcmUgbW9zdCB3ZWxjb21lLgorCitPbmdvaW5nIGFubm95YW5jZXMgaW5jbHVkZToKKworPW92ZXIgNAorCis9aXRlbSAqCisKK1RoZXJlJ3Mgbm8gc3VwcG9ydCBmb3IgcGFyc2luZyBkaXJlY3RseSBmcm9tIGFuIGlucHV0IHN0cmVhbS4KK0lmIGFuZCB3aGVuIHRoZSBQZXJsIEdvZHMgZ2l2ZSB1cyByZWd1bGFyIGV4cHJlc3Npb25zIG9uIHN0cmVhbXMsCit0aGlzIHNob3VsZCBiZSB0cml2aWFsIChhaGVtISkgdG8gaW1wbGVtZW50LgorCis9aXRlbSAqCisKK1RoZSBwYXJzZXIgZ2VuZXJhdG9yIGNhbiBnZXQgY29uZnVzZWQgaWYgYWN0aW9ucyBhcmVuJ3QgcHJvcGVybHkKK2Nsb3NlZCBvciBpZiB0aGV5IGNvbnRhaW4gcGFydGljdWxhcmx5IG5hc3R5IFBlcmwgc3ludGF4IGVycm9ycworKGVzcGVjaWFsbHkgdW5tYXRjaGVkIGN1cmx5IGJyYWNrZXRzKS4KKworPWl0ZW0gKgorCitUaGUgZ2VuZXJhdG9yIG9ubHkgZGV0ZWN0cyB0aGUgbW9zdCBvYnZpb3VzIGZvcm0gb2YgbGVmdCByZWN1cnNpb24KKyhwb3RlbnRpYWwgcmVjdXJzaW9uIG9uIHRoZSBmaXJzdCBzdWJydWxlIGluIGEgcnVsZSkuIE1vcmUgc3VidGxlCitmb3JtcyBvZiBsZWZ0IHJlY3Vyc2lvbiAoZm9yIGV4YW1wbGUsIHRocm91Z2ggdGhlIHNlY29uZCBpdGVtIGluIGEKK3J1bGUgYWZ0ZXIgYSAiemVybyIgbWF0Y2ggb2YgYSBwcmVjZWRpbmcgInplcm8tb3ItbW9yZSIgcmVwZXRpdGlvbiwKK29yIGFmdGVyIGEgbWF0Y2ggb2YgYSBzdWJydWxlIHdpdGggYW4gZW1wdHkgcHJvZHVjdGlvbikgYXJlIG5vdCBmb3VuZC4KKworPWl0ZW0gKgorCitJbnN0ZWFkIG9mIGNvbXBsYWluaW5nIGFib3V0IGxlZnQtcmVjdXJzaW9uLCB0aGUgZ2VuZXJhdG9yIHNob3VsZAorc2lsZW50bHkgdHJhbnNmb3JtIHRoZSBncmFtbWFyIHRvIHJlbW92ZSBpdC4gRG9uJ3QgZXhwZWN0IHRoaXMKK2ZlYXR1cmUgYW55IHRpbWUgc29vbiBhcyBpdCB3b3VsZCByZXF1aXJlIGEgbW9yZSBzb3BoaXN0aWNhdGVkCithcHByb2FjaCB0byBwYXJzZXIgZ2VuZXJhdGlvbiB0aGFuIGlzIGN1cnJlbnRseSB1c2VkLgorCis9aXRlbSAqCisKK1RoZSBnZW5lcmF0ZWQgcGFyc2VycyBkb24ndCBhbHdheXMgcnVuIGFzIGZhc3QgYXMgbWlnaHQgYmUgd2lzaGVkLgorCis9aXRlbSAqCisKK1RoZSBtZXRhLXBhcnNlciBzaG91bGQgYmUgYm9vdHN0cmFwcGVkIHVzaW5nIEM8UGFyc2U6OlJlY0Rlc2NlbnQ+IDotKQorCis9YmFjaworCis9aGVhZDEgT04tR09JTkcgSVNTVUVTIEFORCBGVVRVUkUgRElSRUNUSU9OUworCis9b3ZlciA0CisKKz1pdGVtIDEuCisKK1JlcGV0aXRpb25zIGFyZSAiaW5jb3JyaWdpYmx5IGdyZWVkeSIgaW4gdGhhdCB0aGV5IHdpbGwgZWF0IGV2ZXJ5dGhpbmcgdGhleSBjYW4KK2FuZCB3b24ndCBiYWNrdHJhY2sgaWYgdGhhdCBiZWhhdmlvdXIgY2F1c2VzIGEgcHJvZHVjdGlvbiB0byBmYWlsIG5lZWRsZXNzbHkuCitTbywgZm9yIGV4YW1wbGU6CisKKyAgICBydWxlOiBzdWJydWxlKHMpIHN1YnJ1bGUKKword2lsbCBJPG5ldmVyPiBzdWNjZWVkLCBiZWNhdXNlIHRoZSByZXBldGl0aW9uIHdpbGwgZWF0IGFsbCB0aGUKK3N1YnJ1bGVzIGl0IGZpbmRzLCBsZWF2aW5nIG5vbmUgdG8gbWF0Y2ggdGhlIHNlY29uZCBpdGVtLiBTdWNoCitjb25zdHJ1Y3Rpb25zIGFyZSByZWxhdGl2ZWx5IHJhcmUgKGFuZCBDPFBhcnNlOjpSZWNEZXNjZW50OjpuZXc+IGdlbmVyYXRlcyBhCit3YXJuaW5nIHdoZW5ldmVyIHRoZXkgb2NjdXIpIHNvIHRoaXMgbWF5IG5vdCBiZSBhIHByb2JsZW0sIGVzcGVjaWFsbHkKK3NpbmNlIHRoZSBpbnNhdGlhYmxlIGJlaGF2aW91ciBjYW4gYmUgb3ZlcmNvbWUgIm1hbnVhbGx5IiBieSB3cml0aW5nOgorCisgICAgcnVsZTogcGVudWx0aW1hdGVfc3VicnVsZShzKSBzdWJydWxlCisKKyAgICBwZW51bHRpbWF0ZV9zdWJydWxlOiBzdWJydWxlIC4uLnN1YnJ1bGUKKworVGhlIGlzc3VlIGlzIHRoYXQgdGhpcyBjb25zdHJ1Y3Rpb24gaXMgZXhhY3RseSB0d2ljZSBhcyBleHBlbnNpdmUgYXMgdGhlCitvcmlnaW5hbCwgd2hlcmVhcyBiYWNrdHJhY2tpbmcgd291bGQgYWRkIG9ubHkgMS9JPE4+IHRvIHRoZSBjb3N0IChmb3IKK21hdGNoaW5nIEk8Tj4gcmVwZXRpdGlvbnMgb2YgQzxzdWJydWxlPikuIEkgd291bGQgd2VsY29tZSBmZWVkYmFjayBvbgordGhlIG5lZWQgZm9yIGJhY2t0cmFja2luZzsgcGFydGljdWxhcmx5IG9uIGNhc2VzIHdoZXJlIHRoZSBsYWNrIG9mIGl0CittYWtlcyBwYXJzaW5nIHBlcmZvcm1hbmNlIHByb2JsZW1hdGljYWwuCisKKz1pdGVtIDIuCisKK0hhdmluZyBvcGVuZWQgdGhhdCBjYW4gb2Ygd29ybXMsIGl0J3MgYWxzbyBuZWNlc3NhcnkgdG8gY29uc2lkZXIgd2hldGhlciB0aGVyZQoraXMgYSBuZWVkIGZvciBub24tZ3JlZWR5IHJlcGV0aXRpb24gc3BlY2lmaWVycy4gQWdhaW4sIGl0J3MgcG9zc2libGUgKGF0IHNvbWUKK2Nvc3QpIHRvIG1hbnVhbGx5IHByb3ZpZGUgdGhlIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHk6CisKKyAgICBydWxlOiBub25ncmVlZHlfc3VicnVsZShzKSBvdGhlcnN1YnJ1bGUKKworICAgIG5vbmdyZWVkeV9zdWJydWxlOiBzdWJydWxlIC4uLiFvdGhlcnN1YnJ1bGUKKworT3ZlcmFsbCwgdGhlIGlzc3VlIGlzIHdoZXRoZXIgdGhlIGJlbmVmaXQgb2YgdGhpcyBleHRyYSBmdW5jdGlvbmFsaXR5CitvdXR3ZWlnaHMgdGhlIGRyYXdiYWNrcyBvZiBmdXJ0aGVyIGNvbXBsaWNhdGluZyB0aGUgKGN1cnJlbnRseQorbWluaW1hbGlzdCkgZ3JhbW1hciBzcGVjaWZpY2F0aW9uIHN5bnRheCwgYW5kICh3b3JzZSkgaW50cm9kdWNpbmcgbW9yZSBvdmVyaGVhZAoraW50byB0aGUgZ2VuZXJhdGVkIHBhcnNlcnMuCisKKz1pdGVtIDMuCisKK0FuIEM8RTxsdD5hdXRvY29tbWl0RTxndD4+IGRpcmVjdGl2ZSB3b3VsZCBiZSBuaWNlLiBUaGF0IGlzLCBpdCB3b3VsZCBiZSB1c2VmdWwgdG8gYmUKK2FibGUgdG8gc2F5OgorCisgICAgY29tbWFuZDogPGF1dG9jb21taXQ+CisgICAgY29tbWFuZDogJ2ZpbmQnIG5hbWUKKyAgICAgICB8ICdmaW5kJyBhZGRyZXNzCisgICAgICAgfCAnZG8nIGNvbW1hbmQgJ2F0JyB0aW1lICdpZicgY29uZGl0aW9uCisgICAgICAgfCAnZG8nIGNvbW1hbmQgJ2F0JyB0aW1lCisgICAgICAgfCAnZG8nIGNvbW1hbmQKKyAgICAgICB8IHVudXN1YWxfY29tbWFuZAorCithbmQgaGF2ZSB0aGUgZ2VuZXJhdG9yIHdvcmsgb3V0IHRoYXQgdGhpcyBzaG91bGQgYmUgInBydW5lZCIgdGh1czoKKworICAgIGNvbW1hbmQ6ICdmaW5kJyBuYW1lCisgICAgICAgfCAnZmluZCcgPGNvbW1pdD4gYWRkcmVzcworICAgICAgIHwgJ2RvJyA8Y29tbWl0PiBjb21tYW5kIDx1bmNvbW1pdD4KKyAgICAgICAgJ2F0JyB0aW1lCisgICAgICAgICdpZicgPGNvbW1pdD4gY29uZGl0aW9uCisgICAgICAgfCAnZG8nIDxjb21taXQ+IGNvbW1hbmQgPHVuY29tbWl0PgorICAgICAgICAnYXQnIDxjb21taXQ+IHRpbWUKKyAgICAgICB8ICdkbycgPGNvbW1pdD4gY29tbWFuZAorICAgICAgIHwgdW51c3VhbF9jb21tYW5kCisKK1RoZXJlIGFyZSBzZXZlcmFsIGlzc3VlcyBoZXJlLiBGaXJzdGx5LCBzaG91bGQgdGhlCitDPEU8bHQ+YXV0b2NvbW1pdEU8Z3Q+PiBhdXRvbWF0aWNhbGx5IGluc3RhbGwgYW4gQzxFPGx0PnVuY29tbWl0RTxndD4+CithdCB0aGUgc3RhcnQgb2YgdGhlIGxhc3QgcHJvZHVjdGlvbiAob24gdGhlIGdyb3VuZHMgdGhhdCB0aGUgImNvbW1hbmQiCitydWxlIGRvZXNuJ3Qga25vdyB3aGV0aGVyIGFuICJ1bnVzdWFsX2NvbW1hbmQiIG1pZ2h0IHN0YXJ0IHdpdGggImZpbmQiCitvciAiZG8iKSBvciBzaG91bGQgdGhlICJ1bnVzdWFsX2NvbW1hbmQiIHN1YmdyYXBoIGJlIGFuYWx5c2VkICh0byBzZWUKK2lmIGl0IEk8bWlnaHQ+IGJlIHZpYWJsZSBhZnRlciBhICJmaW5kIiBvciAiZG8iKT8KKworVGhlIHNlY29uZCBpc3N1ZSBpcyBob3cgcmVndWxhciBleHByZXNzaW9ucyBzaG91bGQgYmUgdHJlYXRlZC4gVGhlIHNpbXBsZXN0CithcHByb2FjaCB3b3VsZCBiZSBzaW1wbHkgdG8gdW5jb21taXQgYmVmb3JlIHRoZW0gKG9uIHRoZSBncm91bmRzIHRoYXQgdGhleQorSTxtaWdodD4gbWF0Y2gpLiBCZXR0ZXIgZWZmaWNpZW5jeSB3b3VsZCBiZSBvYnRhaW5lZCBieSBhbmFseXppbmcgYWxsIHByZWNlZGluZworbGl0ZXJhbCB0b2tlbnMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBhdHRlcm4gd291bGQgbWF0Y2ggdGhlbS4KKworT3ZlcmFsbCwgdGhlIGlzc3VlcyBhcmU6IGNhbiBzdWNoIGF1dG9tYXRlZCAicHJ1bmluZyIgYXBwcm9hY2ggYSBoYW5kLXR1bmVkCit2ZXJzaW9uIHN1ZmZpY2llbnRseSBjbG9zZWx5IHRvIHdhcnJhbnQgdGhlIGV4dHJhIHNldC11cCBleHBlbnNlLCBhbmQgKG1vcmUKK2ltcG9ydGFudGx5KSBpcyB0aGUgcHJvYmxlbSBpbXBvcnRhbnQgZW5vdWdoIHRvIGV2ZW4gd2FycmFudCB0aGUgbm9uLXRyaXZpYWwKK2VmZm9ydCBvZiBidWlsZGluZyBhbiBhdXRvbWF0ZWQgc29sdXRpb24/CisKKz1iYWNrCisKKz1oZWFkMSBTVVBQT1JUCisKKz1oZWFkMiBTb3VyY2UgQ29kZSBSZXBvc2l0b3J5CisKK0w8aHR0cDovL2dpdGh1Yi5jb20vanRicmF1bi9QYXJzZS1SZWNEZXNjZW50PgorCis9aGVhZDIgTWFpbGluZyBMaXN0CisKK1Zpc2l0IEw8aHR0cDovL3d3dy5wZXJsZm91bmRhdGlvbi5vcmcvcGVybDUvaW5kZXguY2dpP3BhcnNlX3JlY2Rlc2NlbnQ+IHRvIHNpZ24gdXAgZm9yIHRoZSBtYWlsaW5nIGxpc3QuCisKK0w8aHR0cDovL3d3dy5QZXJsTW9ua3Mub3JnPiBpcyBhbHNvIGEgZ29vZCBwbGFjZSB0byBhc2sKK3F1ZXN0aW9ucy4gUHJldmlvdXMgcG9zdHMgYWJvdXQgUGFyc2U6OlJlY0Rlc2NlbnQgY2FuIHR5cGljYWxseSBiZQorZm91bmQgd2l0aCB0aGlzIHNlYXJjaDoKK0w8aHR0cDovL3Blcmxtb25rcy5vcmcvaW5kZXgucGw/bm9kZT1yZWNkZXNjZW50Pi4KKworPWhlYWQyIEZBUQorCitWaXNpdCBMPFBhcnNlOjpSZWNEZXNjZW50OjpGQVE+IGZvciBhbnN3ZXJzIHRvIGZyZXF1ZW50bHkgKGFuZCBub3Qgc28KK2ZyZXF1ZW50bHkpIGFza2VkIHF1ZXN0aW9ucyBhYm91dCBQYXJzZTo6UmVjRGVzY2VudC4KKworPWhlYWQyIFZpZXcvUmVwb3J0IEJ1Z3MKKworVG8gdmlldyB0aGUgY3VycmVudCBidWcgbGlzdCBvciByZXBvcnQgYSBuZXcgaXNzdWUgdmlzaXQKK0w8aHR0cHM6Ly9ydC5jcGFuLm9yZy9QdWJsaWMvRGlzdC9EaXNwbGF5Lmh0bWw/TmFtZT1QYXJzZS1SZWNEZXNjZW50Pi4KKworPWhlYWQxIFNFRSBBTFNPCisKK0w8UmVnZXhwOjpHcmFtbWFycz4gcHJvdmlkZXMgUGFyc2U6OlJlY0Rlc2NlbnQgc3R5bGUgcGFyc2luZyB1c2luZyBuYXRpdmUKK1BlcmwgNS4xMCByZWd1bGFyIGV4cHJlc3Npb25zLgorCisKKz1oZWFkMSBMSUNFTkNFIEFORCBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAxOTk3LTIwMDcsIERhbWlhbiBDb253YXkgQzw8IDxEQ09OV0FZQENQQU4ub3JnPiA+Pi4gQWxsIHJpZ2h0cworcmVzZXJ2ZWQuCisKK1RoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgorCisKKz1oZWFkMSBESVNDTEFJTUVSIE9GIFdBUlJBTlRZCisKK0JFQ0FVU0UgVEhJUyBTT0ZUV0FSRSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgU09GVFdBUkUsIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgU09GVFdBUkUgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIKK0VYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFCitFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFIElTIFdJVEgKK1lPVS4gU0hPVUxEIFRIRSBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMCitORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIsIE9SIENPUlJFQ1RJT04uCisKK0lOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBTT0ZUV0FSRSBBUyBQRVJNSVRURUQgQlkgVEhFIEFCT1ZFIExJQ0VOQ0UsIEJFCitMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwsCitPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFCitUSEUgU09GVFdBUkUgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBTT0ZUV0FSRSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKK1NVQ0ggREFNQUdFUy4KZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTU0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsLnBtCkBAIC0wLDAgKzEsMzMyMyBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIC0gRXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGFuIEV4Y2VsIGZpbGUuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMDgsIFRha2Fub3JpIEthd2FpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIDUuMDA4OworCit1c2UgT0xFOjpTdG9yYWdlX0xpdGU7Cit1c2UgSU86OkZpbGU7Cit1c2UgQ29uZmlnOworCit1c2UgQ3J5cHQ6OlJDNDsKK3VzZSBEaWdlc3Q6OlBlcmw6Ok1ENTsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCit1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Oldvcmtib29rOwordXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQ7Cit1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZvbnQ7Cit1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZvcm1hdDsKK3VzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Q2VsbDsKK3VzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdDsKKworbXkgQGFDb2xvciA9ICgKKyAgICAnMDAwMDAwJywgICAgIyAweDAwCisgICAgJ0ZGRkZGRicsICdGRkZGRkYnLCAnRkZGRkZGJywgJ0ZGRkZGRicsCisgICAgJ0ZGRkZGRicsICdGRkZGRkYnLCAnRkZGRkZGJywgJ0ZGRkZGRicsICAgICMgMHgwOAorICAgICdGRkZGRkYnLCAnRkYwMDAwJywgJzAwRkYwMCcsICcwMDAwRkYnLAorICAgICdGRkZGMDAnLCAnRkYwMEZGJywgJzAwRkZGRicsICc4MDAwMDAnLCAgICAjIDB4MTAKKyAgICAnMDA4MDAwJywgJzAwMDA4MCcsICc4MDgwMDAnLCAnODAwMDgwJywKKyAgICAnMDA4MDgwJywgJ0MwQzBDMCcsICc4MDgwODAnLCAnOTk5OUZGJywgICAgIyAweDE4CisgICAgJzk5MzM2NicsICdGRkZGQ0MnLCAnQ0NGRkZGJywgJzY2MDA2NicsCisgICAgJ0ZGODA4MCcsICcwMDY2Q0MnLCAnQ0NDQ0ZGJywgJzAwMDA4MCcsICAgICMgMHgyMAorICAgICdGRjAwRkYnLCAnRkZGRjAwJywgJzAwRkZGRicsICc4MDAwODAnLAorICAgICc4MDAwMDAnLCAnMDA4MDgwJywgJzAwMDBGRicsICcwMENDRkYnLCAgICAjIDB4MjgKKyAgICAnQ0NGRkZGJywgJ0NDRkZDQycsICdGRkZGOTknLCAnOTlDQ0ZGJywKKyAgICAnRkY5OUNDJywgJ0NDOTlGRicsICdGRkNDOTknLCAnMzM2NkZGJywgICAgIyAweDMwCisgICAgJzMzQ0NDQycsICc5OUNDMDAnLCAnRkZDQzAwJywgJ0ZGOTkwMCcsCisgICAgJ0ZGNjYwMCcsICc2NjY2OTknLCAnOTY5Njk2JywgJzAwMzM2NicsICAgICMgMHgzOAorICAgICczMzk5NjYnLCAnMDAzMzAwJywgJzMzMzMwMCcsICc5OTMzMDAnLAorICAgICc5OTMzNjYnLCAnMzMzMzk5JywgJzMzMzMzMycsICdGRkZGRkYnICAgICAjIDB4NDAKKyk7Cit1c2UgY29uc3RhbnQgdmVyRXhjZWw5NSA9PiAweDUwMDsKK3VzZSBjb25zdGFudCB2ZXJFeGNlbDk3ID0+IDB4NjAwOwordXNlIGNvbnN0YW50IHZlckJJRkYyICAgPT4gMHgwMDsKK3VzZSBjb25zdGFudCB2ZXJCSUZGMyAgID0+IDB4MDI7Cit1c2UgY29uc3RhbnQgdmVyQklGRjQgICA9PiAweDA0OwordXNlIGNvbnN0YW50IHZlckJJRkY1ICAgPT4gMHgwODsKK3VzZSBjb25zdGFudCB2ZXJCSUZGOCAgID0+IDB4MTg7CisKK3VzZSBjb25zdGFudCBNU19CSUZGX0NSWVBUT19OT05FID0+IDA7Cit1c2UgY29uc3RhbnQgTVNfQklGRl9DUllQVE9fWE9SICA9PiAxOwordXNlIGNvbnN0YW50IE1TX0JJRkZfQ1JZUFRPX1JDNCAgPT4gMjsKKwordXNlIGNvbnN0YW50IHNpemVvZl9CSUZGXzhfRklMRVBBU1MgPT4gKCA2ICsgMyAqIDE2ICk7CisKK3VzZSBjb25zdGFudCBSRUtFWV9CTE9DSyA9PiAweDQwMDsKKworIyBFcnJvciBjb2RlIGZvciBzb21lIG9mIHRoZSBjb21tb24gcGFyc2luZyBlcnJvcnMuCit1c2UgY29uc3RhbnQgRXJyb3JOb25lICAgICAgICAgID0+IDA7Cit1c2UgY29uc3RhbnQgRXJyb3JOb0ZpbGUgICAgICAgID0+IDE7Cit1c2UgY29uc3RhbnQgRXJyb3JOb0V4Y2VsRGF0YSAgID0+IDI7Cit1c2UgY29uc3RhbnQgRXJyb3JGaWxlRW5jcnlwdGVkID0+IDM7CisKK291ciAlZXJyb3Jfc3RyaW5ncyA9ICgKKyAgICBFcnJvck5vbmUsICAgICAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDAKKyAgICBFcnJvck5vRmlsZSwgICAgICAgICdGaWxlIG5vdCBmb3VuZCcsICAgICAgICAgICAgICAgICAjIDEKKyAgICBFcnJvck5vRXhjZWxEYXRhLCAgICdObyBFeGNlbCBkYXRhIGZvdW5kIGluIGZpbGUnLCAgICAjIDIKKyAgICBFcnJvckZpbGVFbmNyeXB0ZWQsICdGaWxlIGlzIGVuY3J5cHRlZCcsICAgICAgICAgICAgICAjIDMKKworKTsKKworCitvdXIgJVByb2NUYmwgPSAoCisKKyAgICAjRGV2ZWxwZXJzJyBLaXQgUDI5MQorICAgIDB4MTQgICA9PiBcJl9zdWJIZWFkZXIsICAgICAgICAgICAgIyBIZWFkZXIKKyAgICAweDE1ICAgPT4gXCZfc3ViRm9vdGVyLCAgICAgICAgICAgICMgRm9vdGVyCisgICAgMHgxOCAgID0+IFwmX3N1Yk5hbWUsICAgICAgICAgICAgICAjIE5BTUUoPykKKyAgICAweDFBICAgPT4gXCZfc3ViVlBhZ2VCcmVhaywgICAgICAgICMgVmVydGljYWwgUGFnZSBCcmVhaworICAgIDB4MUIgICA9PiBcJl9zdWJIUGFnZUJyZWFrLCAgICAgICAgIyBIb3Jpem9udGFsIFBhZ2UgQnJlYWsKKyAgICAweDIyICAgPT4gXCZfc3ViRmxnMTkwNCwgICAgICAgICAgICMgMTkwNCBGbGFnCisgICAgMHgyNiAgID0+IFwmX3N1Yk1hcmdpbiwgICAgICAgICAgICAjIExlZnQgTWFyZ2luCisgICAgMHgyNyAgID0+IFwmX3N1Yk1hcmdpbiwgICAgICAgICAgICAjIFJpZ2h0IE1hcmdpbgorICAgIDB4MjggICA9PiBcJl9zdWJNYXJnaW4sICAgICAgICAgICAgIyBUb3AgTWFyZ2luCisgICAgMHgyOSAgID0+IFwmX3N1Yk1hcmdpbiwgICAgICAgICAgICAjIEJvdHRvbSBNYXJnaW4KKyAgICAweDJBICAgPT4gXCZfc3ViUHJpbnRIZWFkZXJzLCAgICAgICMgUHJpbnQgSGVhZGVycworICAgIDB4MkIgICA9PiBcJl9zdWJQcmludEdyaWRsaW5lcywgICAgIyBQcmludCBHcmlkbGluZXMKKyAgICAweDNDICAgPT4gXCZfc3ViQ29udGludWUsICAgICAgICAgICMgQ29udGludWUKKyAgICAweDQzICAgPT4gXCZfc3ViWEYsICAgICAgICAgICAgICAgICMgWEYgZm9yIEV4Y2VsIDwgNC4KKyAgICAweDA0NDMgPT4gXCZfc3ViWEYsICAgICAgICAgICAgICAgICMgWEYgZm9yIEV4Y2VsID0gNC4KKworICAgICNEZXZlbHBlcnMnIEtpdCBQMjkyCisgICAgMHg1NSA9PiBcJl9zdWJEZWZDb2xXaWR0aCwgICAgICAgICAjIENvbnNpZGVyCisgICAgMHg1QyA9PiBcJl9zdWJXcml0ZUFjY2VzcywgICAgICAgICAjIFdSSVRFQUNDRVNTCisgICAgMHg3RCA9PiBcJl9zdWJDb2xJbmZvLCAgICAgICAgICAgICAjIENvbGluZm8KKyAgICAweDdFID0+IFwmX3N1YlJLLCAgICAgICAgICAgICAgICAgICMgUksKKyAgICAweDgxID0+IFwmX3N1YldTQk9PTCwgICAgICAgICAgICAgICMgV1NCT09MCisgICAgMHg4MyA9PiBcJl9zdWJIY2VudGVyLCAgICAgICAgICAgICAjIEhDRU5URVIKKyAgICAweDg0ID0+IFwmX3N1YlZjZW50ZXIsICAgICAgICAgICAgICMgVkNFTlRFUgorICAgIDB4ODUgPT4gXCZfc3ViQm91bmRTaGVldCwgICAgICAgICAgIyBCb3VuZFNoZWV0CisKKyAgICAweDkyID0+IFwmX3N1YlBhbGV0dGUsICAgICAgICAgICAgICMgUGFsZXR0ZSwgZmdwCisKKyAgICAweDk5ID0+IFwmX3N1YlN0YW5kYXJkV2lkdGgsICAgICAgICMgU3RhbmRhcmQgQ29sCisKKyAgICAjRGV2ZWxwZXJzJyBLaXQgUDI5MworICAgIDB4QTEgPT4gXCZfc3ViU0VUVVAsICAgICAgICAgICAgICAgIyBTRVRVUAorICAgIDB4QkQgPT4gXCZfc3ViTXVsUkssICAgICAgICAgICAgICAgIyBNVUxSSworICAgIDB4QkUgPT4gXCZfc3ViTXVsQmxhbmssICAgICAgICAgICAgIyBNVUxCTEFOSworICAgIDB4RDYgPT4gXCZfc3ViUlN0cmluZywgICAgICAgICAgICAgIyBSU3RyaW5nCisKKyAgICAjRGV2ZWxwZXJzJyBLaXQgUDI5NAorICAgIDB4RTAgPT4gXCZfc3ViWEYsICAgICAgICAgICAgICAgICAgIyBFeFRlbmRlZCBGb3JtYXQKKyAgICAweEU1ID0+IFwmX3N1Yk1lcmdlQXJlYSwgICAgICAgICAgICMgTWVyZ2VBcmVhIChOb3QgRG9jdW1lbnRlZCkKKyAgICAweEZDID0+IFwmX3N1YlNTVCwgICAgICAgICAgICAgICAgICMgU2hhcmVkIFN0cmluZyBUYWJsZQorICAgIDB4RkQgPT4gXCZfc3ViTGFiZWxTU1QsICAgICAgICAgICAgIyBMYWJlbCBTU1QKKworICAgICNEZXZlbHBlcnMnIEtpdCBQMjk1CisgICAgMHgyMDEgPT4gXCZfc3ViQmxhbmssICAgICAgICAgICAgICAjIEJsYW5rCisKKyAgICAweDIwMiA9PiBcJl9zdWJJbnRlZ2VyLCAgICAgICAgICAgICMgSW50ZWdlcihOb3QgRG9jdW1lbnRlZCkKKyAgICAweDIwMyA9PiBcJl9zdWJOdW1iZXIsICAgICAgICAgICAgICMgTnVtYmVyCisgICAgMHgyMDQgPT4gXCZfc3ViTGFiZWwsICAgICAgICAgICAgICAjIExhYmVsCisgICAgMHgyMDUgPT4gXCZfc3ViQm9vbEVyciwgICAgICAgICAgICAjIEJvb2xFcnIKKyAgICAweDIwNyA9PiBcJl9zdWJTdHJpbmcsICAgICAgICAgICAgICMgU1RSSU5HCisgICAgMHgyMDggPT4gXCZfc3ViUm93LCAgICAgICAgICAgICAgICAjIFJvd0RhdGEKKyAgICAweDIyMSA9PiBcJl9zdWJBcnJheSwgICAgICAgICAgICAgICMgQXJyYXkgKENvbnNpZGVyKQorICAgIDB4MjI1ID0+IFwmX3N1YkRlZmF1bHRSb3dIZWlnaHQsICAgIyBDb25zaWRlcgorCisgICAgMHgzMSAgPT4gXCZfc3ViRm9udCwgICAgICAgICAgICAgICAjIEZvbnQKKyAgICAweDIzMSA9PiBcJl9zdWJGb250LCAgICAgICAgICAgICAgICMgRm9udAorCisgICAgMHgyN0UgPT4gXCZfc3ViUkssICAgICAgICAgICAgICAgICAjIFJLCisgICAgMHg0MUUgPT4gXCZfc3ViRm9ybWF0LCAgICAgICAgICAgICAjIEZvcm1hdAorCisgICAgMHgwNiAgPT4gXCZfc3ViRm9ybXVsYSwgICAgICAgICAgICAjIEZvcm11bGEKKyAgICAweDQwNiA9PiBcJl9zdWJGb3JtdWxhLCAgICAgICAgICAgICMgRm9ybXVsYQorCisgICAgMHgwMDkgPT4gXCZfc3ViQk9GLCAgICAgICAgICAgICAgICAjIEJPRihCSUZGMikKKyAgICAweDIwOSA9PiBcJl9zdWJCT0YsICAgICAgICAgICAgICAgICMgQk9GKEJJRkYzKQorICAgIDB4NDA5ID0+IFwmX3N1YkJPRiwgICAgICAgICAgICAgICAgIyBCT0YoQklGRjQpCisgICAgMHg4MDkgPT4gXCZfc3ViQk9GLCAgICAgICAgICAgICAgICAjIEJPRihCSUZGNS04KQorKTsKKworb3VyICRCSUdFTkRJQU47CitvdXIgJFBSRUZVTkM7CitvdXIgJF9DZWxsSGFuZGxlcjsKK291ciAkX05vdFNldENlbGw7CitvdXIgJF9PYmplY3Q7CitvdXIgJF91c2VfcGVybGlvOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLT5uZXcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBuZXcgeworICAgIG15ICggJGNsYXNzLCAlaFBhcmFtICkgPSBAXzsKKworICAgIGlmICggbm90IGRlZmluZWQgJF91c2VfcGVybGlvICkgeworICAgICAgICBpZiAoICAgZXhpc3RzICRDb25maWd7dXNlcGVybGlvfQorICAgICAgICAgICAgJiYgZGVmaW5lZCAkQ29uZmlne3VzZXBlcmxpb30KKyAgICAgICAgICAgICYmICRDb25maWd7dXNlcGVybGlvfSBlcSAiZGVmaW5lIiApCisgICAgICAgIHsKKyAgICAgICAgICAgICRfdXNlX3BlcmxpbyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkX3VzZV9wZXJsaW8gPSAwOworICAgICAgICAgICAgcmVxdWlyZSBJTzo6U2NhbGFyOworICAgICAgICAgICAgaW1wb3J0IElPOjpTY2FsYXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIENoZWNrIEVORElBTihMaXR0bGU6IEludGVsIGV0Yy4gQklHOiBTcGFyYyBldGMpCisgICAgJEJJR0VORElBTiA9CisgICAgICAgICggZGVmaW5lZCAkaFBhcmFte0VuZGlhbn0gKSA/ICRoUGFyYW17RW5kaWFufQorICAgICAgOiAoIHVucGFjayggIkgwOCIsIHBhY2soICJMIiwgMiApICkgZXEgJzAyMDAwMDAwJyApID8gMAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisKKyAgICAkc2VsZi0+e0dldENvbnRlbnR9ID0gXCZfc3ViR2V0Q29udGVudDsKKworICAgIGlmICggJGhQYXJhbXtFdmVudEhhbmRsZXJzfSApIHsKKyAgICAgICAgJHNlbGYtPlNldEV2ZW50SGFuZGxlcnMoICRoUGFyYW17RXZlbnRIYW5kbGVyc30gKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT5TZXRFdmVudEhhbmRsZXJzKCBcJVByb2NUYmwgKTsKKyAgICB9CisgICAgaWYgKCAkaFBhcmFte0FkZEhhbmRsZXJzfSApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkc0tleSAoIGtleXMoICV7ICRoUGFyYW17QWRkSGFuZGxlcnN9IH0gKSApIHsKKyAgICAgICAgICAgICRzZWxmLT5TZXRFdmVudEhhbmRsZXIoICRzS2V5LCAkaFBhcmFte0FkZEhhbmRsZXJzfS0+eyRzS2V5fSApOworICAgICAgICB9CisgICAgfQorICAgICRfQ2VsbEhhbmRsZXIgPSAkaFBhcmFte0NlbGxIYW5kbGVyfSBpZiAoICRoUGFyYW17Q2VsbEhhbmRsZXJ9ICk7CisgICAgJF9Ob3RTZXRDZWxsICA9ICRoUGFyYW17Tm90U2V0Q2VsbH07CisgICAgJF9PYmplY3QgICAgICA9ICRoUGFyYW17T2JqZWN0fTsKKworCisgICAgaWYgKCBkZWZpbmVkICRoUGFyYW17UGFzc3dvcmR9ICkgeworICAgICAgICAkc2VsZi0+e1Bhc3N3b3JkfSA9ICRoUGFyYW17UGFzc3dvcmR9OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntQYXNzd29yZH0gPSAnVmVsdmV0U3dlYXRzaG9wJzsKKyAgICB9CisKKyAgICAkc2VsZi0+e19lcnJvcl9zdGF0dXN9ID0gRXJyb3JOb25lOworICAgIHJldHVybiAkc2VsZjsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+U2V0RXZlbnRIYW5kbGVyCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgU2V0RXZlbnRIYW5kbGVyIHsKKyAgICBteSAoICRzZWxmLCAka2V5LCAkc3ViX3JlZiApID0gQF87CisgICAgJHNlbGYtPntGdW5jVGJsfS0+eyRrZXl9ID0gJHN1Yl9yZWY7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPlNldEV2ZW50SGFuZGxlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBTZXRFdmVudEhhbmRsZXJzIHsKKyAgICBteSAoICRzZWxmLCAkcmhUYmwgKSA9IEBfOworICAgICRzZWxmLT57RnVuY1RibH0gPSB1bmRlZjsKKyAgICBmb3JlYWNoIG15ICRzS2V5ICgga2V5cyAlJHJoVGJsICkgeworICAgICAgICAkc2VsZi0+e0Z1bmNUYmx9LT57JHNLZXl9ID0gJHJoVGJsLT57JHNLZXl9OworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWNyeXB0aW9uIHJvdXRpbmVzCisjIGJhc2VkIG9uIHNvdXJjZXMgb2YgZ251bWVyaWMgKG1zLWJpZmYuYyBtcy1leGNlbC1yZWFkLmMpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgbWQ1c3RhdGUgeworICAgIG15ICggJG1kNSApID0gQF87CisgICAgbXkgJHMgPSAnJzsKKyAgICBmb3IgKCBteSAkaSA9IDAgOyAkaSA8IDQgOyAkaSsrICkgeworICAgICAgICBteSAkdiA9ICRtZDUtPntfc3RhdGV9WyRpXTsKKyAgICAgICAgJHMgLj0gY2hyKCAkdiAmIDB4ZmYgKTsKKyAgICAgICAgJHMgLj0gY2hyKCAoICR2ID4+IDggKSAmIDB4ZmYgKTsKKyAgICAgICAgJHMgLj0gY2hyKCAoICR2ID4+IDE2ICkgJiAweGZmICk7CisgICAgICAgICRzIC49IGNociggKCAkdiA+PiAyNCApICYgMHhmZiApOworICAgIH0KKworICAgIHJldHVybiAkczsKK30KKworc3ViIE1ha2VLZXkgeworICAgIG15ICggJGJsb2NrLCAka2V5LCAkdmFsQ29udGV4dCApID0gQF87CisKKyAgICBteSAkcHdhcnJheSA9ICJcMCIgeCA2NDsKKworICAgIHN1YnN0ciggJHB3YXJyYXksIDAsIDUgKSA9IHN1YnN0ciggJHZhbENvbnRleHQsIDAsIDUgKTsKKworICAgIHN1YnN0ciggJHB3YXJyYXksIDUsIDEgKSA9IGNociggJGJsb2NrICYgMHhmZiApOworICAgIHN1YnN0ciggJHB3YXJyYXksIDYsIDEgKSA9IGNociggKCAkYmxvY2sgPj4gOCApICYgMHhmZiApOworICAgIHN1YnN0ciggJHB3YXJyYXksIDcsIDEgKSA9IGNociggKCAkYmxvY2sgPj4gMTYgKSAmIDB4ZmYgKTsKKyAgICBzdWJzdHIoICRwd2FycmF5LCA4LCAxICkgPSBjaHIoICggJGJsb2NrID4+IDI0ICkgJiAweGZmICk7CisKKyAgICBzdWJzdHIoICRwd2FycmF5LCA5LCAgMSApID0gIlx4ODAiOworICAgIHN1YnN0ciggJHB3YXJyYXksIDU2LCAxICkgPSAiXHg0OCI7CisKKyAgICBteSAkbWQ1ID0gRGlnZXN0OjpQZXJsOjpNRDUtPm5ldygpOworICAgICRtZDUtPmFkZCggJHB3YXJyYXkgKTsKKworICAgIG15ICRzID0gbWQ1c3RhdGUoICRtZDUgKTsKKworICAgICR7JGtleX0gPSBDcnlwdDo6UkM0LT5uZXcoICRzICk7Cit9CisKK3N1YiBWZXJpZnlQYXNzd29yZCB7CisgICAgbXkgKCAkcGFzc3dvcmQsICRkb2NpZCwgJHNhbHRfZGF0YSwgJGhhc2hlZHNhbHRfZGF0YSwgJHZhbENvbnRleHQgKSA9IEBfOworCisgICAgbXkgJHB3YXJyYXkgPSAiXDAiIHggNjQ7CisgICAgbXkgJGk7CisgICAgbXkgJG1kNSA9IERpZ2VzdDo6UGVybDo6TUQ1LT5uZXcoKTsKKworICAgIGZvciAoICRpID0gMCA7ICRpIDwgbGVuZ3RoKCAkcGFzc3dvcmQgKSA7ICRpKysgKSB7CisgICAgICAgIG15ICRvID0gb3JkKCBzdWJzdHIoICRwYXNzd29yZCwgJGksIDEgKSApOworICAgICAgICBzdWJzdHIoICRwd2FycmF5LCAyICogJGksIDEgKSA9IGNociggJG8gJiAweGZmICk7CisgICAgICAgIHN1YnN0ciggJHB3YXJyYXksIDIgKiAkaSArIDEsIDEgKSA9IGNociggKCAkbyA+PiA4ICkgJiAweGZmICk7CisgICAgfQorICAgIHN1YnN0ciggJHB3YXJyYXksIDIgKiAkaSwgMSApID0gY2hyKCAweDgwICk7CisgICAgc3Vic3RyKCAkcHdhcnJheSwgNTYsIDEgKSA9IGNociggKCAkaSA8PCA0ICkgJiAweGZmICk7CisKKyAgICAkbWQ1LT5hZGQoICRwd2FycmF5ICk7CisKKyAgICBteSAkbWRDb250ZXh0MSA9IG1kNXN0YXRlKCAkbWQ1ICk7CisKKyAgICBteSAkb2Zmc2V0ICAgID0gMDsKKyAgICBteSAka2V5b2Zmc2V0ID0gMDsKKyAgICBteSAkdG9jb3B5ICAgID0gNTsKKworICAgICRtZDUtPnJlc2V0OworCisgICAgd2hpbGUgKCAkb2Zmc2V0ICE9IDE2ICkgeworICAgICAgICBpZiAoICggNjQgLSAkb2Zmc2V0ICkgPCA1ICkgeworICAgICAgICAgICAgJHRvY29weSA9IDY0IC0gJG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHN1YnN0ciggJHB3YXJyYXksICRvZmZzZXQsICR0b2NvcHkgKSA9CisgICAgICAgICAgc3Vic3RyKCAkbWRDb250ZXh0MSwgJGtleW9mZnNldCwgJHRvY29weSApOworCisgICAgICAgICRvZmZzZXQgKz0gJHRvY29weTsKKworICAgICAgICBpZiAoICRvZmZzZXQgPT0gNjQgKSB7CisgICAgICAgICAgICAkbWQ1LT5hZGQoICRwd2FycmF5ICk7CisgICAgICAgICAgICAka2V5b2Zmc2V0ID0gJHRvY29weTsKKyAgICAgICAgICAgICR0b2NvcHkgICAgPSA1IC0gJHRvY29weTsKKyAgICAgICAgICAgICRvZmZzZXQgICAgPSAwOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgICRrZXlvZmZzZXQgPSAwOworICAgICAgICAkdG9jb3B5ICAgID0gNTsKKyAgICAgICAgc3Vic3RyKCAkcHdhcnJheSwgJG9mZnNldCwgMTYgKSA9ICRkb2NpZDsKKyAgICAgICAgJG9mZnNldCArPSAxNjsKKyAgICB9CisKKyAgICBzdWJzdHIoICRwd2FycmF5LCAxNiwgMSApICA9ICJceDgwIjsKKyAgICBzdWJzdHIoICRwd2FycmF5LCAxNywgNDcgKSA9ICJcMCIgeCA0NzsKKyAgICBzdWJzdHIoICRwd2FycmF5LCA1NiwgMSApICA9ICJceDgwIjsKKyAgICBzdWJzdHIoICRwd2FycmF5LCA1NywgMSApICA9ICJceDBhIjsKKworICAgICRtZDUtPmFkZCggJHB3YXJyYXkgKTsKKyAgICAkeyR2YWxDb250ZXh0fSA9IG1kNXN0YXRlKCAkbWQ1ICk7CisKKyAgICBteSAka2V5OworCisgICAgTWFrZUtleSggMCwgXCRrZXksICR7JHZhbENvbnRleHR9ICk7CisKKyAgICBteSAkc2FsdCAgICAgICA9ICRrZXktPlJDNCggJHNhbHRfZGF0YSApOworICAgIG15ICRoYXNoZWRzYWx0ID0gJGtleS0+UkM0KCAkaGFzaGVkc2FsdF9kYXRhICk7CisKKyAgICAkc2FsdCAuPSAiXHg4MCIgLiAiXDAiIHggNDc7CisKKyAgICBzdWJzdHIoICRzYWx0LCA1NiwgMSApID0gIlx4ODAiOworCisgICAgJG1kNS0+cmVzZXQ7CisgICAgJG1kNS0+YWRkKCAkc2FsdCApOworICAgIG15ICRtZENvbnRleHQyID0gbWQ1c3RhdGUoICRtZDUgKTsKKworICAgIHJldHVybiAoICRtZENvbnRleHQyIGVxICRoYXNoZWRzYWx0ICk7Cit9CisKK3N1YiBTa2lwQnl0ZXMgeworICAgIG15ICggJHEsICRzdGFydCwgJGNvdW50ICkgPSBAXzsKKworICAgIG15ICRzY3JhdGNoID0gIlwwIiB4IFJFS0VZX0JMT0NLOworICAgIG15ICRibG9jazsKKworICAgICRibG9jayA9IGludCggKCAkc3RhcnQgKyAkY291bnQgKSAvIFJFS0VZX0JMT0NLICk7CisKKyAgICBpZiAoICRibG9jayAhPSAkcS0+e2Jsb2NrfSApIHsKKyAgICAgICAgTWFrZUtleSggJHEtPntibG9ja30gPSAkYmxvY2ssIFwkcS0+e3JjNF9rZXl9LCAkcS0+e21kNV9jdHh0fSApOworICAgICAgICAkY291bnQgPSAoICRzdGFydCArICRjb3VudCApICUgUkVLRVlfQkxPQ0s7CisgICAgfQorCisgICAgJHEtPntyYzRfa2V5fS0+UkM0KCBzdWJzdHIoICRzY3JhdGNoLCAwLCAkY291bnQgKSApOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBTZXREZWNyeXB0IHsKKyAgICBteSAoICRxLCAkdmVyc2lvbiwgJHBhc3N3b3JkICkgPSBAXzsKKworICAgIGlmICggJHEtPntvcGNvZGV9ICE9IDB4MmYgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICggJHBhc3N3b3JkIGVxICcnICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAjIFRPRE8gb2xkIHZlcnNpb25zIGRlY3J5cHRpb24KKyAgICAjaWYgKHZlcnNpb24gPCBNU19CSUZGX1Y4IHx8IHEtPmRhdGFbMF0gPT0gMCkKKyAgICAjICAgIHJldHVybiBtc19iaWZmX3ByZV9iaWZmOF9xdWVyeV9zZXRfZGVjcnlwdCAocSwgcGFzc3dvcmQpOworCisgICAgaWYgKCAkcS0+e2xlbmd0aH0gIT0gc2l6ZW9mX0JJRkZfOF9GSUxFUEFTUyApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdW5sZXNzICgKKyAgICAgICAgVmVyaWZ5UGFzc3dvcmQoCisgICAgICAgICAgICAkcGFzc3dvcmQsCisgICAgICAgICAgICBzdWJzdHIoICRxLT57ZGF0YX0sIDYsICAxNiApLAorICAgICAgICAgICAgc3Vic3RyKCAkcS0+e2RhdGF9LCAyMiwgMTYgKSwKKyAgICAgICAgICAgIHN1YnN0ciggJHEtPntkYXRhfSwgMzgsIDE2ICksCisgICAgICAgICAgICBcJHEtPnttZDVfY3R4dH0KKyAgICAgICAgKQorICAgICAgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgJHEtPntlbmNyeXB0aW9ufSA9IE1TX0JJRkZfQ1JZUFRPX1JDNDsKKyAgICAkcS0+e2Jsb2NrfSAgICAgID0gLTE7CisKKyAgICAjIFRoZSBmaXJzdCByZWNvcmQgYWZ0ZXIgRklMRVBBU1Mgc2VlbXMgdG8gYmUgdW5lbmNyeXB0ZWQKKyAgICAkcS0+e2RvbnRfZGVjcnlwdF9uZXh0X3JlY29yZH0gPSAxOworCisgICAgIyBQcmV0ZW5kIHRvIGRlY3J5cHQgdGhlIGVudGlyZSBzdHJlYW0gdXAgdGlsbCB0aGlzIHBvaW50LCBpdCB3YXMKKyAgICAjIGVuY3J5cHRlZCwgYnV0IGRvIGl0IGFueXdheSB0byBrZWVwIHRoZSByYzQgc3RhdGUgaW4gc3luYworCisgICAgU2tpcEJ5dGVzKCAkcSwgMCwgJHEtPntzdHJlYW1Qb3N9ICk7CisKKyAgICByZXR1cm4gMTsKK30KKworc3ViIEluaXRTdHJlYW0geworICAgIG15ICggJHN0cmVhbV9kYXRhICkgPSBAXzsKKyAgICBteSAlcTsKKworICAgICRxe29wY29kZX0gPSAwOworICAgICRxe2xlbmd0aH0gPSAwOworICAgICRxe2RhdGF9ICAgPSAnJzsKKworICAgICRxe3N0cmVhbX0gICAgPSAkc3RyZWFtX2RhdGE7ICAgICAgICAgICAgICAjIGRhdGEgc3RyZWFtCisgICAgJHF7c3RyZWFtTGVufSA9IGxlbmd0aCggJHN0cmVhbV9kYXRhICk7ICAgICMgc3RyZWFtIGxlbmd0aAorICAgICRxe3N0cmVhbVBvc30gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmVhbSBwb3NpdGlvbgorCisgICAgJHF7ZW5jcnlwdGlvbn0gICAgICAgICAgICAgICA9IDA7CisgICAgJHF7eG9yX2tleX0gICAgICAgICAgICAgICAgICA9ICcnOworICAgICRxe3JjNF9rZXl9ICAgICAgICAgICAgICAgICAgPSAnJzsKKyAgICAkcXttZDVfY3R4dH0gICAgICAgICAgICAgICAgID0gJyc7CisgICAgJHF7YmxvY2t9ICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgJHF7ZG9udF9kZWNyeXB0X25leHRfcmVjb3JkfSA9IDA7CisKKyAgICByZXR1cm4gXCVxOworfQorCitzdWIgUXVlcnlOZXh0IHsKKyAgICBteSAoICRxICkgPSBAXzsKKworICAgIGlmICggJHEtPntzdHJlYW1Qb3N9ICsgNCA+PSAkcS0+e3N0cmVhbUxlbn0gKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG15ICRkYXRhID0gc3Vic3RyKCAkcS0+e3N0cmVhbX0sICRxLT57c3RyZWFtUG9zfSwgNCApOworCisgICAgKCAkcS0+e29wY29kZX0sICRxLT57bGVuZ3RofSApID0gdW5wYWNrKCAndjInLCAkZGF0YSApOworCisgICAgIyBObyBiaWZmIHJlY29yZCBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gYXJvdW5kIDIwLDAwMC4KKyAgICBpZiAoICRxLT57bGVuZ3RofSA+PSAyMDAwMCApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCAkcS0+e2xlbmd0aH0gPiAwICkgeworICAgICAgICAkcS0+e2RhdGF9ID0gc3Vic3RyKCAkcS0+e3N0cmVhbX0sICRxLT57c3RyZWFtUG9zfSArIDQsICRxLT57bGVuZ3RofSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHEtPntkYXRhfSAgICAgICAgICAgICAgICAgICAgID0gdW5kZWY7CisgICAgICAgICRxLT57ZG9udF9kZWNyeXB0X25leHRfcmVjb3JkfSA9IDE7CisgICAgfQorCisgICAgaWYgKCAkcS0+e2VuY3J5cHRpb259ID09IE1TX0JJRkZfQ1JZUFRPX1JDNCApIHsKKyAgICAgICAgaWYgKCAkcS0+e2RvbnRfZGVjcnlwdF9uZXh0X3JlY29yZH0gKSB7CisgICAgICAgICAgICBTa2lwQnl0ZXMoICRxLCAkcS0+e3N0cmVhbVBvc30sIDQgKyAkcS0+e2xlbmd0aH0gKTsKKyAgICAgICAgICAgICRxLT57ZG9udF9kZWNyeXB0X25leHRfcmVjb3JkfSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBteSAkcG9zICA9ICRxLT57c3RyZWFtUG9zfTsKKyAgICAgICAgICAgIG15ICRkYXRhID0gJHEtPntkYXRhfTsKKyAgICAgICAgICAgIG15ICRsZW4gID0gJHEtPntsZW5ndGh9OworICAgICAgICAgICAgbXkgJHJlcyAgPSAnJzsKKworICAgICAgICAgICAgIyBQcmV0ZW5kIHRvIGRlY3J5cHQgaGVhZGVyLgorICAgICAgICAgICAgU2tpcEJ5dGVzKCAkcSwgJHBvcywgNCApOworICAgICAgICAgICAgJHBvcyArPSA0OworCisgICAgICAgICAgICB3aGlsZSAoICRxLT57YmxvY2t9ICE9IGludCggKCAkcG9zICsgJGxlbiApIC8gUkVLRVlfQkxPQ0sgKSApIHsKKyAgICAgICAgICAgICAgICBteSAkc3RlcCA9IFJFS0VZX0JMT0NLIC0gKCAkcG9zICUgUkVLRVlfQkxPQ0sgKTsKKyAgICAgICAgICAgICAgICAkcmVzIC49ICRxLT57cmM0X2tleX0tPlJDNCggc3Vic3RyKCAkZGF0YSwgMCwgJHN0ZXAgKSApOworICAgICAgICAgICAgICAgICRkYXRhID0gc3Vic3RyKCAkZGF0YSwgJHN0ZXAgKTsKKyAgICAgICAgICAgICAgICAkcG9zICs9ICRzdGVwOworICAgICAgICAgICAgICAgICRsZW4gLT0gJHN0ZXA7CisgICAgICAgICAgICAgICAgTWFrZUtleSggKyskcS0+e2Jsb2NrfSwgXCRxLT57cmM0X2tleX0sICRxLT57bWQ1X2N0eHR9ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRyZXMgLj0gJHEtPntyYzRfa2V5fS0+UkM0KCBzdWJzdHIoICRkYXRhLCAwLCAkbGVuICkgKTsKKyAgICAgICAgICAgICRxLT57ZGF0YX0gPSAkcmVzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2lmICggJHEtPntlbmNyeXB0aW9ufSA9PSBNU19CSUZGX0NSWVBUT19YT1IgKSB7CisKKyAgICAgICAgIyBub3QgaW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2lmICggJHEtPntlbmNyeXB0aW9ufSA9PSBNU19CSUZGX0NSWVBUT19OT05FICkgeworCisgICAgfQorCisgICAgJHEtPntzdHJlYW1Qb3N9ICs9IDQgKyAkcS0+e2xlbmd0aH07CisKKyAgICByZXR1cm4gMTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBQYXJzZSgpCisjCisjIFBhcnNlIHRoZSBFeGNlbCBmaWxlIGFuZCBjb252ZXJ0IGl0IGludG8gYSB0cmVlIG9mIG9iamVjdHMuLgorIworc3ViIHBhcnNlIHsKKworICAgIG15ICggJHNlbGYsICRzb3VyY2UsICRmb3JtYXR0ZXIgKSA9IEBfOworCisgICAgbXkgJHdvcmtib29rID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Oldvcmtib29rLT5uZXcoKTsKKyAgICAkd29ya2Jvb2stPntTaGVldENvdW50fSA9IDA7CisKKyAgICBteSAoICRiaWZmX2RhdGEsICRkYXRhX2xlbmd0aCApID0gJHNlbGYtPl9nZXRfY29udGVudCggJHNvdXJjZSwgJHdvcmtib29rICk7CisgICAgcmV0dXJuIHVuZGVmIGlmIG5vdCAkYmlmZl9kYXRhOworCisgICAgaWYgKCAkZm9ybWF0dGVyICkgeworICAgICAgICAkd29ya2Jvb2stPntGbXRDbGFzc30gPSAkZm9ybWF0dGVyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHdvcmtib29rLT57Rm10Q2xhc3N9ID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdERlZmF1bHQtPm5ldygpOworICAgIH0KKworICAgICMgUGFyc2UgdGhlIEJJRkYgZGF0YS4KKyAgICBteSAkc3RyZWFtID0gSW5pdFN0cmVhbSggJGJpZmZfZGF0YSApOworCisgICAgd2hpbGUgKCBRdWVyeU5leHQoICRzdHJlYW0gKSApIHsKKworICAgICAgICBteSAkcmVjb3JkICAgICAgICA9ICRzdHJlYW0tPntvcGNvZGV9OworICAgICAgICBteSAkcmVjb3JkX2xlbmd0aCA9ICRzdHJlYW0tPntsZW5ndGh9OworCisgICAgICAgIG15ICRyZWNvcmRfaGVhZGVyID0gJHN0cmVhbS0+e2RhdGF9OworCisgICAgICAgICMgSWYgdGhlIGZpbGUgY29udGFpbnMgYSBGSUxFUEFTUyByZWNvcmQgd2UgYXNzdW1lIHRoYXQgaXQgaXMgZW5jcnlwdGVkCisgICAgICAgICMgYW5kIGNhbm5vdCBiZSBwYXJzZWQuCisgICAgICAgIGlmICggJHJlY29yZCA9PSAweDAwMkYgKSB7CisgICAgICAgICAgICB1bmxlc3MgKCBTZXREZWNyeXB0KCAkc3RyZWFtLCAnJywgJHNlbGYtPntQYXNzd29yZH0gKSApIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+e19lcnJvcl9zdGF0dXN9ID0gRXJyb3JGaWxlRW5jcnlwdGVkOworICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICMgU3BlY2lhbCBjYXNlIG9mIGEgZm9ybXVsYSBTdHJpbmcgd2l0aCBubyBzdHJpbmcuCisgICAgICAgIGlmICggICAkd29ya2Jvb2stPntfUHJldlBvc30KKyAgICAgICAgICAgICYmICggZGVmaW5lZCAkc2VsZi0+e0Z1bmNUYmx9LT57JHJlY29yZH0gKQorICAgICAgICAgICAgJiYgKCAkcmVjb3JkICE9IDB4MjA3ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBteSAkaVBvcyA9ICR3b3JrYm9vay0+e19QcmV2UG9zfTsKKyAgICAgICAgICAgICR3b3JrYm9vay0+e19QcmV2UG9zfSA9IHVuZGVmOworCisgICAgICAgICAgICBteSAoICRyb3csICRjb2wsICRmb3JtYXRfaW5kZXggKSA9IEAkaVBvczsKKyAgICAgICAgICAgIF9OZXdDZWxsKAorICAgICAgICAgICAgICAgICR3b3JrYm9vaywgJHJvdywgJGNvbCwKKyAgICAgICAgICAgICAgICBLaW5kICAgICA9PiAnRm9ybXVsYSBTdHJpbmcnLAorICAgICAgICAgICAgICAgIFZhbCAgICAgID0+ICcnLAorICAgICAgICAgICAgICAgIEZvcm1hdE5vID0+ICRmb3JtYXRfaW5kZXgsCisgICAgICAgICAgICAgICAgRm9ybWF0ICAgPT4gJHdvcmtib29rLT57Rm9ybWF0fVskZm9ybWF0X2luZGV4XSwKKyAgICAgICAgICAgICAgICBOdW1lcmljICA9PiAwLAorICAgICAgICAgICAgICAgIENvZGUgICAgID0+IHVuZGVmLAorICAgICAgICAgICAgICAgIEJvb2sgICAgID0+ICR3b3JrYm9vaywKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICAjIElmIHRoZSBCSUZGIHJlY29yZCBtYXRjaGVzIDB4MCowOSB0aGVuIGl0IGlzIGEgQk9GIHJlY29yZC4KKyAgICAgICAgIyBXZSByZXNldCB0aGUgX3NraXBfY2hhcnQgZmxhZyB0byBlbnN1cmUgd2UgY2hlY2sgdGhlIHNoZWV0IHR5cGUuCisgICAgICAgIGlmICggKCAkcmVjb3JkICYgMHhGMEZGICkgPT0gMHgwOSApIHsKKyAgICAgICAgICAgICR3b3JrYm9vay0+e19za2lwX2NoYXJ0fSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGRlZmluZWQgJHNlbGYtPntGdW5jVGJsfS0+eyRyZWNvcmR9ICYmICEkd29ya2Jvb2stPntfc2tpcF9jaGFydH0gKQorICAgICAgICB7CisgICAgICAgICAgICAkc2VsZi0+e0Z1bmNUYmx9LT57JHJlY29yZH0KKyAgICAgICAgICAgICAgLT4oICR3b3JrYm9vaywgJHJlY29yZCwgJHJlY29yZF9sZW5ndGgsICRyZWNvcmRfaGVhZGVyICk7CisgICAgICAgIH0KKworICAgICAgICAkUFJFRlVOQyA9ICRyZWNvcmQgaWYgKCAkcmVjb3JkICE9IDB4M0MgKTsgICAgI05vdCBDb250aW51ZQorCisgICAgICAgIHJldHVybiAkd29ya2Jvb2sgaWYgZGVmaW5lZCAkd29ya2Jvb2stPntfUGFyc2VBYm9ydH07CisgICAgfQorCisgICAgcmV0dXJuICR3b3JrYm9vazsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZ2V0X2NvbnRlbnQoKQorIworIyBHZXQgdGhlIEV4Y2VsIEJJRkYgY29udGVudCBmcm9tIHRoZSBmaWxlIG9yIGZpbGVoYW5kbGUuCisjCitzdWIgX2dldF9jb250ZW50IHsKKworICAgIG15ICggJHNlbGYsICRzb3VyY2UsICR3b3JrYm9vayApID0gQF87CisgICAgbXkgKCAkYmlmZl9kYXRhLCAkZGF0YV9sZW5ndGggKTsKKworICAgICMgUmVzZXQgdGhlIGVycm9yIHN0YXR1cyBpbiBjYXNlIG1ldGhvZCBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCisgICAgJHNlbGYtPntfZXJyb3Jfc3RhdHVzfSA9IEVycm9yTm9uZTsKKworICAgIGlmICggcmVmKCAkc291cmNlICkgZXEgIlNDQUxBUiIgKSB7CisKKyAgICAgICAgIyBTcGVjaWZpZWQgYnkgYSBzY2FsYXIgYnVmZmVyLgorICAgICAgICAoICRiaWZmX2RhdGEsICRkYXRhX2xlbmd0aCApID0gJHNlbGYtPntHZXRDb250ZW50fS0+KCAkc291cmNlICk7CisKKyAgICB9CisgICAgZWxzaWYgKCAoIHJlZiggJHNvdXJjZSApID1+IC9HTE9CLyApIHx8ICggcmVmKCAkc291cmNlICkgZXEgJ0ZoJyApICkgeworCisgICAgICAgICMgRm9yIENHSS5wbSAoTGlnaHQgRmlsZUhhbmRsZSkKKyAgICAgICAgYmlubW9kZSggJHNvdXJjZSApOworICAgICAgICBteSAkc1drOworICAgICAgICBteSAkc0J1ZmYgPSAnJzsKKworICAgICAgICB3aGlsZSAoIHJlYWQoICRzb3VyY2UsICRzV2ssIDQwOTYgKSApIHsKKyAgICAgICAgICAgICRzQnVmZiAuPSAkc1drOworICAgICAgICB9CisKKyAgICAgICAgKCAkYmlmZl9kYXRhLCAkZGF0YV9sZW5ndGggKSA9ICRzZWxmLT57R2V0Q29udGVudH0tPiggXCRzQnVmZiApOworCisgICAgfQorICAgIGVsc2lmICggcmVmKCAkc291cmNlICkgZXEgJ0FSUkFZJyApIHsKKworICAgICAgICAjIFNwZWNpZmllZCBieSBmaWxlIGNvbnRlbnQKKyAgICAgICAgJHdvcmtib29rLT57RmlsZX0gPSB1bmRlZjsKKyAgICAgICAgbXkgJHNEYXRhID0gam9pbiggJycsIEAkc291cmNlICk7CisgICAgICAgICggJGJpZmZfZGF0YSwgJGRhdGFfbGVuZ3RoICkgPSAkc2VsZi0+e0dldENvbnRlbnR9LT4oIFwkc0RhdGEgKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgIyBTcGVjaWZpZWQgYnkgZmlsZW5hbWUgLgorICAgICAgICAkd29ya2Jvb2stPntGaWxlfSA9ICRzb3VyY2U7CisKKyAgICAgICAgaWYgKCAhLWUgJHNvdXJjZSApIHsKKyAgICAgICAgICAgICRzZWxmLT57X2Vycm9yX3N0YXR1c30gPSBFcnJvck5vRmlsZTsKKyAgICAgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICAgICAgfQorCisgICAgICAgICggJGJpZmZfZGF0YSwgJGRhdGFfbGVuZ3RoICkgPSAkc2VsZi0+e0dldENvbnRlbnR9LT4oICRzb3VyY2UgKTsKKyAgICB9CisKKyAgICAjIElmIHRoZSByZWFkIHdhcyBzdWNjZXNzZnVsIHJldHVybiB0aGUgZGF0YS4KKyAgICBpZiAoICRkYXRhX2xlbmd0aCApIHsKKyAgICAgICAgcmV0dXJuICggJGJpZmZfZGF0YSwgJGRhdGFfbGVuZ3RoICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19lcnJvcl9zdGF0dXN9ID0gRXJyb3JOb0V4Y2VsRGF0YTsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJHZXRDb250ZW50IChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkdldENvbnRlbnQgeworICAgIG15ICggJHNGaWxlICkgPSBAXzsKKworICAgIG15ICRvT2wgPSBPTEU6OlN0b3JhZ2VfTGl0ZS0+bmV3KCAkc0ZpbGUgKTsKKyAgICByZXR1cm4gKCB1bmRlZiwgdW5kZWYgKSB1bmxlc3MgKCAkb09sICk7CisgICAgbXkgQGFSZXMgPSAkb09sLT5nZXRQcHNTZWFyY2goCisgICAgICAgIFsKKyAgICAgICAgICAgIE9MRTo6U3RvcmFnZV9MaXRlOjpBc2MyVWNzKCAnQm9vaycgKSwKKyAgICAgICAgICAgIE9MRTo6U3RvcmFnZV9MaXRlOjpBc2MyVWNzKCAnV29ya2Jvb2snICkKKyAgICAgICAgXSwKKyAgICAgICAgMSwgMQorICAgICk7CisgICAgcmV0dXJuICggdW5kZWYsIHVuZGVmICkgaWYgKCAkI2FSZXMgPCAwICk7CisKKyAgICAjSGFjayBmcm9tIEhlcmJlcnQKKyAgICBpZiAoICRhUmVzWzBdLT57RGF0YX0gKSB7CisgICAgICAgIHJldHVybiAoICRhUmVzWzBdLT57RGF0YX0sIGxlbmd0aCggJGFSZXNbMF0tPntEYXRhfSApICk7CisgICAgfQorCisgICAgI1NhbWUgYXMgT0xFOjpTdG9yYWdlX0xpdGUKKyAgICBteSAkb0lvOworCisgICAgIzEuICRzRmlsZSBpcyBSZWYgb2Ygc2NhbGFyCisgICAgaWYgKCByZWYoICRzRmlsZSApIGVxICdTQ0FMQVInICkgeworICAgICAgICBpZiAoICRfdXNlX3BlcmxpbyApIHsKKyAgICAgICAgICAgIG9wZW4gJG9JbywgIjwiLCBcJHNGaWxlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJG9JbyA9IElPOjpTY2FsYXItPm5ldzsKKyAgICAgICAgICAgICRvSW8tPm9wZW4oICRzRmlsZSApOworICAgICAgICB9CisgICAgfQorCisgICAgIzIuICRzRmlsZSBpcyBhIElPOjpIYW5kbGUgb2JqZWN0CisgICAgZWxzaWYgKCBVTklWRVJTQUw6OmlzYSggJHNGaWxlLCAnSU86OkhhbmRsZScgKSApIHsKKyAgICAgICAgJG9JbyA9ICRzRmlsZTsKKyAgICAgICAgYmlubW9kZSggJG9JbyApOworICAgIH0KKworICAgICMzLiAkc0ZpbGUgaXMgYSBzaW1wbGUgZmlsZW5hbWUgc3RyaW5nCisgICAgZWxzaWYgKCAhcmVmKCAkc0ZpbGUgKSApIHsKKyAgICAgICAgJG9JbyA9IElPOjpGaWxlLT5uZXc7CisgICAgICAgICRvSW8tPm9wZW4oICI8JHNGaWxlIiApIHx8IHJldHVybiB1bmRlZjsKKyAgICAgICAgYmlubW9kZSggJG9JbyApOworICAgIH0KKyAgICBteSAkc1drOworICAgIG15ICRzQnVmZiA9ICcnOworCisgICAgd2hpbGUgKCAkb0lvLT5yZWFkKCAkc1drLCA0MDk2ICkgKSB7ICAgICM0XzA5NiBoYXMgbm8gc3BlY2lhbCBtZWFuaW5ncworICAgICAgICAkc0J1ZmYgLj0gJHNXazsKKyAgICB9CisgICAgJG9Jby0+Y2xvc2UoKTsKKworICAgICNOb3QgRXhjZWwgZmlsZSAoc2ltcGxlIG1ldGhvZCkKKyAgICByZXR1cm4gKCB1bmRlZiwgdW5kZWYgKSBpZiAoIHN1YnN0ciggJHNCdWZmLCAwLCAxICkgbmUgIlx4MDkiICk7CisgICAgcmV0dXJuICggJHNCdWZmLCBsZW5ndGgoICRzQnVmZiApICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkJPRiAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBEZXZlbG9wZXJzJyBLaXQgOiBQMzAzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkJPRiB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICBteSAoICRpVmVyLCAkaUR0ICkgPSB1bnBhY2soICJ2MiIsICRzV2sgKTsKKworICAgICNXb3JrYm9vayBHbG9iYWwKKyAgICBpZiAoICRpRHQgPT0gMHgwMDA1ICkgeworICAgICAgICAkb0Jvb2stPntWZXJzaW9ufSA9IHVucGFjayggInYiLCAkc1drICk7CisgICAgICAgICRvQm9vay0+e0JJRkZWZXJzaW9ufSA9CisgICAgICAgICAgKCAkb0Jvb2stPntWZXJzaW9ufSA9PSB2ZXJFeGNlbDk1ICkgPyB2ZXJCSUZGNSA6IHZlckJJRkY4OworICAgICAgICAkb0Jvb2stPntfQ3VyU2hlZXR9ICA9IHVuZGVmOworICAgICAgICAkb0Jvb2stPntfQ3VyU2hlZXRffSA9IC0xOworICAgIH0KKworICAgICNXb3Jrc2hlZXQgb3IgRGlhbG9nc2hlZXQKKyAgICBlbHNpZiAoICRpRHQgIT0gMHgwMDIwICkgeyAgICAjaWYoJGlEdCA9PSAweDAwMTApCisgICAgICAgIGlmICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXRffSApIHsKKyAgICAgICAgICAgICRvQm9vay0+e19DdXJTaGVldH0gPSAkb0Jvb2stPntfQ3VyU2hlZXRffSArIDE7CisgICAgICAgICAgICAkb0Jvb2stPntfQ3VyU2hlZXRffSsrOworCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57U2hlZXRWZXJzaW9ufSwKKyAgICAgICAgICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntTaGVldFR5cGV9LAorICAgICAgICAgICAgICApCisgICAgICAgICAgICAgID0gdW5wYWNrKCAidjIiLCAkc1drICkKKyAgICAgICAgICAgICAgaWYgKCBsZW5ndGgoICRzV2sgKSA+IDQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRvQm9vay0+e0JJRkZWZXJzaW9ufSA9IGludCggJGJPcCAvIDB4MTAwICk7CisgICAgICAgICAgICBpZiAoICAgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPT0gdmVyQklGRjIgKQorICAgICAgICAgICAgICAgIHx8ICggJG9Cb29rLT57QklGRlZlcnNpb259ID09IHZlckJJRkYzICkKKyAgICAgICAgICAgICAgICB8fCAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA9PSB2ZXJCSUZGNCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkb0Jvb2stPntWZXJzaW9ufSAgID0gJG9Cb29rLT57QklGRlZlcnNpb259OworICAgICAgICAgICAgICAgICRvQm9vay0+e19DdXJTaGVldH0gPSAwOworICAgICAgICAgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e1NoZWV0Q291bnR9IF0gPQorICAgICAgICAgICAgICAgICAgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldC0+bmV3KAorICAgICAgICAgICAgICAgICAgICBfTmFtZSAgICA9PiAnJywKKyAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJycsCisgICAgICAgICAgICAgICAgICAgIF9Cb29rICAgID0+ICRvQm9vaywKKyAgICAgICAgICAgICAgICAgICAgX1NoZWV0Tm8gPT4gJG9Cb29rLT57U2hlZXRDb3VudH0sCisgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICRvQm9vay0+e1NoZWV0Q291bnR9Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgIyBTZXQgZmxhZyB0byBpZ25vcmUgYWxsIGNoYXJ0IHJlY29yZHMgdW50aWwgd2UgcmVhY2ggYW5vdGhlciBCT0YuCisgICAgICAgICRvQm9vay0+e19za2lwX2NoYXJ0fSA9IDE7CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJCbGFuayAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzpQMzAzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkJsYW5rIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIG15ICggJGlSLCAkaUMsICRpRiApID0gdW5wYWNrKCAidjMiLCAkc1drICk7CisgICAgX05ld0NlbGwoCisgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgIEtpbmQgICAgID0+ICdCTEFOSycsCisgICAgICAgIFZhbCAgICAgID0+ICcnLAorICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgQ29kZSAgICAgPT4gdW5kZWYsCisgICAgICAgIEJvb2sgICAgID0+ICRvQm9vaywKKyAgICApOworCisgICAgIzIuTWF4Um93LCBNYXhDb2wsIE1pblJvdywgTWluQ29sCisgICAgX1NldERpbWVuc2lvbiggJG9Cb29rLCAkaVIsICRpQywgJGlDICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkludGVnZXIgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgTm90IGluIERLCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkludGVnZXIgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaVIsICRpQywgJGlGLCAkc1R4dCwgJHNEdW0gKTsKKworICAgICggJGlSLCAkaUMsICRpRiwgJHNEdW0sICRzVHh0ICkgPSB1bnBhY2soICJ2M2N2IiwgJHNXayApOworICAgIF9OZXdDZWxsKAorICAgICAgICAkb0Jvb2ssICRpUiwgJGlDLAorICAgICAgICBLaW5kICAgICA9PiAnSU5URUdFUicsCisgICAgICAgIFZhbCAgICAgID0+ICRzVHh0LAorICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgQ29kZSAgICAgPT4gdW5kZWYsCisgICAgICAgIEJvb2sgICAgID0+ICRvQm9vaywKKyAgICApOworCisgICAgIzIuTWF4Um93LCBNYXhDb2wsIE1pblJvdywgTWluQ29sCisgICAgX1NldERpbWVuc2lvbiggJG9Cb29rLCAkaVIsICRpQywgJGlDICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1Yk51bWJlciAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgOiBESzogUDM1NAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJOdW1iZXIgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisKKyAgICBteSAoICRpUiwgJGlDLCAkaUYgKSA9IHVucGFjayggInYzIiwgJHNXayApOworICAgIG15ICRkVmFsID0gX2NvbnZEdmFsKCBzdWJzdHIoICRzV2ssIDYsIDggKSApOworICAgIF9OZXdDZWxsKAorICAgICAgICAkb0Jvb2ssICRpUiwgJGlDLAorICAgICAgICBLaW5kICAgICA9PiAnTnVtYmVyJywKKyAgICAgICAgVmFsICAgICAgPT4gJGRWYWwsCisgICAgICAgIEZvcm1hdE5vID0+ICRpRiwKKyAgICAgICAgRm9ybWF0ICAgPT4gJG9Cb29rLT57Rm9ybWF0fVskaUZdLAorICAgICAgICBOdW1lcmljICA9PiAxLAorICAgICAgICBDb2RlICAgICA9PiB1bmRlZiwKKyAgICAgICAgQm9vayAgICAgPT4gJG9Cb29rLAorICAgICk7CisKKyAgICAjMi5NYXhSb3csIE1heENvbCwgTWluUm93LCBNaW5Db2wKKyAgICBfU2V0RGltZW5zaW9uKCAkb0Jvb2ssICRpUiwgJGlDLCAkaUMgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfY29udkR2YWwgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfY29udkR2YWwgeworICAgIG15ICggJHNXayApID0gQF87CisgICAgcmV0dXJuCisgICAgICB1bnBhY2soICJkIiwKKyAgICAgICAgKCAkQklHRU5ESUFOICkgPyBwYWNrKCAiYzgiLCByZXZlcnNlKCB1bnBhY2soICJjOCIsICRzV2sgKSApICkgOiAkc1drICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YlJTdHJpbmcgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6UDQwNQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJSU3RyaW5nIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIG15ICggJGlSLCAkaUMsICRpRiwgJGlMLCAkc1R4dCApOworICAgICggJGlSLCAkaUMsICRpRiwgJGlMICkgPSB1bnBhY2soICJ2NCIsICRzV2sgKTsKKyAgICAkc1R4dCA9IHN1YnN0ciggJHNXaywgOCwgJGlMICk7CisKKyAgICAjSGFzIFNUUlVOCisgICAgaWYgKCBsZW5ndGgoICRzV2sgKSA+ICggOCArICRpTCApICkgeworICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgICAgICBLaW5kICAgICA9PiAnUlN0cmluZycsCisgICAgICAgICAgICBWYWwgICAgICA9PiAkc1R4dCwKKyAgICAgICAgICAgIEZvcm1hdE5vID0+ICRpRiwKKyAgICAgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgICAgIE51bWVyaWMgID0+IDAsCisgICAgICAgICAgICBDb2RlICAgICA9PiAnX25hdGl2ZV8nLCAgICAgICAgICAgICAgICAgICAgICAgICN1bmRlZiwKKyAgICAgICAgICAgIEJvb2sgICAgID0+ICRvQm9vaywKKyAgICAgICAgICAgIFJpY2ggICAgID0+IHN1YnN0ciggJHNXaywgKCA4ICsgJGlMICkgKyAxICksCisgICAgICAgICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgICAgICBLaW5kICAgICA9PiAnUlN0cmluZycsCisgICAgICAgICAgICBWYWwgICAgICA9PiAkc1R4dCwKKyAgICAgICAgICAgIEZvcm1hdE5vID0+ICRpRiwKKyAgICAgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgICAgIE51bWVyaWMgID0+IDAsCisgICAgICAgICAgICBDb2RlICAgICA9PiAnX25hdGl2ZV8nLAorICAgICAgICAgICAgQm9vayAgICAgPT4gJG9Cb29rLAorICAgICAgICApOworICAgIH0KKworICAgICMyLk1heFJvdywgTWF4Q29sLCBNaW5Sb3csIE1pbkNvbAorICAgIF9TZXREaW1lbnNpb24oICRvQm9vaywgJGlSLCAkaUMsICRpQyApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJCb29sRXJyIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOlAzMDYKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViQm9vbEVyciB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICBteSAoICRpUiwgJGlDLCAkaUYgKSA9IHVucGFjayggInYzIiwgJHNXayApOworICAgIG15ICggJGlWYWwsICRpRmxnICkgPSB1bnBhY2soICJjYyIsIHN1YnN0ciggJHNXaywgNiwgMiApICk7CisgICAgbXkgJHNUeHQgPSBEZWNvZGVCb29sRXJyKCAkaVZhbCwgJGlGbGcgKTsKKworICAgIF9OZXdDZWxsKAorICAgICAgICAkb0Jvb2ssICRpUiwgJGlDLAorICAgICAgICBLaW5kICAgICA9PiAnQm9vbEVycm9yJywKKyAgICAgICAgVmFsICAgICAgPT4gJHNUeHQsCisgICAgICAgIEZvcm1hdE5vID0+ICRpRiwKKyAgICAgICAgRm9ybWF0ICAgPT4gJG9Cb29rLT57Rm9ybWF0fVskaUZdLAorICAgICAgICBOdW1lcmljICA9PiAwLAorICAgICAgICBDb2RlICAgICA9PiB1bmRlZiwKKyAgICAgICAgQm9vayAgICAgPT4gJG9Cb29rLAorICAgICk7CisKKyAgICAjMi5NYXhSb3csIE1heENvbCwgTWluUm93LCBNaW5Db2wKKyAgICBfU2V0RGltZW5zaW9uKCAkb0Jvb2ssICRpUiwgJGlDLCAkaUMgKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3ViUksoKQorIworIyBEZWNvZGUgdGhlIFJLIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdWJSSyB7CisKKyAgICBteSAoICR3b3JrYm9vaywgJGJpZmZfbnVtYmVyLCAkbGVuZ3RoLCAkZGF0YSApID0gQF87CisKKyAgICBteSAoICRyb3csICRjb2wsICRmb3JtYXRfaW5kZXgsICRya19udW1iZXIgKSA9IHVucGFjayggJ3Z2dlYnLCAkZGF0YSApOworCisgICAgbXkgJG51bWJlciA9IF9kZWNvZGVfcmtfbnVtYmVyKCAkcmtfbnVtYmVyICk7CisKKyAgICBfTmV3Q2VsbCgKKyAgICAgICAgJHdvcmtib29rLCAkcm93LCAkY29sLAorICAgICAgICBLaW5kICAgICA9PiAnUksnLAorICAgICAgICBWYWwgICAgICA9PiAkbnVtYmVyLAorICAgICAgICBGb3JtYXRObyA9PiAkZm9ybWF0X2luZGV4LAorICAgICAgICBGb3JtYXQgICA9PiAkd29ya2Jvb2stPntGb3JtYXR9LT5bJGZvcm1hdF9pbmRleF0sCisgICAgICAgIE51bWVyaWMgID0+IDEsCisgICAgICAgIENvZGUgICAgID0+IHVuZGVmLAorICAgICAgICBCb29rICAgICA9PiAkd29ya2Jvb2ssCisgICAgKTsKKworICAgICMgU3RvcmUgdGhlIG1heCBhbmQgbWluIHJvdy9jb2wgdmFsdWVzLgorICAgIF9TZXREaW1lbnNpb24oICR3b3JrYm9vaywgJHJvdywgJGNvbCwgJGNvbCApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJBcnJheSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgIERLOlAyOTcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViQXJyYXkgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaUJSLCAkaUVSLCAkaUJDLCAkaUVDICkgPSB1bnBhY2soICJ2MmMyIiwgJHNXayApOworCit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkZvcm11bGEgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6UDMzNgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJGb3JtdWxhIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIG15ICggJGlSLCAkaUMsICRpRiApID0gdW5wYWNrKCAidjMiLCAkc1drICk7CisKKyAgICBteSAoICRpRmxnICkgPSB1bnBhY2soICJ2Iiwgc3Vic3RyKCAkc1drLCAxMiwgMiApICk7CisgICAgaWYgKCAkaUZsZyA9PSAweEZGRkYgKSB7CisgICAgICAgIG15ICggJGlLaW5kICkgPSB1bnBhY2soICJjIiwgc3Vic3RyKCAkc1drLCA2LCAxICkgKTsKKyAgICAgICAgbXkgKCAkaVZhbCApICA9IHVucGFjayggImMiLCBzdWJzdHIoICRzV2ssIDgsIDEgKSApOworCisgICAgICAgIGlmICggKCAkaUtpbmQgPT0gMSApIG9yICggJGlLaW5kID09IDIgKSApIHsKKyAgICAgICAgICAgIG15ICRzVHh0ID0KKyAgICAgICAgICAgICAgKCAkaUtpbmQgPT0gMSApCisgICAgICAgICAgICAgID8gRGVjb2RlQm9vbEVyciggJGlWYWwsIDAgKQorICAgICAgICAgICAgICA6IERlY29kZUJvb2xFcnIoICRpVmFsLCAxICk7CisgICAgICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICAgICAkb0Jvb2ssICRpUiwgJGlDLAorICAgICAgICAgICAgICAgIEtpbmQgICAgID0+ICdGb3JtdWxhIEJvb2wnLAorICAgICAgICAgICAgICAgIFZhbCAgICAgID0+ICRzVHh0LAorICAgICAgICAgICAgICAgIEZvcm1hdE5vID0+ICRpRiwKKyAgICAgICAgICAgICAgICBGb3JtYXQgICA9PiAkb0Jvb2stPntGb3JtYXR9WyRpRl0sCisgICAgICAgICAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgICAgICAgICBDb2RlICAgICA9PiB1bmRlZiwKKyAgICAgICAgICAgICAgICBCb29rICAgICA9PiAkb0Jvb2ssCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAgICAjIFJlc3VsdCAoUmVzZXJ2ZSBPbmx5KQorICAgICAgICAgICAgJG9Cb29rLT57X1ByZXZQb3N9ID0gWyAkaVIsICRpQywgJGlGIF07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG15ICRkVmFsID0gX2NvbnZEdmFsKCBzdWJzdHIoICRzV2ssIDYsIDggKSApOworICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgICAgICBLaW5kICAgICA9PiAnRm9ybXVsYSBOdW1iZXInLAorICAgICAgICAgICAgVmFsICAgICAgPT4gJGRWYWwsCisgICAgICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgICAgICBGb3JtYXQgICA9PiAkb0Jvb2stPntGb3JtYXR9WyRpRl0sCisgICAgICAgICAgICBOdW1lcmljICA9PiAxLAorICAgICAgICAgICAgQ29kZSAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICBCb29rICAgICA9PiAkb0Jvb2ssCisgICAgICAgICk7CisgICAgfQorCisgICAgIzIuTWF4Um93LCBNYXhDb2wsIE1pblJvdywgTWluQ29sCisgICAgX1NldERpbWVuc2lvbiggJG9Cb29rLCAkaVIsICRpQywgJGlDICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YlN0cmluZyAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgREs6UDQxNAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJTdHJpbmcgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisKKyAgICAjUG9zaXRpb24gKG5vdCBlbm91Z2ggZm9yIEFSUkFZKQorCisgICAgbXkgJGlQb3MgPSAkb0Jvb2stPntfUHJldlBvc307CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoICRpUG9zICk7CisgICAgJG9Cb29rLT57X1ByZXZQb3N9ID0gdW5kZWY7CisgICAgbXkgKCAkaVIsICRpQywgJGlGICkgPSBAJGlQb3M7CisKKyAgICBteSAoICRpTGVuLCAkc1R4dCwgJHNDb2RlICk7CisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPT0gdmVyQklGRjggKSB7CisgICAgICAgIG15ICggJHJhQnVmZiwgJGlMZW4gKSA9IF9jb252QklGRjhTdHJpbmcoICRvQm9vaywgJHNXaywgMSApOworICAgICAgICAkc1R4dCA9ICRyYUJ1ZmYtPlswXTsKKyAgICAgICAgJHNDb2RlID0gKCAkcmFCdWZmLT5bMV0gKSA/ICd1Y3MyJyA6IHVuZGVmOworICAgIH0KKyAgICBlbHNpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA9PSB2ZXJCSUZGNSApIHsKKyAgICAgICAgJHNDb2RlID0gJ19uYXRpdmVfJzsKKyAgICAgICAgJGlMZW4gID0gdW5wYWNrKCAidiIsICRzV2sgKTsKKyAgICAgICAgJHNUeHQgID0gc3Vic3RyKCAkc1drLCAyLCAkaUxlbiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNDb2RlID0gJ19uYXRpdmVfJzsKKyAgICAgICAgJGlMZW4gID0gdW5wYWNrKCAiYyIsICRzV2sgKTsKKyAgICAgICAgJHNUeHQgID0gc3Vic3RyKCAkc1drLCAxLCAkaUxlbiApOworICAgIH0KKyAgICBfTmV3Q2VsbCgKKyAgICAgICAgJG9Cb29rLCAkaVIsICRpQywKKyAgICAgICAgS2luZCAgICAgPT4gJ1N0cmluZycsCisgICAgICAgIFZhbCAgICAgID0+ICRzVHh0LAorICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgQ29kZSAgICAgPT4gJHNDb2RlLAorICAgICAgICBCb29rICAgICA9PiAkb0Jvb2ssCisgICAgKTsKKworICAgICMyLk1heFJvdywgTWF4Q29sLCBNaW5Sb3csIE1pbkNvbAorICAgIF9TZXREaW1lbnNpb24oICRvQm9vaywgJGlSLCAkaUMsICRpQyApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJMYWJlbCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgIERLOlAzNDQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViTGFiZWwgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaVIsICRpQywgJGlGICkgPSB1bnBhY2soICJ2MyIsICRzV2sgKTsKKyAgICBteSAoICRzTGJsLCAkc0NvZGUgKTsKKworICAgICNCSUZGOAorICAgIGlmICggJG9Cb29rLT57QklGRlZlcnNpb259ID49IHZlckJJRkY4ICkgeworICAgICAgICBteSAoICRyYUJ1ZmYsICRpTGVuLCAkaVN0UG9zLCAkaUxlblMgKSA9CisgICAgICAgICAgX2NvbnZCSUZGOFN0cmluZyggJG9Cb29rLCBzdWJzdHIoICRzV2ssIDYgKSwgMSApOworICAgICAgICAkc0xibCA9ICRyYUJ1ZmYtPlswXTsKKyAgICAgICAgJHNDb2RlID0gKCAkcmFCdWZmLT5bMV0gKSA/ICd1Y3MyJyA6IHVuZGVmOworICAgIH0KKworICAgICNCZWZvcmUgQklGRjgKKyAgICBlbHNlIHsKKyAgICAgICAgJHNMYmwgPSBzdWJzdHIoICRzV2ssIDggKTsKKyAgICAgICAgJHNDb2RlID0gJ19uYXRpdmVfJzsKKyAgICB9CisgICAgX05ld0NlbGwoCisgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgIEtpbmQgICAgID0+ICdMYWJlbCcsCisgICAgICAgIFZhbCAgICAgID0+ICRzTGJsLAorICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgQ29kZSAgICAgPT4gJHNDb2RlLAorICAgICAgICBCb29rICAgICA9PiAkb0Jvb2ssCisgICAgKTsKKworICAgICMyLk1heFJvdywgTWF4Q29sLCBNaW5Sb3csIE1pbkNvbAorICAgIF9TZXREaW1lbnNpb24oICRvQm9vaywgJGlSLCAkaUMsICRpQyApOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdWJNdWxSSygpCisjCisjIERlY29kZSB0aGUgTXVsdGlwbGUgUksgQklGRiByZWNvcmQuCisjCitzdWIgX3N1Yk11bFJLIHsKKworICAgIG15ICggJHdvcmtib29rLCAkYmlmZl9udW1iZXIsICRsZW5ndGgsICRkYXRhICkgPSBAXzsKKworICAgICMgSk1OOiBJIGRvbid0IGtub3cgd2h5IHRoaXMgaXMgaGVyZS4KKyAgICByZXR1cm4gaWYgJHdvcmtib29rLT57U2hlZXRDb3VudH0gPD0gMDsKKworICAgIG15ICggJHJvdywgJGZpcnN0X2NvbCApID0gdW5wYWNrKCAidjIiLCAkZGF0YSApOworICAgIG15ICRsYXN0X2NvbCA9IHVucGFjayggInYiLCBzdWJzdHIoICRkYXRhLCBsZW5ndGgoICRkYXRhICkgLSAyLCAyICkgKTsKKworICAgICMgSXRlcmF0ZSBvdmVyIHRoZSBSSyBhcnJheSBhbmQgZGVjb2RlIHRoZSBkYXRhLgorICAgIG15ICRwb3MgPSA0OworICAgIGZvciBteSAkY29sICggJGZpcnN0X2NvbCAuLiAkbGFzdF9jb2wgKSB7CisKKyAgICAgICAgbXkgJGRhdGEgPSBzdWJzdHIoICRkYXRhLCAkcG9zLCA2ICk7CisgICAgICAgIG15ICggJGZvcm1hdF9pbmRleCwgJHJrX251bWJlciApID0gdW5wYWNrICd2VicsICRkYXRhOworICAgICAgICBteSAkbnVtYmVyID0gX2RlY29kZV9ya19udW1iZXIoICRya19udW1iZXIgKTsKKworICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICR3b3JrYm9vaywgJHJvdywgJGNvbCwKKyAgICAgICAgICAgIEtpbmQgICAgID0+ICdNdWxSSycsCisgICAgICAgICAgICBWYWwgICAgICA9PiAkbnVtYmVyLAorICAgICAgICAgICAgRm9ybWF0Tm8gPT4gJGZvcm1hdF9pbmRleCwKKyAgICAgICAgICAgIEZvcm1hdCAgID0+ICR3b3JrYm9vay0+e0Zvcm1hdH0tPlskZm9ybWF0X2luZGV4XSwKKyAgICAgICAgICAgIE51bWVyaWMgID0+IDEsCisgICAgICAgICAgICBDb2RlICAgICA9PiB1bmRlZiwKKyAgICAgICAgICAgIEJvb2sgICAgID0+ICR3b3JrYm9vaywKKyAgICAgICAgKTsKKyAgICAgICAgJHBvcyArPSA2OworICAgIH0KKworICAgICMgU3RvcmUgdGhlIG1heCBhbmQgbWluIHJvdy9jb2wgdmFsdWVzLgorICAgIF9TZXREaW1lbnNpb24oICR3b3JrYm9vaywgJHJvdywgJGZpcnN0X2NvbCwgJGxhc3RfY29sICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1Yk11bEJsYW5rIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOlAzNDkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViTXVsQmxhbmsgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaVIsICRpU2MgKSA9IHVucGFjayggInYyIiwgJHNXayApOworICAgIG15ICRpRWMgPSB1bnBhY2soICJ2Iiwgc3Vic3RyKCAkc1drLCBsZW5ndGgoICRzV2sgKSAtIDIsIDIgKSApOworICAgIG15ICRpUG9zID0gNDsKKyAgICBmb3IgKCBteSAkaUMgPSAkaVNjIDsgJGlDIDw9ICRpRWMgOyAkaUMrKyApIHsKKyAgICAgICAgbXkgJGlGID0gdW5wYWNrKCAndicsIHN1YnN0ciggJHNXaywgJGlQb3MsIDIgKSApOworICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgICAgICBLaW5kICAgICA9PiAnTXVsQmxhbmsnLAorICAgICAgICAgICAgVmFsICAgICAgPT4gJycsCisgICAgICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgICAgICBGb3JtYXQgICA9PiAkb0Jvb2stPntGb3JtYXR9WyRpRl0sCisgICAgICAgICAgICBOdW1lcmljICA9PiAwLAorICAgICAgICAgICAgQ29kZSAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICBCb29rICAgICA9PiAkb0Jvb2ssCisgICAgICAgICk7CisgICAgICAgICRpUG9zICs9IDI7CisgICAgfQorCisgICAgIzIuTWF4Um93LCBNYXhDb2wsIE1pblJvdywgTWluQ29sCisgICAgX1NldERpbWVuc2lvbiggJG9Cb29rLCAkaVIsICRpU2MsICRpRWMgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViTGFiZWxTU1QgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IFAzNDUKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViTGFiZWxTU1QgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaVIsICRpQywgJGlGLCAkaUlkeCApID0gdW5wYWNrKCAndjNWJywgJHNXayApOworCisgICAgX05ld0NlbGwoCisgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgIEtpbmQgICAgID0+ICdQYWNrZWRJZHgnLAorICAgICAgICBWYWwgICAgICA9PiAkb0Jvb2stPntQa2dTdHJ9WyRpSWR4XS0+e1RleHR9LAorICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgQ29kZSAgICAgPT4gKCAkb0Jvb2stPntQa2dTdHJ9WyRpSWR4XS0+e1VuaWNvZGV9ICkgPyAndWNzMicgOiB1bmRlZiwKKyAgICAgICAgQm9vayAgICAgPT4gJG9Cb29rLAorICAgICAgICBSaWNoICAgICA9PiAkb0Jvb2stPntQa2dTdHJ9WyRpSWR4XS0+e1JpY2h9LAorICAgICk7CisKKyAgICAjMi5NYXhSb3csIE1heENvbCwgTWluUm93LCBNaW5Db2wKKyAgICBfU2V0RGltZW5zaW9uKCAkb0Jvb2ssICRpUiwgJGlDLCAkaUMgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViRmxnMTkwNCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzpQMjk2CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkZsZzE5MDQgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgJG9Cb29rLT57RmxnMTkwNH0gPSB1bnBhY2soICJ2IiwgJHNXayApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJSb3cgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6UDQwMworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJSb3cgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgIzAuIEdldCBXb3Jrc2hlZXQgaW5mbyAoTWF4Um93LCBNYXhDb2wsIE1pblJvdywgTWluQ29sKQorICAgIG15ICggJGlSLCAkaVNjLCAkaUVjLCAkaUhnaHQsICR1bmRlZjEsICR1bmRlZjIsICRpR3IsICRpWGYgKSA9CisgICAgICB1bnBhY2soICJ2OCIsICRzV2sgKTsKKyAgICAkaUVjLS07CisKKyAgICAjIFRPRE8uIHdlIG5lZWQgdG8gaGFuZGxlIGhpZGRlbiByb3dzOgorICAgICMgJGlHciAmIDB4MjAKKyAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntSb3dIZWlnaHR9WyRpUl0gPSAkaUhnaHQgLyAyMDsKKworICAgICMyLk1heFJvdywgTWF4Q29sLCBNaW5Sb3csIE1pbkNvbAorICAgIF9TZXREaW1lbnNpb24oICRvQm9vaywgJGlSLCAkaVNjLCAkaUVjICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX1NldERpbWVuc2lvbiAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9TZXREaW1lbnNpb24geworICAgIG15ICggJG9Cb29rLCAkaVIsICRpU2MsICRpRWMgKSA9IEBfOworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e19DdXJTaGVldH0gKTsKKworICAgICMyLk1heFJvdywgTWF4Q29sLCBNaW5Sb3csIE1pbkNvbAorICAgICMyLjEgTWluUm93CisgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57TWluUm93fSA9ICRpUgorICAgICAgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntNaW5Sb3d9ICkKKyAgICAgIGFuZCAoICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01pblJvd30gPD0gJGlSICk7CisKKyAgICAjMi4yIE1heFJvdworICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01heFJvd30gPSAkaVIKKyAgICAgIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57TWF4Um93fSApCisgICAgICBhbmQgKCAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntNYXhSb3d9ID4gJGlSICk7CisKKyAgICAjMi4zIE1pbkNvbAorICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01pbkNvbH0gPSAkaVNjCisgICAgICB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01pbkNvbH0gKQorICAgICAgYW5kICggJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57TWluQ29sfSA8PSAkaVNjICk7CisKKyAgICAjMi40IE1heENvbAorICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01heENvbH0gPSAkaUVjCisgICAgICB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01heENvbH0gKQorICAgICAgYW5kICggJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57TWF4Q29sfSA+ICRpRWMgKTsKKworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJEZWZhdWx0Um93SGVpZ2h0IChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpICAgIERLOiBQMzE4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkRlZmF1bHRSb3dIZWlnaHQgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgIzEuIFJvd0hlaWdodAorICAgIG15ICggJGlEdW0sICRpSGdodCApID0gdW5wYWNrKCAidjIiLCAkc1drICk7CisgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57RGVmUm93SGVpZ2h0fSA9ICRpSGdodCAvIDIwOworCit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YlN0YW5kYXJkV2lkdGgoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgICBESzpQNDEzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YlN0YW5kYXJkV2lkdGggeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgJGlXID0gdW5wYWNrKCAidiIsICRzV2sgKTsKKyAgICAkb0Jvb2stPntTdGFuZGFyZFdpZHRofSA9IF9jb252ZXJ0X2NvbF93aWR0aCggJG9Cb29rLCAkaVcgKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3ViRGVmQ29sV2lkdGgoKQorIworIyBSZWFkIHRoZSBERUZDT0xXSURUSCBCaWZmIHJlY29yZC4gVGhpcyBnaXZlcyB0aGUgd2lkdGggaW4gdGVybXMgb2YgY2hhcnMKKyMgYW5kIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB3aWR0aCBpbiB0aGUgQ09MSU5GTyByZWNvcmQuCisjCitzdWIgX3N1YkRlZkNvbFdpZHRoIHsKKworICAgIG15ICggJHNlbGYsICRyZWNvcmQsICRsZW5ndGgsICRkYXRhICkgPSBAXzsKKworICAgIG15ICR3aWR0aCA9IHVucGFjayAndicsICRkYXRhOworCisgICAgIyBBZGp1c3RtZW50IGZvciBkZWZhdWx0IEFyaWFsIDEwIHdpZHRoLgorICAgICR3aWR0aCA9IDguNDMgaWYgJHdpZHRoID09IDg7CisKKyAgICAkc2VsZi0+e1dvcmtzaGVldH0tPlsgJHNlbGYtPntfQ3VyU2hlZXR9IF0tPntEZWZDb2xXaWR0aH0gPSAkd2lkdGg7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2NvbnZlcnRfY29sX3dpZHRoKCkKKyMKKyMgQ29udmVydHMgZnJvbSB0aGUgaW50ZXJuYWwgRXhjZWwgY29sdW1uIHdpZHRoIHVuaXRzIHRvIHVzZXIgdW5pdHMgc2VlbiBpbiB0aGUKKyMgaW50ZXJmYWNlLiBJdCBpcyBmaXJzdCBuZWNlc3NhcnkgdG8gY29udmVydCB0aGUgaW50ZXJuYWwgd2lkdGggdG8gcGl4ZWxzIGFuZAorIyB0aGVuIHRvIHVzZXIgdW5pdHMuIFRoZSBjb252ZXJzaW9uIGlzIHNwZWNpZmljIHRvIGEgZGVmYXVsdCBmb250IG9mIEFyaWFsIDEwLgorIyBUT0RPLCB0aGUgY29udmVyc2lvbiBzaG91bGQgYmUgZXh0ZW5kZWQgdG8gb3RoZXIgZm9udHMgYW5kIHNpemVzLgorIworc3ViIF9jb252ZXJ0X2NvbF93aWR0aCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkZXhjZWxfd2lkdGggPSBzaGlmdDsKKworICAgICMgQ29udmVydCBmcm9tIEV4Y2VsIHVuaXRzIHRvIHBpeGVscyAocm91bmRlZCB1cCkuCisgICAgbXkgJHBpeGVscyA9IGludCggMC41ICsgJGV4Y2VsX3dpZHRoICogNyAvIDI1NiApOworCisgICAgIyBDb252ZXJ0IGZyb20gcGl4ZWxzIHRvIHVzZXIgdW5pdHMuCisgICAgIyBUaGUgY29udmVyc2lvbiBpcyBkaWZmZXJlbnQgZm9yIGNvbHVtbnMgPD0gMSB1c2VyIHVuaXQgKDEyIHBpeGVscykuCisgICAgbXkgJHVzZXJfd2lkdGg7CisgICAgaWYgKCAkcGl4ZWxzIDw9IDEyICkgeworICAgICAgICAkdXNlcl93aWR0aCA9ICRwaXhlbHMgLyAxMjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICR1c2VyX3dpZHRoID0gKCAkcGl4ZWxzIC0gNSApIC8gNzsKKyAgICB9CisKKyAgICAjIFJvdW5kIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuCisgICAgJHVzZXJfd2lkdGggPSBpbnQoICR1c2VyX3dpZHRoICogMTAwICsgMC41ICkgLyAxMDA7CisKKyAgICByZXR1cm4gJHVzZXJfd2lkdGg7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkNvbEluZm8gKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6UDMwOQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJDb2xJbmZvIHsKKworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fTsKKworICAgIG15ICggJGlTYywgJGlFYywgJGlXLCAkaVhGLCAkaUdyICkgPSB1bnBhY2soICJ2NSIsICRzV2sgKTsKKworICAgIGZvciAoIG15ICRpID0gJGlTYyA7ICRpIDw9ICRpRWMgOyAkaSsrICkgeworCisgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e0NvbFdpZHRofVskaV0gPQorICAgICAgICAgIF9jb252ZXJ0X2NvbF93aWR0aCggJG9Cb29rLCAkaVcgKTsKKworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntDb2xGbXROb31bJGldID0gJGlYRjsKKworICAgICAgICAjIFRPRE8uIHdlIG5lZWQgdG8gaGFuZGxlIGhpZGRlbiBjb2xzOiAkaUdyICYgMHgwMS4KKyAgICB9Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YlNTVCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzpQNDEzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YlNTVCB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICBfc3ViU3RyV2soICRvQm9vaywgc3Vic3RyKCAkc1drLCA4ICkgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViQ29udGludWUgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgICAgREs6UDMxMQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJDb250aW51ZSB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKworICAgICNpZihkZWZpbmVkICRzZWxmLT57RnVuY1RibH0tPnskYk9wfSkgeworICAgICMgICAgJHNlbGYtPntGdW5jVGJsfS0+eyRQUkVGVU5DfS0+KCRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2spOworICAgICN9CisKKyAgICBfc3ViU3RyV2soICRvQm9vaywgJHNXaywgMSApIGlmICggJFBSRUZVTkMgPT0gMHhGQyApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJXcml0ZUFjY2VzcyAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzpQNDUxCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YldyaXRlQWNjZXNzIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIHJldHVybiBpZiAoIGRlZmluZWQgJG9Cb29rLT57X0F1dGhvcn0gKTsKKworICAgICNCSUZGOAorICAgIGlmICggJG9Cb29rLT57QklGRlZlcnNpb259ID49IHZlckJJRkY4ICkgeworICAgICAgICAkb0Jvb2stPntBdXRob3J9ID0gX2NvbnZCSUZGOFN0cmluZyggJG9Cb29rLCAkc1drICk7CisgICAgfQorCisgICAgI0JlZm9yZSBCSUZGOAorICAgIGVsc2UgeworICAgICAgICBteSAoICRpTGVuICkgPSB1bnBhY2soICJjIiwgJHNXayApOworICAgICAgICAkb0Jvb2stPntBdXRob3J9ID0KKyAgICAgICAgICAkb0Jvb2stPntGbXRDbGFzc30tPlRleHRGbXQoIHN1YnN0ciggJHNXaywgMSwgJGlMZW4gKSwgJ19uYXRpdmVfJyApOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfY29udkJJRkY4U3RyaW5nIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX2NvbnZCSUZGOFN0cmluZyB7CisgICAgbXkgKCAkb0Jvb2ssICRzV2ssICRpQ252RmxnICkgPSBAXzsKKyAgICBteSAoICRpTGVuLCAkaUZsZyApID0gdW5wYWNrKCAidmMiLCAkc1drICk7CisgICAgbXkgKCAkaUhpZ2gsICRpRXh0LCAkaVJpY2ggKSA9ICggJGlGbGcgJiAweDAxLCAkaUZsZyAmIDB4MDQsICRpRmxnICYgMHgwOCApOworICAgIG15ICggJGlTdFBvcywgJGlFeHRDbnQsICRpUmljaENudCwgJHNTdHIgKTsKKworICAgICMyLiBSaWNoIGFuZCBFeHQKKyAgICBpZiAoICRpUmljaCAmJiAkaUV4dCApIHsKKyAgICAgICAgJGlTdFBvcyA9IDk7CisgICAgICAgICggJGlSaWNoQ250LCAkaUV4dENudCApID0gdW5wYWNrKCAndlYnLCBzdWJzdHIoICRzV2ssIDMsIDYgKSApOworICAgIH0KKyAgICBlbHNpZiAoICRpUmljaCApIHsgICAgI09ubHkgUmljaAorICAgICAgICAkaVN0UG9zICAgPSA1OworICAgICAgICAkaVJpY2hDbnQgPSB1bnBhY2soICd2Jywgc3Vic3RyKCAkc1drLCAzLCAyICkgKTsKKyAgICAgICAgJGlFeHRDbnQgID0gMDsKKyAgICB9CisgICAgZWxzaWYgKCAkaUV4dCApIHsgICAgICNPbmx5IEV4dAorICAgICAgICAkaVN0UG9zICAgPSA3OworICAgICAgICAkaVJpY2hDbnQgPSAwOworICAgICAgICAkaUV4dENudCAgPSB1bnBhY2soICdWJywgc3Vic3RyKCAkc1drLCAzLCA0ICkgKTsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICNOb3RoaW5nIFNwZWNpYWwKKyAgICAgICAgJGlTdFBvcyAgID0gMzsKKyAgICAgICAgJGlFeHRDbnQgID0gMDsKKyAgICAgICAgJGlSaWNoQ250ID0gMDsKKyAgICB9CisKKyAgICAjMy5HZXQgU3RyaW5nCisgICAgaWYgKCAkaUhpZ2ggKSB7ICAgICAgICNDb21wcmVzc2VkCisgICAgICAgICRpTGVuICo9IDI7CisgICAgICAgICRzU3RyID0gc3Vic3RyKCAkc1drLCAkaVN0UG9zLCAkaUxlbiApOworICAgICAgICBfU3dhcEZvclVuaWNvZGUoIFwkc1N0ciApOworICAgICAgICAkc1N0ciA9ICRvQm9vay0+e0ZtdENsYXNzfS0+VGV4dEZtdCggJHNTdHIsICd1Y3MyJyApCisgICAgICAgICAgdW5sZXNzICggJGlDbnZGbGcgKTsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICNOb3QgQ29tcHJlc3NlZAorICAgICAgICAkc1N0ciA9IHN1YnN0ciggJHNXaywgJGlTdFBvcywgJGlMZW4gKTsKKyAgICAgICAgJHNTdHIgPSAkb0Jvb2stPntGbXRDbGFzc30tPlRleHRGbXQoICRzU3RyLCB1bmRlZiApIHVubGVzcyAoICRpQ252RmxnICk7CisgICAgfQorCisgICAgIzQuIHJldHVybgorICAgIGlmICggd2FudGFycmF5ICkgeworCisgICAgICAgICM0LjEgR2V0IFJpY2ggYW5kIEV4dAorICAgICAgICBpZiAoIGxlbmd0aCggJHNXayApIDwgJGlTdFBvcyArICRpTGVuICsgJGlSaWNoQ250ICogNCArICRpRXh0Q250ICkgeworICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBbIHVuZGVmLCAkaUhpZ2gsIHVuZGVmLCB1bmRlZiBdLAorICAgICAgICAgICAgICAgICRpU3RQb3MgKyAkaUxlbiArICRpUmljaENudCAqIDQgKyAkaUV4dENudCwKKyAgICAgICAgICAgICAgICAkaVN0UG9zLCAkaUxlbgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAkc1N0ciwKKyAgICAgICAgICAgICAgICAgICAgJGlIaWdoLAorICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRzV2ssICRpU3RQb3MgKyAkaUxlbiwgJGlSaWNoQ250ICogNCApLAorICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRzV2ssICRpU3RQb3MgKyAkaUxlbiArICRpUmljaENudCAqIDQsICRpRXh0Q250ICkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICRpU3RQb3MgKyAkaUxlbiArICRpUmljaENudCAqIDQgKyAkaUV4dENudCwKKyAgICAgICAgICAgICAgICAkaVN0UG9zLCAkaUxlbgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuICRzU3RyOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViWEYgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgICAgIERLOlA0NTMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViWEYgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisKKyAgICBteSAoICRpRm50LCAkaUlkeCApOworICAgIG15ICgKKyAgICAgICAgJGlMb2NrLCAgICAkaUhpZGRlbiwgJGlTdHlsZSwgICRpMTIzLCAgICRpQWxILCAgICAkaVdyYXAsCisgICAgICAgICRpQWxWLCAgICAgJGlKdXN0TCwgICRpUm90YXRlLCAkaUluZCwgICAkaVNocmluaywgJGlNZXJnZSwKKyAgICAgICAgJGlSZWFkRGlyLCAkaUJkckQsICAgJGlCZHJTTCwgICRpQmRyU1IsICRpQmRyU1QsICAkaUJkclNCLAorICAgICAgICAkaUJkclNELCAgICRpQmRyQ0wsICAkaUJkckNSLCAgJGlCZHJDVCwgJGlCZHJDQiwgICRpQmRyQ0QsCisgICAgICAgICRpRmlsbFAsICAgJGlGaWxsQ0YsICRpRmlsbENCCisgICAgKTsKKworCisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPT0gdmVyQklGRjQgKSB7CisKKyAgICAgICAgIyBNaW5pbWFsIHN1cHBvcnQgZm9yIEV4Y2VsIDQuIFdlIGp1c3QgZ2V0IHRoZSBmb250IGFuZCBmb3JtYXQgaW5kaWNlcworICAgICAgICAjIHNvIHRoYXQgdGhlIGNlbGwgZGF0YSB2YWx1ZSBjYW4gYmUgZm9ybWF0dGVkLgorICAgICAgICAoICRpRm50LCAkaUlkeCwgKSA9IHVucGFjayggIkNDIiwgJHNXayApOworICAgIH0KKyAgICBlbHNpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA9PSB2ZXJCSUZGOCApIHsKKyAgICAgICAgbXkgKCAkaUdlbiwgJGlBbGlnbiwgJGlHZW4yLCAkaUJkcjEsICRpQmRyMiwgJGlCZHIzLCAkaVB0biApOworCisgICAgICAgICggJGlGbnQsICRpSWR4LCAkaUdlbiwgJGlBbGlnbiwgJGlHZW4yLCAkaUJkcjEsICRpQmRyMiwgJGlCZHIzLCAkaVB0biApCisgICAgICAgICAgPSB1bnBhY2soICJ2N1Z2IiwgJHNXayApOworICAgICAgICAkaUxvY2sgICA9ICggJGlHZW4gJiAweDAxICkgICA/IDEgOiAwOworICAgICAgICAkaUhpZGRlbiA9ICggJGlHZW4gJiAweDAyICkgICA/IDEgOiAwOworICAgICAgICAkaVN0eWxlICA9ICggJGlHZW4gJiAweDA0ICkgICA/IDEgOiAwOworICAgICAgICAkaTEyMyAgICA9ICggJGlHZW4gJiAweDA4ICkgICA/IDEgOiAwOworICAgICAgICAkaUFsSCAgICA9ICggJGlBbGlnbiAmIDB4MDcgKTsKKyAgICAgICAgJGlXcmFwICAgPSAoICRpQWxpZ24gJiAweDA4ICkgPyAxIDogMDsKKyAgICAgICAgJGlBbFYgICAgPSAoICRpQWxpZ24gJiAweDcwICkgLyAweDEwOworICAgICAgICAkaUp1c3RMICA9ICggJGlBbGlnbiAmIDB4ODAgKSA/IDEgOiAwOworCisgICAgICAgICRpUm90YXRlID0gKCAoICRpQWxpZ24gJiAweEZGMDAgKSAvIDB4MTAwICkgJiAweDAwRkY7CisgICAgICAgICRpUm90YXRlID0gOTAgICAgICAgICAgICBpZiAoICRpUm90YXRlID09IDI1NSApOworICAgICAgICAkaVJvdGF0ZSA9IDkwIC0gJGlSb3RhdGUgaWYgKCAkaVJvdGF0ZSA+IDkwICk7CisKKyAgICAgICAgJGlJbmQgICAgID0gKCAkaUdlbjIgJiAweDBGICk7CisgICAgICAgICRpU2hyaW5rICA9ICggJGlHZW4yICYgMHgxMCApID8gMSA6IDA7CisgICAgICAgICRpTWVyZ2UgICA9ICggJGlHZW4yICYgMHgyMCApID8gMSA6IDA7CisgICAgICAgICRpUmVhZERpciA9ICggKCAkaUdlbjIgJiAweEMwICkgLyAweDQwICkgJiAweDAzOworICAgICAgICAkaUJkclNMICAgPSAkaUJkcjEgJiAweDBGOworICAgICAgICAkaUJkclNSICAgPSAoICggJGlCZHIxICYgMHhGMCApIC8gMHgxMCApICYgMHgwRjsKKyAgICAgICAgJGlCZHJTVCAgID0gKCAoICRpQmRyMSAmIDB4RjAwICkgLyAweDEwMCApICYgMHgwRjsKKyAgICAgICAgJGlCZHJTQiAgID0gKCAoICRpQmRyMSAmIDB4RjAwMCApIC8gMHgxMDAwICkgJiAweDBGOworCisgICAgICAgICRpQmRyQ0wgPSAoICggJGlCZHIyICYgMHg3RiApICkgJiAweDdGOworICAgICAgICAkaUJkckNSID0gKCAoICRpQmRyMiAmIDB4M0Y4MCApIC8gMHg4MCApICYgMHg3RjsKKyAgICAgICAgJGlCZHJEICA9ICggKCAkaUJkcjIgJiAweEMwMDAgKSAvIDB4NDAwMCApICYgMHgzOworCisgICAgICAgICRpQmRyQ1QgPSAoICggJGlCZHIzICYgMHg3RiApICkgJiAweDdGOworICAgICAgICAkaUJkckNCID0gKCAoICRpQmRyMyAmIDB4M0Y4MCApIC8gMHg4MCApICYgMHg3RjsKKyAgICAgICAgJGlCZHJDRCA9ICggKCAkaUJkcjMgJiAweDFGQzAwMCApIC8gMHg0MDAwICkgJiAweDdGOworICAgICAgICAkaUJkclNEID0gKCAoICRpQmRyMyAmIDB4MUUwMDAwMCApIC8gMHgyMDAwMDAgKSAmIDB4RjsKKyAgICAgICAgJGlGaWxsUCA9ICggKCAkaUJkcjMgJiAweEZDMDAwMDAwICkgLyAweDQwMDAwMDAgKSAmIDB4M0Y7CisKKyAgICAgICAgJGlGaWxsQ0YgPSAoICRpUHRuICYgMHg3RiApOworICAgICAgICAkaUZpbGxDQiA9ICggKCAkaVB0biAmIDB4M0Y4MCApIC8gMHg4MCApICYgMHg3RjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG15ICggJGlHZW4sICRpQWxpZ24sICRpUHRuLCAkaVB0bjIsICRpQmRyMSwgJGlCZHIyICk7CisKKyAgICAgICAgKCAkaUZudCwgJGlJZHgsICRpR2VuLCAkaUFsaWduLCAkaVB0biwgJGlQdG4yLCAkaUJkcjEsICRpQmRyMiApID0KKyAgICAgICAgICB1bnBhY2soICJ2OCIsICRzV2sgKTsKKyAgICAgICAgJGlMb2NrICAgPSAoICRpR2VuICYgMHgwMSApID8gMSA6IDA7CisgICAgICAgICRpSGlkZGVuID0gKCAkaUdlbiAmIDB4MDIgKSA/IDEgOiAwOworICAgICAgICAkaVN0eWxlICA9ICggJGlHZW4gJiAweDA0ICkgPyAxIDogMDsKKyAgICAgICAgJGkxMjMgICAgPSAoICRpR2VuICYgMHgwOCApID8gMSA6IDA7CisKKyAgICAgICAgJGlBbEggICA9ICggJGlBbGlnbiAmIDB4MDcgKTsKKyAgICAgICAgJGlXcmFwICA9ICggJGlBbGlnbiAmIDB4MDggKSA/IDEgOiAwOworICAgICAgICAkaUFsViAgID0gKCAkaUFsaWduICYgMHg3MCApIC8gMHgxMDsKKyAgICAgICAgJGlKdXN0TCA9ICggJGlBbGlnbiAmIDB4ODAgKSA/IDEgOiAwOworCisgICAgICAgICRpUm90YXRlID0gKCAoICRpQWxpZ24gJiAweDMwMCApIC8gMHgxMDAgKSAmIDB4MzsKKworICAgICAgICAkaUZpbGxDRiA9ICggJGlQdG4gJiAweDdGICk7CisgICAgICAgICRpRmlsbENCID0gKCAoICRpUHRuICYgMHgxRjgwICkgLyAweDgwICkgJiAweDdGOworCisgICAgICAgICRpRmlsbFAgPSAoICRpUHRuMiAmIDB4M0YgKTsKKyAgICAgICAgJGlCZHJTQiA9ICggKCAkaVB0bjIgJiAweDFDMCApIC8gMHg0MCApICYgMHg3OworICAgICAgICAkaUJkckNCID0gKCAoICRpUHRuMiAmIDB4RkUwMCApIC8gMHgyMDAgKSAmIDB4N0Y7CisKKyAgICAgICAgJGlCZHJTVCA9ICggJGlCZHIxICYgMHgwNyApOworICAgICAgICAkaUJkclNMID0gKCAoICRpQmRyMSAmIDB4MzggKSAvIDB4OCApICYgMHgwNzsKKyAgICAgICAgJGlCZHJTUiA9ICggKCAkaUJkcjEgJiAweDFDMCApIC8gMHg0MCApICYgMHgwNzsKKyAgICAgICAgJGlCZHJDVCA9ICggKCAkaUJkcjEgJiAweEZFMDAgKSAvIDB4MjAwICkgJiAweDdGOworCisgICAgICAgICRpQmRyQ0wgPSAoICRpQmRyMiAmIDB4N0YgKSAmIDB4N0Y7CisgICAgICAgICRpQmRyQ1IgPSAoICggJGlCZHIyICYgMHgzRjgwICkgLyAweDgwICkgJiAweDdGOworICAgIH0KKworICAgIHB1c2ggQHsgJG9Cb29rLT57Rm9ybWF0fSB9LCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9ybWF0LT5uZXcoCisgICAgICAgIEZvbnRObyA9PiAkaUZudCwKKyAgICAgICAgRm9udCAgID0+ICRvQm9vay0+e0ZvbnR9WyRpRm50XSwKKyAgICAgICAgRm10SWR4ID0+ICRpSWR4LAorCisgICAgICAgIExvY2sgICAgID0+ICRpTG9jaywKKyAgICAgICAgSGlkZGVuICAgPT4gJGlIaWRkZW4sCisgICAgICAgIFN0eWxlICAgID0+ICRpU3R5bGUsCisgICAgICAgIEtleTEyMyAgID0+ICRpMTIzLAorICAgICAgICBBbGlnbkggICA9PiAkaUFsSCwKKyAgICAgICAgV3JhcCAgICAgPT4gJGlXcmFwLAorICAgICAgICBBbGlnblYgICA9PiAkaUFsViwKKyAgICAgICAgSnVzdExhc3QgPT4gJGlKdXN0TCwKKyAgICAgICAgUm90YXRlICAgPT4gJGlSb3RhdGUsCisKKyAgICAgICAgSW5kZW50ICA9PiAkaUluZCwKKyAgICAgICAgU2hyaW5rICA9PiAkaVNocmluaywKKyAgICAgICAgTWVyZ2UgICA9PiAkaU1lcmdlLAorICAgICAgICBSZWFkRGlyID0+ICRpUmVhZERpciwKKworICAgICAgICBCZHJTdHlsZSA9PiBbICRpQmRyU0wsICRpQmRyU1IsICAkaUJkclNULCAkaUJkclNCIF0sCisgICAgICAgIEJkckNvbG9yID0+IFsgJGlCZHJDTCwgJGlCZHJDUiwgICRpQmRyQ1QsICRpQmRyQ0IgXSwKKyAgICAgICAgQmRyRGlhZyAgPT4gWyAkaUJkckQsICAkaUJkclNELCAgJGlCZHJDRCBdLAorICAgICAgICBGaWxsICAgICA9PiBbICRpRmlsbFAsICRpRmlsbENGLCAkaUZpbGxDQiBdLAorICAgICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkZvcm1hdCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgREs6IFAzMzYKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViRm9ybWF0IHsKKworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgJHNGbXQ7CisKKyAgICBpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA8PSB2ZXJCSUZGNSApIHsKKyAgICAgICAgJHNGbXQgPSBzdWJzdHIoICRzV2ssIDMsIHVucGFjayggJ2MnLCBzdWJzdHIoICRzV2ssIDIsIDEgKSApICk7CisgICAgICAgICRzRm10ID0gJG9Cb29rLT57Rm10Q2xhc3N9LT5UZXh0Rm10KCAkc0ZtdCwgJ19uYXRpdmVfJyApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNGbXQgPSBfY29udkJJRkY4U3RyaW5nKCAkb0Jvb2ssIHN1YnN0ciggJHNXaywgMiApICk7CisgICAgfQorCisgICAgbXkgJGZvcm1hdF9pbmRleCA9IHVucGFjayggJ3YnLCBzdWJzdHIoICRzV2ssIDAsIDIgKSApOworCisgICAgIyBFeGNlbCA0IGFuZCBlYXJsaWVyIHVzZWQgYW4gaW5kZXggb2YgMCB0byBpbmRpY2F0ZSB0aGF0IGEgYnVpbHQtaW4gZm9ybWF0CisgICAgIyB0aGF0IHdhcyBzdG9yZWQgaW1wbGljaXRseS4KKyAgICBpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA8PSB2ZXJCSUZGNCAmJiAkZm9ybWF0X2luZGV4ID09IDAgKSB7CisgICAgICAgICRmb3JtYXRfaW5kZXggPSBrZXlzICV7ICRvQm9vay0+e0Zvcm1hdFN0cn0gfTsKKyAgICB9CisKKyAgICAkb0Jvb2stPntGb3JtYXRTdHJ9LT57JGZvcm1hdF9pbmRleH0gPSAkc0ZtdDsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViUGFsZXR0ZSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDM5MworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJQYWxldHRlIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIGZvciAoIG15ICRpID0gMCA7ICRpIDwgdW5wYWNrKCAndicsICRzV2sgKSA7ICRpKysgKSB7CisKKyAgICAgICAgIyAgICAgICAgcHVzaCBAYUNvbG9yLCB1bnBhY2soJ0g2Jywgc3Vic3RyKCRzV2ssICRpKjQrMikpOworICAgICAgICAkYUNvbG9yWyAkaSArIDggXSA9IHVucGFjayggJ0g2Jywgc3Vic3RyKCAkc1drLCAkaSAqIDQgKyAyICkgKTsKKyAgICB9Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkZvbnQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6UDMzMworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJGb250IHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIG15ICggJGlIZWlnaHQsICRpQXR0ciwgJGlDSWR4LCAkaUJvbGQsICRpU3VwZXIsICRpVW5kZXJsaW5lLCAkc0ZudE5hbWUgKTsKKyAgICBteSAoICRiQm9sZCwgJGJJdGFsaWMsICRiVW5kZXJsaW5lLCAkYlN0cmlrZW91dCApOworCisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPT0gdmVyQklGRjggKSB7CisgICAgICAgICggJGlIZWlnaHQsICRpQXR0ciwgJGlDSWR4LCAkaUJvbGQsICRpU3VwZXIsICRpVW5kZXJsaW5lICkgPQorICAgICAgICAgIHVucGFjayggInY1YyIsICRzV2sgKTsKKyAgICAgICAgbXkgKCAkaVNpemUsICRpSGlnaCApID0gdW5wYWNrKCAnY2MnLCBzdWJzdHIoICRzV2ssIDE0LCAyICkgKTsKKyAgICAgICAgaWYgKCAkaUhpZ2ggKSB7CisgICAgICAgICAgICAkc0ZudE5hbWUgPSBzdWJzdHIoICRzV2ssIDE2LCAkaVNpemUgKiAyICk7CisgICAgICAgICAgICBfU3dhcEZvclVuaWNvZGUoIFwkc0ZudE5hbWUgKTsKKyAgICAgICAgICAgICRzRm50TmFtZSA9ICRvQm9vay0+e0ZtdENsYXNzfS0+VGV4dEZtdCggJHNGbnROYW1lLCAndWNzMicgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRzRm50TmFtZSA9IHN1YnN0ciggJHNXaywgMTYsICRpU2l6ZSApOworICAgICAgICAgICAgJHNGbnROYW1lID0gJG9Cb29rLT57Rm10Q2xhc3N9LT5UZXh0Rm10KCAkc0ZudE5hbWUsICdfbmF0aXZlXycgKTsKKyAgICAgICAgfQorICAgICAgICAkYkJvbGQgICAgICA9ICggJGlCb2xkID49IDB4MkJDICkgPyAxIDogMDsKKyAgICAgICAgJGJJdGFsaWMgICAgPSAoICRpQXR0ciAmIDB4MDIgKSAgID8gMSA6IDA7CisgICAgICAgICRiU3RyaWtlb3V0ID0gKCAkaUF0dHIgJiAweDA4ICkgICA/IDEgOiAwOworICAgICAgICAkYlVuZGVybGluZSA9ICggJGlVbmRlcmxpbmUgKSAgICAgPyAxIDogMDsKKyAgICB9CisgICAgZWxzaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPT0gdmVyQklGRjUgKSB7CisgICAgICAgICggJGlIZWlnaHQsICRpQXR0ciwgJGlDSWR4LCAkaUJvbGQsICRpU3VwZXIsICRpVW5kZXJsaW5lICkgPQorICAgICAgICAgIHVucGFjayggInY1YyIsICRzV2sgKTsKKyAgICAgICAgJHNGbnROYW1lID0KKyAgICAgICAgICAkb0Jvb2stPntGbXRDbGFzc30KKyAgICAgICAgICAtPlRleHRGbXQoIHN1YnN0ciggJHNXaywgMTUsIHVucGFjayggImMiLCBzdWJzdHIoICRzV2ssIDE0LCAxICkgKSApLAorICAgICAgICAgICAgJ19uYXRpdmVfJyApOworICAgICAgICAkYkJvbGQgICAgICA9ICggJGlCb2xkID49IDB4MkJDICkgPyAxIDogMDsKKyAgICAgICAgJGJJdGFsaWMgICAgPSAoICRpQXR0ciAmIDB4MDIgKSAgID8gMSA6IDA7CisgICAgICAgICRiU3RyaWtlb3V0ID0gKCAkaUF0dHIgJiAweDA4ICkgICA/IDEgOiAwOworICAgICAgICAkYlVuZGVybGluZSA9ICggJGlVbmRlcmxpbmUgKSAgICAgPyAxIDogMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICggJGlIZWlnaHQsICRpQXR0ciApID0gdW5wYWNrKCAidjIiLCAkc1drICk7CisgICAgICAgICRpQ0lkeCAgPSB1bmRlZjsKKyAgICAgICAgJGlTdXBlciA9IDA7CisKKyAgICAgICAgJGJCb2xkICAgICAgPSAoICRpQXR0ciAmIDB4MDEgKSA/IDEgOiAwOworICAgICAgICAkYkl0YWxpYyAgICA9ICggJGlBdHRyICYgMHgwMiApID8gMSA6IDA7CisgICAgICAgICRiVW5kZXJsaW5lID0gKCAkaUF0dHIgJiAweDA0ICkgPyAxIDogMDsKKyAgICAgICAgJGJTdHJpa2VvdXQgPSAoICRpQXR0ciAmIDB4MDggKSA/IDEgOiAwOworCisgICAgICAgICRzRm50TmFtZSA9IHN1YnN0ciggJHNXaywgNSwgdW5wYWNrKCAiYyIsIHN1YnN0ciggJHNXaywgNCwgMSApICkgKTsKKyAgICB9CisgICAgcHVzaCBAeyAkb0Jvb2stPntGb250fSB9LCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9udC0+bmV3KAorICAgICAgICBIZWlnaHQgICAgICAgICA9PiAkaUhlaWdodCAvIDIwLjAsCisgICAgICAgIEF0dHIgICAgICAgICAgID0+ICRpQXR0ciwKKyAgICAgICAgQ29sb3IgICAgICAgICAgPT4gJGlDSWR4LAorICAgICAgICBTdXBlciAgICAgICAgICA9PiAkaVN1cGVyLAorICAgICAgICBVbmRlcmxpbmVTdHlsZSA9PiAkaVVuZGVybGluZSwKKyAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJHNGbnROYW1lLAorCisgICAgICAgIEJvbGQgICAgICA9PiAkYkJvbGQsCisgICAgICAgIEl0YWxpYyAgICA9PiAkYkl0YWxpYywKKyAgICAgICAgVW5kZXJsaW5lID0+ICRiVW5kZXJsaW5lLAorICAgICAgICBTdHJpa2VvdXQgPT4gJGJTdHJpa2VvdXQsCisgICAgKTsKKworICAgICNTa2lwIEZvbnRbNF0KKyAgICBwdXNoIEB7ICRvQm9vay0+e0ZvbnR9IH0sIHt9IGlmICggc2NhbGFyKCBAeyAkb0Jvb2stPntGb250fSB9ICkgPT0gNCApOworCit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkJvdW5kU2hlZXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCk6IERLOiBQMzA3CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkJvdW5kU2hlZXQgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaVBvcywgJGlHciwgJGlLaW5kICkgPSB1bnBhY2soICJMYzIiLCAkc1drICk7CisgICAgJGlLaW5kICY9IDB4MEY7CisgICAgcmV0dXJuIGlmICggKCAkaUtpbmQgIT0gMHgwMCApICYmICggJGlLaW5kICE9IDB4MDEgKSApOworCisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPj0gdmVyQklGRjggKSB7CisgICAgICAgIG15ICggJGlTaXplLCAkaVVuaSApID0gdW5wYWNrKCAiY2MiLCBzdWJzdHIoICRzV2ssIDYsIDIgKSApOworICAgICAgICBteSAkc1dzTmFtZSA9IHN1YnN0ciggJHNXaywgOCApOworICAgICAgICBpZiAoICRpVW5pICYgMHgwMSApIHsKKyAgICAgICAgICAgIF9Td2FwRm9yVW5pY29kZSggXCRzV3NOYW1lICk7CisgICAgICAgICAgICAkc1dzTmFtZSA9ICRvQm9vay0+e0ZtdENsYXNzfS0+VGV4dEZtdCggJHNXc05hbWUsICd1Y3MyJyApOworICAgICAgICB9CisgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e1NoZWV0Q291bnR9IF0gPQorICAgICAgICAgIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQtPm5ldygKKyAgICAgICAgICAgIE5hbWUgICAgID0+ICRzV3NOYW1lLAorICAgICAgICAgICAgS2luZCAgICAgPT4gJGlLaW5kLAorICAgICAgICAgICAgX1BvcyAgICAgPT4gJGlQb3MsCisgICAgICAgICAgICBfQm9vayAgICA9PiAkb0Jvb2ssCisgICAgICAgICAgICBfU2hlZXRObyA9PiAkb0Jvb2stPntTaGVldENvdW50fSwKKyAgICAgICAgICApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57U2hlZXRDb3VudH0gXSA9CisgICAgICAgICAgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldC0+bmV3KAorICAgICAgICAgICAgTmFtZSA9PgorICAgICAgICAgICAgICAkb0Jvb2stPntGbXRDbGFzc30tPlRleHRGbXQoIHN1YnN0ciggJHNXaywgNyApLCAnX25hdGl2ZV8nICksCisgICAgICAgICAgICBLaW5kICAgICA9PiAkaUtpbmQsCisgICAgICAgICAgICBfUG9zICAgICA9PiAkaVBvcywKKyAgICAgICAgICAgIF9Cb29rICAgID0+ICRvQm9vaywKKyAgICAgICAgICAgIF9TaGVldE5vID0+ICRvQm9vay0+e1NoZWV0Q291bnR9LAorICAgICAgICAgICk7CisgICAgfQorICAgICRvQm9vay0+e1NoZWV0Q291bnR9Kys7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkhlYWRlciAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDM0MAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJIZWFkZXIgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworICAgIG15ICRzVzsKKworICAgIGlmICggIWRlZmluZWQgJHNXayApIHsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57SGVhZGVyfSA9IHVuZGVmOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgI0JJRkY4CisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPj0gdmVyQklGRjggKSB7CisgICAgICAgICRzVyA9IF9jb252QklGRjhTdHJpbmcoICRvQm9vaywgJHNXayApOworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntIZWFkZXJ9ID0KKyAgICAgICAgICAoICRzVyBlcSAiXHgwMCIgKSA/IHVuZGVmIDogJHNXOworICAgIH0KKworICAgICNCZWZvcmUgQklGRjgKKyAgICBlbHNlIHsKKyAgICAgICAgbXkgKCAkaUxlbiApID0gdW5wYWNrKCAiYyIsICRzV2sgKTsKKyAgICAgICAgJHNXID0KKyAgICAgICAgICAkb0Jvb2stPntGbXRDbGFzc30tPlRleHRGbXQoIHN1YnN0ciggJHNXaywgMSwgJGlMZW4gKSwgJ19uYXRpdmVfJyApOworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntIZWFkZXJ9ID0KKyAgICAgICAgICAoICRzVyBlcSAiXHgwMFx4MDBceDAwIiApID8gdW5kZWYgOiAkc1c7CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJGb290ZXIgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IFAzMzUKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViRm9vdGVyIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e19DdXJTaGVldH0gKTsKKyAgICBteSAkc1c7CisKKyAgICBpZiAoICFkZWZpbmVkICRzV2sgKSB7CisgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e0Zvb3Rlcn0gPSB1bmRlZjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICNCSUZGOAorICAgIGlmICggJG9Cb29rLT57QklGRlZlcnNpb259ID49IHZlckJJRkY4ICkgeworICAgICAgICAkc1cgPSBfY29udkJJRkY4U3RyaW5nKCAkb0Jvb2ssICRzV2sgKTsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57Rm9vdGVyfSA9CisgICAgICAgICAgKCAkc1cgZXEgIlx4MDAiICkgPyB1bmRlZiA6ICRzVzsKKyAgICB9CisKKyAgICAjQmVmb3JlIEJJRkY4CisgICAgZWxzZSB7CisgICAgICAgIG15ICggJGlMZW4gKSA9IHVucGFjayggImMiLCAkc1drICk7CisgICAgICAgICRzVyA9CisgICAgICAgICAgJG9Cb29rLT57Rm10Q2xhc3N9LT5UZXh0Rm10KCBzdWJzdHIoICRzV2ssIDEsICRpTGVuICksICdfbmF0aXZlXycgKTsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57Rm9vdGVyfSA9CisgICAgICAgICAgKCAkc1cgZXEgIlx4MDBceDAwXHgwMCIgKSA/IHVuZGVmIDogJHNXOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViSFBhZ2VCcmVhayAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDM0MQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJIUGFnZUJyZWFrIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIG15IEBhQnJlYWs7CisgICAgbXkgJGlDbnQgPSB1bnBhY2soICJ2IiwgJHNXayApOworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgI0JJRkY4CisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPj0gdmVyQklGRjggKSB7CisgICAgICAgIGZvciAoIG15ICRpID0gMCA7ICRpIDwgJGlDbnQgOyAkaSsrICkgeworICAgICAgICAgICAgbXkgKCAkaVJvdywgJGlDb2xCLCAkaUNvbEUgKSA9CisgICAgICAgICAgICAgIHVucGFjayggJ3YzJywgc3Vic3RyKCAkc1drLCAyICsgJGkgKiA2LCA2ICkgKTsKKworICAgICAgICAgICAgIyAgICAgICAgICAgIHB1c2ggQGFCcmVhaywgWyRpUm93LCAkaUNvbEIsICRpQ29sRV07CisgICAgICAgICAgICBwdXNoIEBhQnJlYWssICRpUm93OworICAgICAgICB9CisgICAgfQorCisgICAgI0JlZm9yZSBCSUZGOAorICAgIGVsc2UgeworICAgICAgICBmb3IgKCBteSAkaSA9IDAgOyAkaSA8ICRpQ250IDsgJGkrKyApIHsKKyAgICAgICAgICAgIG15ICggJGlSb3cgKSA9IHVucGFjayggJ3YnLCBzdWJzdHIoICRzV2ssIDIgKyAkaSAqIDIsIDIgKSApOworICAgICAgICAgICAgcHVzaCBAYUJyZWFrLCAkaVJvdzsKKworICAgICAgICAgICAgIyAgICAgICAgICAgIHB1c2ggQGFCcmVhaywgWyRpUm93LCAwLCAyNTVdOworICAgICAgICB9CisgICAgfQorICAgIEBhQnJlYWsgPSBzb3J0IHsgJGEgPD0+ICRiIH0gQGFCcmVhazsKKyAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntIUGFnZUJyZWFrfSA9IFxAYUJyZWFrOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJWUGFnZUJyZWFrIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOiBQNDQ3CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YlZQYWdlQnJlYWsgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgbXkgQGFCcmVhazsKKyAgICBteSAkaUNudCA9IHVucGFjayggInYiLCAkc1drICk7CisKKyAgICAjQklGRjgKKyAgICBpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA+PSB2ZXJCSUZGOCApIHsKKyAgICAgICAgZm9yICggbXkgJGkgPSAwIDsgJGkgPCAkaUNudCA7ICRpKysgKSB7CisgICAgICAgICAgICBteSAoICRpQ29sLCAkaVJvd0IsICRpUm93RSApID0KKyAgICAgICAgICAgICAgdW5wYWNrKCAndjMnLCBzdWJzdHIoICRzV2ssIDIgKyAkaSAqIDYsIDYgKSApOworICAgICAgICAgICAgcHVzaCBAYUJyZWFrLCAkaUNvbDsKKworICAgICAgICAgICAgIyAgICAgICAgICAgIHB1c2ggQGFCcmVhaywgWyRpQ29sLCAkaVJvd0IsICRpUm93RV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjQmVmb3JlIEJJRkY4CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoIG15ICRpID0gMCA7ICRpIDwgJGlDbnQgOyAkaSsrICkgeworICAgICAgICAgICAgbXkgKCAkaUNvbCApID0gdW5wYWNrKCAndicsIHN1YnN0ciggJHNXaywgMiArICRpICogMiwgMiApICk7CisgICAgICAgICAgICBwdXNoIEBhQnJlYWssICRpQ29sOworCisgICAgICAgICAgICAjICAgICAgICAgICAgcHVzaCBAYUJyZWFrLCBbJGlDb2wsIDAsIDY1NTM1XTsKKyAgICAgICAgfQorICAgIH0KKyAgICBAYUJyZWFrID0gc29ydCB7ICRhIDw9PiAkYiB9IEBhQnJlYWs7CisgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57VlBhZ2VCcmVha30gPSBcQGFCcmVhazsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViTWFyZ2luIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOiBQMzA2LCAzNDUsIDQwMCwgNDQwCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1Yk1hcmdpbiB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXR9ICk7CisKKyAgICAjIFRoZSAiTWVyZ2luIiBvcHRpb25zIGFyZSBhIHdvcmthcm91bmQgZm9yIGEgYmFja3dhcmQgY29tcGF0aWJsZSB0eXBvLgorCisgICAgbXkgJGRXayA9IF9jb252RHZhbCggc3Vic3RyKCAkc1drLCAwLCA4ICkgKTsKKyAgICBpZiAoICRiT3AgPT0gMHgyNiApIHsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57TGVmdE1lcmdpbn0gPSAkZFdrOworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntMZWZ0TWFyZ2lufSA9ICRkV2s7CisgICAgfQorICAgIGVsc2lmICggJGJPcCA9PSAweDI3ICkgeworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntSaWdodE1lcmdpbn0gPSAkZFdrOworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntSaWdodE1hcmdpbn0gPSAkZFdrOworICAgIH0KKyAgICBlbHNpZiAoICRiT3AgPT0gMHgyOCApIHsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57VG9wTWVyZ2lufSA9ICRkV2s7CisgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e1RvcE1hcmdpbn0gPSAkZFdrOworICAgIH0KKyAgICBlbHNpZiAoICRiT3AgPT0gMHgyOSApIHsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57Qm90dG9tTWVyZ2lufSA9ICRkV2s7CisgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e0JvdHRvbU1hcmdpbn0gPSAkZFdrOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViSGNlbnRlciAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDM0MAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJIY2VudGVyIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e19DdXJTaGVldH0gKTsKKworICAgIG15ICRpV2sgPSB1bnBhY2soICJ2IiwgJHNXayApOworICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e0hDZW50ZXJ9ID0gJGlXazsKKworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJWY2VudGVyIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOiBQNDQ3CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YlZjZW50ZXIgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgbXkgJGlXayA9IHVucGFjayggInYiLCAkc1drICk7CisgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57VkNlbnRlcn0gPSAkaVdrOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJQcmludEdyaWRsaW5lcyAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDM5NworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJQcmludEdyaWRsaW5lcyB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXR9ICk7CisKKyAgICBteSAkaVdrID0gdW5wYWNrKCAidiIsICRzV2sgKTsKKyAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntQcmludEdyaWR9ID0gJGlXazsKKworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJQcmludEhlYWRlcnMgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IFAzOTcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViUHJpbnRIZWFkZXJzIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e19DdXJTaGVldH0gKTsKKworICAgIG15ICRpV2sgPSB1bnBhY2soICJ2IiwgJHNXayApOworICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e1ByaW50SGVhZGVyc30gPSAkaVdrOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJTRVRVUCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDQwOQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJTRVRVUCB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXR9ICk7CisKKyAgICAjIFdvcmthcm91bmQgZm9yIHNvbWUgYXBwcyBhbmQgb2xkZXIgRXhjZWxzIHRoYXQgZG9uJ3Qgd3JpdGUgYQorICAgICMgY29tcGxldGUgU0VUVVAgcmVjb3JkLgorICAgIHJldHVybiB1bmRlZiBpZiAkYkxlbiAhPSAzNDsKKworICAgIG15ICRvV2tTID0gJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdOworICAgIG15ICRpR3JCaXQ7CisKKyAgICAoCisgICAgICAgICRvV2tTLT57UGFwZXJTaXplfSwgJG9Xa1MtPntTY2FsZX0sICAgICAkb1drUy0+e1BhZ2VTdGFydH0sCisgICAgICAgICRvV2tTLT57Rml0V2lkdGh9LCAgJG9Xa1MtPntGaXRIZWlnaHR9LCAkaUdyQml0LAorICAgICAgICAkb1drUy0+e1Jlc30sICAgICAgICRvV2tTLT57VlJlc30sCisgICAgKSA9IHVucGFjayggJ3Y4JywgJHNXayApOworCisgICAgJG9Xa1MtPntIZWFkZXJNYXJnaW59ID0gX2NvbnZEdmFsKCBzdWJzdHIoICRzV2ssIDE2LCA4ICkgKTsKKyAgICAkb1drUy0+e0Zvb3Rlck1hcmdpbn0gPSBfY29udkR2YWwoIHN1YnN0ciggJHNXaywgMjQsIDggKSApOworICAgICRvV2tTLT57Q29waXN9ID0gdW5wYWNrKCAndjInLCBzdWJzdHIoICRzV2ssIDMyLCAyICkgKTsKKyAgICAkb1drUy0+e0xlZnRUb1JpZ2h0fSA9ICggKCAkaUdyQml0ICYgMHgwMSApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e0xhbmRzY2FwZX0gICA9ICggKCAkaUdyQml0ICYgMHgwMiApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e05vUGxzfSAgICAgICA9ICggKCAkaUdyQml0ICYgMHgwNCApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e05vQ29sb3J9ICAgICA9ICggKCAkaUdyQml0ICYgMHgwOCApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e0RyYWZ0fSAgICAgICA9ICggKCAkaUdyQml0ICYgMHgxMCApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e05vdGVzfSAgICAgICA9ICggKCAkaUdyQml0ICYgMHgyMCApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e05vT3JpZW50fSAgICA9ICggKCAkaUdyQml0ICYgMHg0MCApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e1VzZVBhZ2V9ICAgICA9ICggKCAkaUdyQml0ICYgMHg4MCApID8gMSA6IDAgKTsKKworICAgICMgVGhlIE5vUGxzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHZhbHVlcyBoYXZlIG5vdCBiZWVuIHRha2VuIGZyb20gYW4KKyAgICAjIGFjdHVhbCBwcmludGVyIGFuZCB0aHVzIG1heSBub3QgYmUgYWNjdXJhdGUuCisKKyAgICAjIFNldCBkZWZhdWx0IHNjYWxlIGlmIE5vUGxzIG90aGVyd2lzZSBpdCBtYXkgYmUgYW4gaW52YWxpZCB2YWx1ZSBvZiAwWEZGLgorICAgICRvV2tTLT57U2NhbGV9ID0gMTAwIGlmICRvV2tTLT57Tm9QbHN9OworCisgICAgIyBXb3JrYXJvdW5kIGZvciBhIGJhY2t3YXJkIGNvbXBhdGlibGUgdHlwby4KKyAgICAkb1drUy0+e0hlYWRlck1lcmdpbn0gPSAkb1drUy0+e0hlYWRlck1hcmdpbn07CisgICAgJG9Xa1MtPntGb290ZXJNZXJnaW59ID0gJG9Xa1MtPntGb290ZXJNYXJnaW59OworCit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1Yk5hbWUgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IFAzNTAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViTmFtZSB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICBteSAoCisgICAgICAgICRpR3JCaXQsICRjS2V5LCAgICAkY0NoLCAgICAkaUNjZSwgICAkaXhBbHMsCisgICAgICAgICRpVGFiLCAgICRjY2hDdXN0LCAkY2NoRHNjLCAkY2NoSGVwLCAkY2NoU3RhdHVzCisgICAgKSA9IHVucGFjayggJ3ZjMnYzYzQnLCAkc1drICk7CisKKyAgICAjQnVpbHRpbiBOYW1lICsgTGVuZ3RoID09IDEKKyAgICBpZiAoICggJGlHckJpdCAmIDB4MjAgKSAmJiAoICRjQ2ggPT0gMSApICkgeworCisgICAgICAgICNCSUZGOAorICAgICAgICBpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA+PSB2ZXJCSUZGOCApIHsKKyAgICAgICAgICAgIG15ICRpTmFtZSAgPSB1bnBhY2soICduJywgc3Vic3RyKCAkc1drLCAxNCApICk7CisgICAgICAgICAgICBteSAkaVNoZWV0ID0gdW5wYWNrKCAndicsIHN1YnN0ciggJHNXaywgOCApICkgLSAxOworCisgICAgICAgICAgICAjIFdvcmthcm91bmQgZm9yIG1hbC1mb3JtZWQgRXhjZWwgd29ya2Jvb2tzIHdoZXJlIFByaW50X1RpdGxlIGlzCisgICAgICAgICAgICAjIHNldCBhcyBHbG9iYWwgKGkuZS4gaXRhYiA9IDApLiBOb3RlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZQorICAgICAgICAgICAgIyB0cmVhdGVkIGRpZmZlcmVudGx5IHdoZW4gd2UgZ2V0IGFyb3VuZCB0byBoYW5kbGluZyBnbG9iYWwgbmFtZXMuCisgICAgICAgICAgICByZXR1cm4gdW5kZWYgaWYgJGlTaGVldCA9PSAtMTsKKworICAgICAgICAgICAgaWYgKCAkaU5hbWUgPT0gNiApIHsgICAgI1ByaW50QXJlYQorICAgICAgICAgICAgICAgIG15ICggJGlTaGVldFcsICRyYUFyZWEgKSA9IF9QYXJzZU5hbWVBcmVhKCBzdWJzdHIoICRzV2ssIDE2ICkgKTsKKyAgICAgICAgICAgICAgICAkb0Jvb2stPntQcmludEFyZWF9WyRpU2hlZXRdID0gJHJhQXJlYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJGlOYW1lID09IDcgKSB7ICAgICNUaXRsZQorICAgICAgICAgICAgICAgIG15ICggJGlTaGVldFcsICRyYUFyZWEgKSA9IF9QYXJzZU5hbWVBcmVhKCBzdWJzdHIoICRzV2ssIDE2ICkgKTsKKyAgICAgICAgICAgICAgICBteSBAYVR0bFIgPSAoKTsKKyAgICAgICAgICAgICAgICBteSBAYVR0bEMgPSAoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRyYUkgKCBAJHJhQXJlYSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkcmFJLT5bM10gPT0gMHhGRiApIHsgICAgI1JvdyBUaXRsZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAYVR0bFIsIFsgJHJhSS0+WzBdLCAkcmFJLT5bMl0gXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAjQ29sIFRpdGxlCisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBhVHRsQywgWyAkcmFJLT5bMV0sICRyYUktPlszXSBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRvQm9vay0+e1ByaW50VGl0bGV9WyRpU2hlZXRdID0KKyAgICAgICAgICAgICAgICAgIHsgUm93ID0+IFxAYVR0bFIsIENvbHVtbiA9PiBcQGFUdGxDIH07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBteSAkaU5hbWUgPSB1bnBhY2soICdjJywgc3Vic3RyKCAkc1drLCAxNCApICk7CisgICAgICAgICAgICBpZiAoICRpTmFtZSA9PSA2ICkgeyAgICAgICAgICAgICAgICAgICNQcmludEFyZWEKKyAgICAgICAgICAgICAgICBteSAoICRpU2hlZXQsICRyYUFyZWEgKSA9CisgICAgICAgICAgICAgICAgICBfUGFyc2VOYW1lQXJlYTk1KCBzdWJzdHIoICRzV2ssIDE1ICkgKTsKKyAgICAgICAgICAgICAgICAkb0Jvb2stPntQcmludEFyZWF9WyRpU2hlZXRdID0gJHJhQXJlYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJGlOYW1lID09IDcgKSB7ICAgICAgICAgICAgICAgI1RpdGxlCisgICAgICAgICAgICAgICAgbXkgKCAkaVNoZWV0LCAkcmFBcmVhICkgPQorICAgICAgICAgICAgICAgICAgX1BhcnNlTmFtZUFyZWE5NSggc3Vic3RyKCAkc1drLCAxNSApICk7CisgICAgICAgICAgICAgICAgbXkgQGFUdGxSID0gKCk7CisgICAgICAgICAgICAgICAgbXkgQGFUdGxDID0gKCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkcmFJICggQCRyYUFyZWEgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggJHJhSS0+WzNdID09IDB4RkYgKSB7ICAgICNSb3cgVGl0bGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQGFUdGxSLCBbICRyYUktPlswXSwgJHJhSS0+WzJdIF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgI0NvbCBUaXRsZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAYVR0bEMsIFsgJHJhSS0+WzFdLCAkcmFJLT5bM10gXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkb0Jvb2stPntQcmludFRpdGxlfVskaVNoZWV0XSA9CisgICAgICAgICAgICAgICAgICB7IFJvdyA9PiBcQGFUdGxSLCBDb2x1bW4gPT4gXEBhVHRsQyB9OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBhcnNlTmFtZUFyZWEgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IDQ5NCAocHRnQXJlYWQzZCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfUGFyc2VOYW1lQXJlYSB7CisgICAgbXkgKCAkc09iaiApID0gQF87CisgICAgbXkgKCAkaU9wICk7CisgICAgbXkgQGFSZXMgPSAoKTsKKyAgICAkaU9wID0gdW5wYWNrKCAnQycsICRzT2JqICk7CisgICAgbXkgJGlTaGVldDsKKyAgICBpZiAoICRpT3AgPT0gMHgzYiApIHsKKyAgICAgICAgbXkgKCAkaVdrUywgJGlScywgJGlSZSwgJGlDcywgJGlDZSApID0KKyAgICAgICAgICB1bnBhY2soICd2NScsIHN1YnN0ciggJHNPYmosIDEgKSApOworICAgICAgICAkaVNoZWV0ID0gJGlXa1M7CisgICAgICAgIHB1c2ggQGFSZXMsIFsgJGlScywgJGlDcywgJGlSZSwgJGlDZSBdOworICAgIH0KKyAgICBlbHNpZiAoICRpT3AgPT0gMHgyOSApIHsKKyAgICAgICAgbXkgJGlMZW4gPSB1bnBhY2soICd2Jywgc3Vic3RyKCAkc09iaiwgMSwgMiApICk7CisgICAgICAgIG15ICRpU3QgPSAwOworICAgICAgICB3aGlsZSAoICRpU3QgPCAkaUxlbiApIHsKKyAgICAgICAgICAgIG15ICggJGlPcFcsICRpV2tTLCAkaVJzLCAkaVJlLCAkaUNzLCAkaUNlICkgPQorICAgICAgICAgICAgICB1bnBhY2soICdjdjUnLCBzdWJzdHIoICRzT2JqLCAkaVN0ICsgMywgMTEgKSApOworCisgICAgICAgICAgICBpZiAoICRpT3BXID09IDB4M2IgKSB7CisgICAgICAgICAgICAgICAgJGlTaGVldCA9ICRpV2tTOworICAgICAgICAgICAgICAgIHB1c2ggQGFSZXMsIFsgJGlScywgJGlDcywgJGlSZSwgJGlDZSBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICRpU3QgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAkaVN0ICs9IDExOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJGlTdCArPSAxMjsgICAgI1NraXAgMSBieXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoICRpU2hlZXQsIFxAYVJlcyApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBhcnNlTmFtZUFyZWE5NSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogNDk0IChwdGdBcmVhZDNkKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9QYXJzZU5hbWVBcmVhOTUgeworICAgIG15ICggJHNPYmogKSA9IEBfOworICAgIG15ICggJGlPcCApOworICAgIG15IEBhUmVzID0gKCk7CisgICAgJGlPcCA9IHVucGFjayggJ0MnLCAkc09iaiApOworICAgIG15ICRpU2hlZXQ7CisgICAgaWYgKCAkaU9wID09IDB4M2IgKSB7CisgICAgICAgICRpU2hlZXQgPSB1bnBhY2soICd2Jywgc3Vic3RyKCAkc09iaiwgMTEsIDIgKSApOworICAgICAgICBteSAoICRpUnMsICRpUmUsICRpQ3MsICRpQ2UgKSA9CisgICAgICAgICAgdW5wYWNrKCAndjJDMicsIHN1YnN0ciggJHNPYmosIDE1LCA2ICkgKTsKKyAgICAgICAgcHVzaCBAYVJlcywgWyAkaVJzLCAkaUNzLCAkaVJlLCAkaUNlIF07CisgICAgfQorICAgIGVsc2lmICggJGlPcCA9PSAweDI5ICkgeworICAgICAgICBteSAkaUxlbiA9IHVucGFjayggJ3YnLCBzdWJzdHIoICRzT2JqLCAxLCAyICkgKTsKKyAgICAgICAgbXkgJGlTdCA9IDA7CisgICAgICAgIHdoaWxlICggJGlTdCA8ICRpTGVuICkgeworICAgICAgICAgICAgbXkgJGlPcFcgPSB1bnBhY2soICdjJywgc3Vic3RyKCAkc09iaiwgJGlTdCArIDMsIDYgKSApOworICAgICAgICAgICAgJGlTaGVldCA9IHVucGFjayggJ3YnLCBzdWJzdHIoICRzT2JqLCAkaVN0ICsgMTQsIDIgKSApOworICAgICAgICAgICAgbXkgKCAkaVJzLCAkaVJlLCAkaUNzLCAkaUNlICkgPQorICAgICAgICAgICAgICB1bnBhY2soICd2MkMyJywgc3Vic3RyKCAkc09iaiwgJGlTdCArIDE4LCA2ICkgKTsKKyAgICAgICAgICAgIHB1c2ggQGFSZXMsIFsgJGlScywgJGlDcywgJGlSZSwgJGlDZSBdIGlmICggJGlPcFcgPT0gMHgzYiApOworCisgICAgICAgICAgICBpZiAoICRpU3QgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAkaVN0ICs9IDIxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJGlTdCArPSAyMjsgICAgI1NraXAgMSBieXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoICRpU2hlZXQsIFxAYVJlcyApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJCT09MIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOiBQNDUyCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YldTQk9PTCB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXR9ICk7CisKKyAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntQYWdlRml0fSA9CisgICAgICAoICggdW5wYWNrKCAndicsICRzV2sgKSAmIDB4MTAwICkgPyAxIDogMCApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJNZXJnZUFyZWEgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IChOb3QpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1Yk1lcmdlQXJlYSB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXR9ICk7CisKKyAgICBteSAkaUNudCA9IHVucGFjayggInYiLCAkc1drICk7CisgICAgbXkgJG9Xa1MgPSAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF07CisgICAgJG9Xa1MtPntNZXJnZWRBcmVhfSA9IFtdIHVubGVzcyAoIGRlZmluZWQgJG9Xa1MtPntNZXJnZWRBcmVhfSApOworICAgIGZvciAoIG15ICRpID0gMCA7ICRpIDwgJGlDbnQgOyAkaSsrICkgeworICAgICAgICBteSAoICRpUnMsICRpUmUsICRpQ3MsICRpQ2UgKSA9CisgICAgICAgICAgdW5wYWNrKCAndjQnLCBzdWJzdHIoICRzV2ssICRpICogOCArIDIsIDggKSApOworICAgICAgICBmb3IgKCBteSAkaVIgPSAkaVJzIDsgJGlSIDw9ICRpUmUgOyAkaVIrKyApIHsKKyAgICAgICAgICAgIGZvciAoIG15ICRpQyA9ICRpQ3MgOyAkaUMgPD0gJGlDZSA7ICRpQysrICkgeworICAgICAgICAgICAgICAgICRvV2tTLT57Q2VsbHN9WyRpUl1bJGlDXS0+e01lcmdlZH0gPSAxCisgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJG9Xa1MtPntDZWxsc31bJGlSXVskaUNdICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVzaCBAeyAkb1drUy0+e01lcmdlZEFyZWF9IH0sIFsgJGlScywgJGlDcywgJGlSZSwgJGlDZSBdOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWNvZGVCb29sRXJyIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOiBQMzA2CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgRGVjb2RlQm9vbEVyciB7CisgICAgbXkgKCAkaVZhbCwgJGlGbGcgKSA9IEBfOworICAgIGlmICggJGlGbGcgKSB7ICAgICMgRVJST1IKKyAgICAgICAgaWYgKCAkaVZhbCA9PSAweDAwICkgeworICAgICAgICAgICAgcmV0dXJuICIjTlVMTCEiOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggJGlWYWwgPT0gMHgwNyApIHsKKyAgICAgICAgICAgIHJldHVybiAiI0RJVi8wISI7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaVZhbCA9PSAweDBGICkgeworICAgICAgICAgICAgcmV0dXJuICIjVkFMVUUhIjsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRpVmFsID09IDB4MTcgKSB7CisgICAgICAgICAgICByZXR1cm4gIiNSRUYhIjsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRpVmFsID09IDB4MUQgKSB7CisgICAgICAgICAgICByZXR1cm4gIiNOQU1FPyI7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaVZhbCA9PSAweDI0ICkgeworICAgICAgICAgICAgcmV0dXJuICIjTlVNISI7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaVZhbCA9PSAweDJBICkgeworICAgICAgICAgICAgcmV0dXJuICIjTi9BISI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIiNFUlIiOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gKCAkaVZhbCApID8gIlRSVUUiIDogIkZBTFNFIjsKKyAgICB9Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2RlY29kZV9ya19udW1iZXIoKQorIworIyBDb252ZXJ0IGFuIGVuY29kZWQgUksgbnVtYmVyIGludG8gYSByZWFsIG51bWJlci4gVGhlIFJLIGVuY29kaW5nIGlzCisjIGV4cGxhaW5lZCBpbiBzb21lIGRldGFpbCBpbiB0aGUgTVMgZG9jcy4gSXQgaXMgYSB3YXkgb2Ygc3RvcmluZyBhcHBsaWNhYmxlCisjIGludHMgYW5kIGRvdWJsZXMgaW4gMzJiaXRzICgzMCBkYXRhICsgMiBpbmZvIGJpdHMpIGluIG9yZGVyIHRvIHNhdmUgc3BhY2UuCisjCitzdWIgX2RlY29kZV9ya19udW1iZXIgeworCisgICAgbXkgJHJrX251bWJlciA9IHNoaWZ0OworICAgIG15ICRudW1iZXI7CisKKyAgICAjIENoZWNrIHRoZSBtYWluIFJLIHR5cGUuCisgICAgaWYgKCAkcmtfbnVtYmVyICYgMHgwMiApIHsKKworICAgICAgICAjIFJLIFR5cGUgMiBhbmQgNCwgYSBwYWNrZWQgaW50ZWdlci4KKworICAgICAgICAjIFNoaWZ0IG9mZiB0aGUgaW5mbyBiaXRzLgorICAgICAgICAkbnVtYmVyID0gJHJrX251bWJlciA+PiAyOworCisgICAgICAgICMgQ29udmVydCBmcm9tIHVuc2lnbmVkIHRvIHNpZ25lZCBpZiByZXF1aXJlZC4KKyAgICAgICAgJG51bWJlciAtPSAweDQwMDAwMDAwIGlmICRudW1iZXIgJiAweDIwMDAwMDAwOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAjIFJLIFR5cGUgMSBhbmQgMywgYSB0cnVuY2F0ZWQgSUVFRSBEb3VibGUuCisKKyAgICAgICAgIyBQYWNrIHRoZSBSSyBudW1iZXIgaW50byB0aGUgaGlnaCAzMCBiaXRzIG9mIGFuIElFRUUgZG91YmxlLgorICAgICAgICAkbnVtYmVyID0gcGFjayAiVlYiLCAweDAwMDAsICRya19udW1iZXIgJiAweEZGRkZGRkZDOworCisgICAgICAgICMgUmV2ZXJzZSB0aGUgcGFja2VkIElFRUUgZG91YmxlIG9uIGJpZy1lbmRpYW4gbWFjaGluZXMuCisgICAgICAgICRudW1iZXIgPSByZXZlcnNlICRudW1iZXIgaWYgJEJJR0VORElBTjsKKworICAgICAgICAjIFVucGFjayB0aGUgbnVtYmVyLgorICAgICAgICAkbnVtYmVyID0gdW5wYWNrICJkIiwgJG51bWJlcjsKKyAgICB9CisKKyAgICAjIFJLIFR5cGVzIDMgYW5kIDQgd2VyZSBtdWx0aXBsaWVkIGJ5IDEwMCBwcmlvciB0byBlbmNvZGluZy4KKyAgICAkbnVtYmVyIC89IDEwMCBpZiAkcmtfbnVtYmVyICYgMHgwMTsKKworICAgIHJldHVybiAkbnVtYmVyOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdWJTdHJXaygpCisjCisjIEV4dHJhY3QgdGhlIHdvcmtib29rIHN0cmluZ3MgZnJvbSB0aGUgU1NUIChTaGFyZWQgU3RyaW5nIFRhYmxlKSByZWNvcmQgYW5kCisjIGFueSBmb2xsb3dpbmcgQ09OVElOVUUgcmVjb3Jkcy4KKyMKKyMgVGhlIHdvcmtib29rIHN0cmluZ3MgYXJlIGluaXRpYWxseSBjb250YWluZWQgaW4gdGhlIFNTVCBibG9jayBidXQgbWF5IGFsc28KKyMgb2NjdXB5IG9uZSBvciBtb3JlIENPTlRJTlVFIGJsb2Nrcy4gUmVhZGluZyB0aGUgQ09OVElOVUUgYmxvY2tzIGlzIG1hZGUgYQorIyBsaXR0bGUgdHJpY2t5IGJ5IHRoZSBmYWN0IHRoYXQgdGhleSBjYW4gY29udGFpbiBhbiBhZGRpdGlvbmFsIGluaXRpYWwgYnl0ZQorIyBpZiBhIHN0cmluZyBpcyBjb250aW51ZWQgZnJvbSBhIHByZXZpb3VzIGJsb2NrLgorIworIyBQYXJzaW5nIGlzIGZ1cnRoZXIgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgY29udGludWVkIHNlY3Rpb24gb2YgdGhlCisjIHN0cmluZyBtYXkgaGF2ZSBhIGRpZmZlcmVudCBlbmNvZGluZyAoQVNDSUkgb3IgVVRGLTgpIGZyb20gdGhlIHByZXZpb3VzCisjIHNlY3Rpb24uIEV4Y2VsIGRvZXMgdGhpcyB0byBzYXZlIHNwYWNlLgorIworc3ViIF9zdWJTdHJXayB7CisKKyAgICBteSAoICRzZWxmLCAkYmlmZl9kYXRhLCAkaXNfY29udGludWUgKSA9IEBfOworCisgICAgaWYgKCAkaXNfY29udGludWUgKSB7CisKKyAgICAgICAgIyBXZSBhcmUgcmVhZGluZyBhIENPTlRJTlVFIHJlY29yZC4KKworICAgICAgICBpZiAoICRzZWxmLT57X2J1ZmZlcn0gZXEgJycgKSB7CisKKyAgICAgICAgICAgICMgQSBDT05USU5VRSBibG9jayB3aXRoIG5vIHByZXZpb3VzIFNTVC4KKyAgICAgICAgICAgICRzZWxmLT57X2J1ZmZlcn0gLj0gJGJpZmZfZGF0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICFkZWZpbmVkICRzZWxmLT57X3N0cmluZ19jb250aW51ZWR9ICkgeworCisgICAgICAgICAgICAjIFRoZSBDT05USU5VRSBibG9jayBzdGFydHMgd2l0aCBhIG5ldyAobm9uLWNvbnRpbnVlZCkgc3RyaW5nLgorCisgICAgICAgICAgICAjIFN0cmlwIHRoZSBHcmJpdCBieXRlIGFuZCBzdG9yZSB0aGUgc3RyaW5nIGRhdGEuCisgICAgICAgICAgICAkc2VsZi0+e19idWZmZXJ9IC49IHN1YnN0ciAkYmlmZl9kYXRhLCAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAjIEEgQ09OVElOVUUgYmxvY2sgdGhhdCBzdGFydHMgd2l0aCBhIGNvbnRpbnVlZCBzdHJpbmcuCisKKyAgICAgICAgICAgICMgVGhlIGZpcnN0IGJ5dGUgKEdyYml0KSBvZiB0aGUgQ09OVElOVUUgcmVjb3JkIGluZGljYXRlcyBpZiAoMCkKKyAgICAgICAgICAgICMgdGhlIGNvbnRpbnVlZCBzdHJpbmcgc2VjdGlvbiBpcyBzaW5nbGUgYnl0ZXMgb3IgKDEpIGRvdWJsZSBieXRlcy4KKyAgICAgICAgICAgIG15ICRncmJpdCA9IG9yZCAkYmlmZl9kYXRhOworCisgICAgICAgICAgICBteSAoICRzdHJfcG9zaXRpb24sICRzdHJfbGVuZ3RoICkgPSBAeyAkc2VsZi0+e19wcmV2aW91c19pbmZvfSB9OworICAgICAgICAgICAgbXkgJGJ1ZmZfbGVuZ3RoID0gbGVuZ3RoICRzZWxmLT57X2J1ZmZlcn07CisKKyAgICAgICAgICAgIGlmICggJGJ1ZmZfbGVuZ3RoID49ICggJHN0cl9wb3NpdGlvbiArICRzdHJfbGVuZ3RoICkgKSB7CisKKyAgICAgICAgICAgICAgICAjIE5vdCBpbiBhIHN0cmluZy4KKyAgICAgICAgICAgICAgICAkc2VsZi0+e19idWZmZXJ9IC49ICRiaWZmX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICggJHNlbGYtPntfc3RyaW5nX2NvbnRpbnVlZH0gJiAweDAxICkgPT0gKCAkZ3JiaXQgJiAweDAxICkgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgIyBTYW1lIGVuY29kaW5nIGFzIHRoZSBwcmV2aW91cyBibG9jayBvZiB0aGUgc3RyaW5nLgorICAgICAgICAgICAgICAgICRzZWxmLT57X2J1ZmZlcn0gLj0gc3Vic3RyKCAkYmlmZl9kYXRhLCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgICMgRGlmZmVyZW50IGVuY29kaW5nIHRvIHRoZSBwcmV2aW91cyBibG9jayBvZiB0aGUgc3RyaW5nLgorICAgICAgICAgICAgICAgIGlmICggJGdyYml0ICYgMHgwMSApIHsKKworICAgICAgICAgICAgICAgICAgICAjIEN1cnJlbnQgYmxvY2sgaXMgVVRGLTE2LCBwcmV2aW91cyB3YXMgQVNDSUkuCisgICAgICAgICAgICAgICAgICAgIG15ICggdW5kZWYsICRjY2ggKSA9IHVucGFjayAndmMnLCAkc2VsZi0+e19idWZmZXJ9OworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRzZWxmLT57X2J1ZmZlcn0sIDIsIDEgKSA9IHBhY2soICdDJywgJGNjaCB8IDB4MDEgKTsKKworICAgICAgICAgICAgICAgICAgICAjIENvbnZlcnQgdGhlIHByZXZpb3VzIEFTQ0lJLCBzaW5nbGUgY2hhcmFjdGVyLCBwb3J0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICMgdGhlIHN0cmluZyBpbnRvIGEgZG91YmxlIGNoYXJhY3RlciBVVEYtMTYgc3RyaW5nIGJ5CisgICAgICAgICAgICAgICAgICAgICMgaW5zZXJ0aW5nIHplcm8gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgIGZvciAoCisgICAgICAgICAgICAgICAgICAgICAgICBteSAkaSA9ICggJGJ1ZmZfbGVuZ3RoIC0gJHN0cl9wb3NpdGlvbiApIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICRpID49IDEgOworICAgICAgICAgICAgICAgICAgICAgICAgJGktLQorICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkc2VsZi0+e19idWZmZXJ9LCAkc3RyX3Bvc2l0aW9uICsgJGksIDAgKSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwIjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICMgQ3VycmVudCBibG9jayBpcyBBU0NJSSwgcHJldmlvdXMgd2FzIFVURi0xNi4KKworICAgICAgICAgICAgICAgICAgICAjIENvbnZlcnQgdGhlIGN1cnJlbnQgQVNDSUksIHNpbmdsZSBjaGFyYWN0ZXIsIHBvcnRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgc3RyaW5nIGludG8gYSBkb3VibGUgY2hhcmFjdGVyIFVURi0xNiBzdHJpbmcgYnkKKyAgICAgICAgICAgICAgICAgICAgIyBpbnNlcnRpbmcgbnVsbCBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgbXkgJGNoYW5nZV9sZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAgICggJHN0cl9wb3NpdGlvbiArICRzdHJfbGVuZ3RoICkgLSAkYnVmZl9sZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgdGhlIGN1cnJlbnQgQ09OVElOVUUgcmVjb3JkIGRhdGEuCisgICAgICAgICAgICAgICAgICAgIG15ICRiaWZmX2xlbmd0aCA9IGxlbmd0aCAkYmlmZl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgICMgUmVzdHJpY3QgdGhlIHBvcnRpb24gdG8gYmUgY2hhbmdlZCB0byB0aGUgY3VycmVudCBibG9jaworICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBzdHJpbmcgZXh0ZW5kcyBvdmVyIG1vcmUgdGhhbiBvbmUgYmxvY2suCisgICAgICAgICAgICAgICAgICAgIGlmICggJGNoYW5nZV9sZW5ndGggPiAoICRiaWZmX2xlbmd0aCAtIDEgKSAqIDIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkY2hhbmdlX2xlbmd0aCA9ICggJGJpZmZfbGVuZ3RoIC0gMSApICogMjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICMgSW5zZXJ0IHRoZSBudWxsIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICBmb3IgKCBteSAkaSA9ICggJGNoYW5nZV9sZW5ndGggLyAyICkgOyAkaSA+PSAxIDsgJGktLSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJGJpZmZfZGF0YSwgJGkgKyAxLCAwICkgPSAiXHgwMCI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgU3RyaXAgdGhlIEdyYml0IGJ5dGUgYW5kIHN0b3JlIHRoZSBzdHJpbmcgZGF0YS4KKyAgICAgICAgICAgICAgICAkc2VsZi0+e19idWZmZXJ9IC49IHN1YnN0ciAkYmlmZl9kYXRhLCAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgICMgTm90IGEgQ09OVElOVUUgYmxvY2sgdGhlcmVmb3JlIGFuIFNTVCBibG9jay4KKyAgICAgICAgJHNlbGYtPntfYnVmZmVyfSAuPSAkYmlmZl9kYXRhOworICAgIH0KKworICAgICMgUmVzZXQgdGhlIHN0YXRlIHZhcmlhYmxlcy4KKyAgICAkc2VsZi0+e19zdHJpbmdfY29udGludWVkfSA9IHVuZGVmOworICAgICRzZWxmLT57X3ByZXZpb3VzX2luZm99ICAgID0gdW5kZWY7CisKKyAgICAjIEV4dHJhY3Qgb3V0IGFueSBmdWxsIHN0cmluZ3MgZnJvbSB0aGUgY3VycmVudCBidWZmZXIgbGVhdmluZyBiZWhpbmQgYQorICAgICMgcGFydGlhbCBzdHJpbmcgdGhhdCBpcyBjb250aW51ZWQgaW50byB0aGUgbmV4dCBibG9jaywgb3IgYW4gZW1wdHkKKyAgICAjIGJ1ZmZlciBpcyBubyBzdHJpbmcgaXMgY29udGludWVkLgorICAgIHdoaWxlICggbGVuZ3RoICRzZWxmLT57X2J1ZmZlcn0gPj0gNCApIHsKKyAgICAgICAgbXkgKCAkc3RyX2luZm8sICRsZW5ndGgsICRzdHJfcG9zaXRpb24sICRzdHJfbGVuZ3RoICkgPQorICAgICAgICAgIF9jb252QklGRjhTdHJpbmcoICRzZWxmLCAkc2VsZi0+e19idWZmZXJ9LCAxICk7CisKKyAgICAgICAgaWYgKCBkZWZpbmVkICRzdHJfaW5mby0+WzBdICkgeworICAgICAgICAgICAgcHVzaCBAeyAkc2VsZi0+e1BrZ1N0cn0gfSwKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRleHQgICAgPT4gJHN0cl9pbmZvLT5bMF0sCisgICAgICAgICAgICAgICAgVW5pY29kZSA9PiAkc3RyX2luZm8tPlsxXSwKKyAgICAgICAgICAgICAgICBSaWNoICAgID0+ICRzdHJfaW5mby0+WzJdLAorICAgICAgICAgICAgICAgIEV4dCAgICAgPT4gJHN0cl9pbmZvLT5bM10sCisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAkc2VsZi0+e19idWZmZXJ9ID0gc3Vic3RyKCAkc2VsZi0+e19idWZmZXJ9LCAkbGVuZ3RoICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkc2VsZi0+e19zdHJpbmdfY29udGludWVkfSA9ICRzdHJfaW5mby0+WzFdOworICAgICAgICAgICAgJHNlbGYtPntfcHJldmlvdXNfaW5mb30gPSBbICRzdHJfcG9zaXRpb24sICRzdHJfbGVuZ3RoIF07CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9Td2FwRm9yVW5pY29kZSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9Td2FwRm9yVW5pY29kZSB7CisgICAgbXkgKCAkc09iaiApID0gQF87CisKKyAgICAjICAgIGZvcihteSAkaSA9IDA7ICRpPGxlbmd0aCgkJHNPYmopOyAkaSs9Mil7CisgICAgZm9yICggbXkgJGkgPSAwIDsgJGkgPCAoIGludCggbGVuZ3RoKCAkJHNPYmogKSAvIDIgKSAqIDIgKSA7ICRpICs9IDIgKSB7CisgICAgICAgIG15ICRzSXQgPSBzdWJzdHIoICQkc09iaiwgJGksIDEgKTsKKyAgICAgICAgc3Vic3RyKCAkJHNPYmosICRpLCAxICkgPSBzdWJzdHIoICQkc09iaiwgJGkgKyAxLCAxICk7CisgICAgICAgIHN1YnN0ciggJCRzT2JqLCAkaSArIDEsIDEgKSA9ICRzSXQ7CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9OZXdDZWxsIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX05ld0NlbGwgeworICAgIG15ICggJG9Cb29rLCAkaVIsICRpQywgJXJoS2V5ICkgPSBAXzsKKyAgICBteSAoICRzV2ssICRpTGVuICk7CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgbXkgJEZtdENsYXNzID0gJG9Cb29rLT57Rm10Q2xhc3N9OworICAgICRyaEtleXtUeXBlfSA9CisgICAgICAkRm10Q2xhc3MtPkNoa1R5cGUoICRyaEtleXtOdW1lcmljfSwgJHJoS2V5e0Zvcm1hdH17Rm10SWR4fSApOworICAgIG15ICRGbXRTdHIgPSAkb0Jvb2stPntGb3JtYXRTdHJ9eyAkcmhLZXl7Rm9ybWF0fXtGbXRJZHh9IH07CisKKyAgICAjIFNldCAiRGF0ZSIgdHlwZSBpZiByZXF1aXJlZCBmb3IgbnVtYmVycyBpbiBhIE11bFJLIEJJRkYgYmxvY2suCisgICAgaWYgKCBkZWZpbmVkICRGbXRTdHIgJiYgJHJoS2V5e1R5cGV9IGVxICJOdW1lcmljIiApIHsKKworICAgICAgICAjIE1hdGNoIGEgcmFuZ2Ugb2YgcG9zc2libGUgZGF0ZSBmb3JtYXRzLiBOb3RlOiB0aGlzIGlzbid0IGltcG9ydGFudAorICAgICAgICAjIGV4Y2VwdCBmb3IgcmVwb3J0aW5nLiBUaGUgbnVtYmVyIHdpbGwgc3RpbGwgYmUgY29udmVydGVkIHRvIGEgZGF0ZQorICAgICAgICAjIGJ5IEV4Y2VsRm10KCkgZXZlbiBpZiAnVHlwZScgaXNuJ3Qgc2V0IHRvICdEYXRlJy4KKyAgICAgICAgaWYgKCAkRm10U3RyID1+IG17XltkbXldWy1cXC9kbXldKiR9aSApIHsKKyAgICAgICAgICAgICRyaEtleXtUeXBlfSA9ICJEYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG15ICRvQ2VsbCA9IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpDZWxsLT5uZXcoCisgICAgICAgIFZhbCAgICAgID0+ICRyaEtleXtWYWx9LAorICAgICAgICBGb3JtYXRObyA9PiAkcmhLZXl7Rm9ybWF0Tm99LAorICAgICAgICBGb3JtYXQgICA9PiAkcmhLZXl7Rm9ybWF0fSwKKyAgICAgICAgQ29kZSAgICAgPT4gJHJoS2V5e0NvZGV9LAorICAgICAgICBUeXBlICAgICA9PiAkcmhLZXl7VHlwZX0sCisgICAgKTsKKyAgICAkb0NlbGwtPntfS2luZH0gPSAkcmhLZXl7S2luZH07CisgICAgJG9DZWxsLT57X1ZhbHVlfSA9ICRGbXRDbGFzcy0+VmFsRm10KCAkb0NlbGwsICRvQm9vayApOworICAgIGlmICggJHJoS2V5e1JpY2h9ICkgeworICAgICAgICBteSBAYVJpY2ggPSAoKTsKKyAgICAgICAgbXkgJHNSaWNoID0gJHJoS2V5e1JpY2h9OworICAgICAgICBmb3IgKCBteSAkaVdrID0gMCA7ICRpV2sgPCBsZW5ndGgoICRzUmljaCApIDsgJGlXayArPSA0ICkgeworICAgICAgICAgICAgbXkgKCAkaVBvcywgJGlGbnQgKSA9IHVucGFjayggJ3YyJywgc3Vic3RyKCAkc1JpY2gsICRpV2sgKSApOworICAgICAgICAgICAgcHVzaCBAYVJpY2gsIFsgJGlQb3MsICRvQm9vay0+e0ZvbnR9WyRpRm50XSBdOworICAgICAgICB9CisgICAgICAgICRvQ2VsbC0+e1JpY2h9ID0gXEBhUmljaDsKKyAgICB9CisKKyAgICBpZiAoIGRlZmluZWQgJF9DZWxsSGFuZGxlciApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkICRfT2JqZWN0ICkgeworICAgICAgICAgICAgbm8gc3RyaWN0OworICAgICAgICAgICAgcmVmKCAkX0NlbGxIYW5kbGVyICkgZXEgIkNPREUiCisgICAgICAgICAgICAgID8gJF9DZWxsSGFuZGxlci0+KAorICAgICAgICAgICAgICAgICRfT2JqZWN0LCAkb0Jvb2ssICRvQm9vay0+e19DdXJTaGVldH0sICRpUiwgJGlDLCAkb0NlbGwKKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICA6ICRfQ2VsbEhhbmRsZXItPmNhbGxiYWNrKCAkX09iamVjdCwgJG9Cb29rLCAkb0Jvb2stPntfQ3VyU2hlZXR9LAorICAgICAgICAgICAgICAgICRpUiwgJGlDLCAkb0NlbGwgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRfQ2VsbEhhbmRsZXItPiggJG9Cb29rLCAkb0Jvb2stPntfQ3VyU2hlZXR9LCAkaVIsICRpQywgJG9DZWxsICk7CisgICAgICAgIH0KKyAgICB9CisgICAgdW5sZXNzICggJF9Ob3RTZXRDZWxsICkgeworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntDZWxsc31bJGlSXVskaUNdID0gJG9DZWxsOworICAgIH0KKyAgICByZXR1cm4gJG9DZWxsOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbG9ySWR4VG9SR0IgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkKKyMKKyMgVE9ETyBKTU4gTWFrZSB0aGlzIGEgV29ya2Jvb2sgbWV0aG9kIGFuZCByZS1kb2N1bWVudC4KKyMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBDb2xvcklkeFRvUkdCIHsKKyAgICBteSAoICRzUGtnLCAkaUlkeCApID0gQF87CisgICAgcmV0dXJuICggKCBkZWZpbmVkICRhQ29sb3JbJGlJZHhdICkgPyAkYUNvbG9yWyRpSWR4XSA6ICRhQ29sb3JbMF0gKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGVycm9yKCkuCisjCisjIFJldHVybiBhbiBlcnJvciBzdHJpbmcgZm9yIGEgZmFpbGVkIHBhcnNlKCkuCisjCitzdWIgZXJyb3IgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRwYXJzZV9lcnJvciA9ICRzZWxmLT57X2Vycm9yX3N0YXR1c307CisKKyAgICBpZiAoIGV4aXN0cyAkZXJyb3Jfc3RyaW5nc3skcGFyc2VfZXJyb3J9ICkgeworICAgICAgICByZXR1cm4gJGVycm9yX3N0cmluZ3N7JHBhcnNlX2Vycm9yfTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAnVW5rbm93biBwYXJzZSBlcnJvcic7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZXJyb3JfY29kZSgpLgorIworIyBSZXR1cm4gYW4gZXJyb3IgY29kZSBmb3IgYSBmYWlsZWQgcGFyc2UoKS4KKyMKK3N1YiBlcnJvcl9jb2RlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntfZXJyb3Jfc3RhdHVzfTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE1hcHBpbmcgYmV0d2VlbiBsZWdhY3kgbWV0aG9kIG5hbWVzIGFuZCBuZXcgbmFtZXMuCisjCit7CisgICAgbm8gd2FybmluZ3M7ICAgICMgSWdub3JlIHdhcm5pbmdzIGFib3V0IHZhcmlhYmxlcyB1c2VkIG9ubHkgb25jZS4KKyAgICAqUGFyc2UgPSAqcGFyc2U7Cit9CisKKzE7CisKK19fRU5EX18KKworPWhlYWQxIE5BTUUKKworU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgLSBSZWFkIGluZm9ybWF0aW9uIGZyb20gYW4gRXhjZWwgZmlsZS4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOworCisgICAgbXkgJHBhcnNlciAgID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPm5ldygpOworICAgIG15ICR3b3JrYm9vayA9ICRwYXJzZXItPnBhcnNlKCdCb29rMS54bHMnKTsKKworICAgIGlmICggIWRlZmluZWQgJHdvcmtib29rICkgeworICAgICAgICBkaWUgJHBhcnNlci0+ZXJyb3IoKSwgIi5cbiI7CisgICAgfQorCisgICAgZm9yIG15ICR3b3Jrc2hlZXQgKCAkd29ya2Jvb2stPndvcmtzaGVldHMoKSApIHsKKworICAgICAgICBteSAoICRyb3dfbWluLCAkcm93X21heCApID0gJHdvcmtzaGVldC0+cm93X3JhbmdlKCk7CisgICAgICAgIG15ICggJGNvbF9taW4sICRjb2xfbWF4ICkgPSAkd29ya3NoZWV0LT5jb2xfcmFuZ2UoKTsKKworICAgICAgICBmb3IgbXkgJHJvdyAoICRyb3dfbWluIC4uICRyb3dfbWF4ICkgeworICAgICAgICAgICAgZm9yIG15ICRjb2wgKCAkY29sX21pbiAuLiAkY29sX21heCApIHsKKworICAgICAgICAgICAgICAgIG15ICRjZWxsID0gJHdvcmtzaGVldC0+Z2V0X2NlbGwoICRyb3csICRjb2wgKTsKKyAgICAgICAgICAgICAgICBuZXh0IHVubGVzcyAkY2VsbDsKKworICAgICAgICAgICAgICAgIHByaW50ICJSb3csIENvbCAgICA9ICgkcm93LCAkY29sKVxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAiVmFsdWUgICAgICAgPSAiLCAkY2VsbC0+dmFsdWUoKSwgICAgICAgIlxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAiVW5mb3JtYXR0ZWQgPSAiLCAkY2VsbC0+dW5mb3JtYXR0ZWQoKSwgIlxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAiXG4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgbW9kdWxlIGNhbiBiZSB1c2VkIHRvIHJlYWQgaW5mb3JtYXRpb24gZnJvbSBFeGNlbCA5NS0yMDAzIGJpbmFyeSBmaWxlcy4KKworVGhlIG1vZHVsZSBjYW5ub3QgcmVhZCBmaWxlcyBpbiB0aGUgRXhjZWwgMjAwNyBPcGVuIFhNTCBYTFNYIGZvcm1hdC4gU2VlIHRoZSBMPFNwcmVhZHNoZWV0OjpYTFNYPiBtb2R1bGUgaW5zdGVhZC4KKworPWhlYWQxIFBhcnNlcgorCis9aGVhZDIgbmV3KCkKKworVGhlIEM8bmV3KCk+IG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsPiBwYXJzZXIgb2JqZWN0LgorCisgICAgbXkgJHBhcnNlciA9IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLT5uZXcoKTsKKworSXQgaXQgcG9zc2libGUgdG8gcGFzcyBhIHBhc3N3b3JkIHRvIGRlY3J5cHQgYW4gZW5jcnlwdGVkIGZpbGU6CisKKyAgICAkcGFyc2VyID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPm5ldyggUGFzc3dvcmQgPT4gJ3NlY3JldCcgKTsKKworT25seSB0aGUgZGVmYXVsdCBFeGNlbCBlbmNyeXB0aW9uIHNjaGVtZSBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLiBTZWUgTDwvRGVjcnlwdGlvbj4uCisKK0FzIGFuIGFkdmFuY2VkIGZlYXR1cmUgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwYXNzIGEgY2FsbC1iYWNrIGhhbmRsZXIgdG8gdGhlIHBhcnNlciB0byBjb250cm9sIHRoZSBwYXJzaW5nIG9mIHRoZSBzcHJlYWRzaGVldC4KKworICAgICRwYXJzZXIgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KAorICAgICAgICBDZWxsSGFuZGxlciA9PiBcJmNlbGxfaGFuZGxlciwKKyAgICAgICAgTm90U2V0Q2VsbCAgPT4gMSwKKyAgICApOworCitUaGUgY2FsbC1iYWNrIGNhbiBiZSB1c2VkIHRvIGlnbm9yZSBjZXJ0YWluIGNlbGxzIG9yIHRvIHJlZHVjZSBtZW1vcnkgdXNhZ2UuIFNlZSB0aGUgc2VjdGlvbiBMPFJlZHVjaW5nIHRoZSBtZW1vcnkgdXNhZ2Ugb2YgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisKKz1oZWFkMiBwYXJzZSgkZmlsZW5hbWUsICRmb3JtYXR0ZXIpCisKK1RoZSBQYXJzZXIgQzxwYXJzZSgpPiBtZXRob2QgcmV0dXJucyBhIEw8L1dvcmtib29rPiBvYmplY3QuCisKKyAgICBteSAkcGFyc2VyICAgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KCk7CisgICAgbXkgJHdvcmtib29rID0gJHBhcnNlci0+cGFyc2UoJ0Jvb2sxLnhscycpOworCitJZiBhbiBlcnJvciBvY2N1cnMgQzxwYXJzZSgpPiByZXR1cm5zIEM8dW5kZWY+LiBJbiBnZW5lcmFsLCBwcm9ncmFtcyBzaG91bGQgY29udGFpbiBhIHRlc3QgZm9yIGZhaWxlZCBwYXJzaW5nIGFzIGZvbGxvd3M6CisKKyAgICBteSAkcGFyc2VyICAgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KCk7CisgICAgbXkgJHdvcmtib29rID0gJHBhcnNlci0+cGFyc2UoJ0Jvb2sxLnhscycpOworCisgICAgaWYgKCAhZGVmaW5lZCAkd29ya2Jvb2sgKSB7CisgICAgICAgIGRpZSAkcGFyc2VyLT5lcnJvcigpLCAiLlxuIjsKKyAgICB9CisKK1RoZSBDPCRmaWxlbmFtZT4gcGFyYW1ldGVyIGlzIGdlbmVyYWxseSB0aGUgZmlsZSB0byBiZSBwYXJzZWQuIEhvd2V2ZXIsIGl0IGNhbiBhbHNvIGJlIGEgZmlsZWhhbmRsZSBvciBhIHNjYWxhciByZWZlcmVuY2UuCisKK1RoZSBvcHRpb25hbCBDPCRmb3JtYXR0ZXI+IHBhcmFtZXRlciBjYW4gYmUgYW4gcmVmZXJlbmNlIHRvIGEgTDwvRm9ybWF0dGVyIENsYXNzPiB0byBmb3JtYXQgdGhlIHZhbHVlIG9mIGNlbGxzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGFyc2luZyB3b3JrYm9va3Mgd2l0aCBVbmljb2RlIG9yIEFzaWFuIGNoYXJhY3RlcnM6CisKKyAgICBteSAkcGFyc2VyICAgID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPm5ldygpOworICAgIG15ICRmb3JtYXR0ZXIgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4tPm5ldygpOworICAgIG15ICR3b3JrYm9vayAgPSAkcGFyc2VyLT5wYXJzZSggJ0Jvb2sxLnhscycsICRmb3JtYXR0ZXIgKTsKKworVGhlIEw8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuPiBmb3JtYXR0ZXIgYWxzbyBzdXBwb3J0cyBVbmljb2RlLiBJZiB5b3UgZW5jb3VudGVyIGFueSBlbmNvZGluZyBwcm9ibGVtcyB3aXRoIHRoZSBkZWZhdWx0IGZvcm1hdHRlciB0cnkgdGhhdCBpbnN0ZWFkLgorCisKKz1oZWFkMiBlcnJvcigpCisKK1RoZSBQYXJzZXIgQzxlcnJvcigpPiBtZXRob2QgcmV0dXJucyBhbiBlcnJvciBzdHJpbmcgaWYgYSBDPHBhcnNlKCk+IGZhaWxzOgorCisgICAgbXkgJHBhcnNlciAgID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPm5ldygpOworICAgIG15ICR3b3JrYm9vayA9ICRwYXJzZXItPnBhcnNlKCdCb29rMS54bHMnKTsKKworICAgIGlmICggIWRlZmluZWQgJHdvcmtib29rICkgeworICAgICAgICBkaWUgJHBhcnNlci0+ZXJyb3IoKSwgIi5cbiI7CisgICAgfQorCitJZiB5b3Ugd2lzaCB0byBnZW5lcmF0ZSB5b3Ugb3duIGVycm9yIHN0cmluZyB5b3UgY2FuIHVzZSB0aGUgQzxlcnJvcl9jb2RlKCk+IG1ldGhvZCBpbnN0ZWFkIChzZWUgYmVsb3cpLiBUaGUgQzxlcnJvcigpPiBhbmQgQzxlcnJvcl9jb2RlKCk+IHZhbHVlcyBhcmUgYXMgZm9sbG93czoKKworICAgIGVycm9yKCkgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSgpCisgICAgPT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT0KKyAgICAnJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAnRmlsZSBub3QgZm91bmQnICAgICAgICAgICAgICAgIDEKKyAgICAnTm8gRXhjZWwgZGF0YSBmb3VuZCBpbiBmaWxlJyAgIDIKKyAgICAnRmlsZSBpcyBlbmNyeXB0ZWQnICAgICAgICAgICAgIDMKKworCitUaGUgQzxlcnJvcl9jb2RlKCk+IG1ldGhvZCBpcyBleHBsYWluZWQgYmVsb3cuCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIHdpbGwgdHJ5IHRvIGRlY3J5cHQgYW4gZW5jcnlwdGVkIEV4Y2VsIGZpbGUgdXNpbmcgdGhlIGRlZmF1bHQgcGFzc3dvcmQgb3IgYSB1c2VyIHN1cHBsaWVkIHBhc3N3b3JkIHBhc3NlZCB0byBDPG5ldygpPiwgc2VlIGFib3ZlLiBJZiB0aGVzZSBmYWlsIHRoZSBtb2R1bGUgd2lsbCByZXR1cm4gdGhlIEM8J0ZpbGUgaXMgZW5jcnlwdGVkJz4gZXJyb3IuIE9ubHkgdGhlIGRlZmF1bHQgRXhjZWwgZW5jcnlwdGlvbiBzY2hlbWUgaXMgY3VycmVudGx5IHN1cHBvcnRlZCwgc2VlIEw8L0RlY3J5cHRpb24+LgorCisKKz1oZWFkMiBlcnJvcl9jb2RlKCkKKworVGhlIFBhcnNlciBDPGVycm9yX2NvZGUoKT4gbWV0aG9kIHJldHVybnMgYW4gZXJyb3IgY29kZSBpZiBhIEM8cGFyc2UoKT4gZmFpbHM6CisKKyAgICBteSAkcGFyc2VyICAgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KCk7CisgICAgbXkgJHdvcmtib29rID0gJHBhcnNlci0+cGFyc2UoJ0Jvb2sxLnhscycpOworCisgICAgaWYgKCAhZGVmaW5lZCAkd29ya2Jvb2sgKSB7CisgICAgICAgIGRpZSAiR290IGVycm9yIGNvZGUgIiwgJHBhcnNlci0+ZXJyb3JfY29kZSwgIi5cbiI7CisgICAgfQorCitUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdpc2ggdG8gZW1wbG95IHlvdSBvd24gZXJyb3Igc3RyaW5ncyBvciBlcnJvciBoYW5kbGluZyBtZXRob2RzLgorCisKKz1oZWFkMSBXb3JrYm9vaworCitBIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Oldvcmtib29rPiBpcyBjcmVhdGVkIHZpYSB0aGUgQzxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbD4gQzxwYXJzZSgpPiBtZXRob2Q6CisKKyAgICBteSAkcGFyc2VyICAgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KCk7CisgICAgbXkgJHdvcmtib29rID0gJHBhcnNlci0+cGFyc2UoJ0Jvb2sxLnhscycpOworCitUaGUgbWFpbiBtZXRob2RzIG9mIHRoZSBXb3JrYm9vayBjbGFzcyBhcmU6CisKKyAgICAkd29ya2Jvb2stPndvcmtzaGVldHMoKQorICAgICR3b3JrYm9vay0+d29ya3NoZWV0KCkKKyAgICAkd29ya2Jvb2stPndvcmtzaGVldF9jb3VudCgpCisgICAgJHdvcmtib29rLT5nZXRfZmlsZW5hbWUoKQorCitUaGVzZSBtb3JlIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBvZiB0aGUgV29ya2Jvb2sgY2xhc3MgYXJlIG91dGxpbmVkIGJlbG93LiBUaGUgb3RoZXIsIGxlc3MgY29tbW9ubHkgdXNlZCwgbWV0aG9kcyBhcmUgZG9jdW1lbnRlZCBpbiBMPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQ+LgorCisKKz1oZWFkMiB3b3Jrc2hlZXRzKCkKKworUmV0dXJucyBhbiBhcnJheSBvZiBMPC9Xb3Jrc2hlZXQ+IG9iamVjdHMuIFRoaXMgd2FzIG1vc3QgY29tbW9ubHkgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHdvcmtzaGVldHMgaW4gYSB3b3JrYm9vazoKKworICAgIGZvciBteSAkd29ya3NoZWV0ICggJHdvcmtib29rLT53b3Jrc2hlZXRzKCkgKSB7CisgICAgICAgIC4uLgorICAgIH0KKworCis9aGVhZDIgd29ya3NoZWV0KCkKKworVGhlIEM8d29ya3NoZWV0KCk+IG1ldGhvZCByZXR1cm5zIGEgc2luZ2xlIEM8V29ya3NoZWV0PiBvYmplY3QgdXNpbmcgZWl0aGVyIGl0cyBuYW1lIG9yIGluZGV4OgorCisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+d29ya3NoZWV0KCdTaGVldDEnKTsKKyAgICAkd29ya3NoZWV0ID0gJHdvcmtib29rLT53b3Jrc2hlZXQoMCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlIHNoZWV0IG5hbWUgb3IgaW5kZXggZG9lc24ndCBleGlzdC4KKworCis9aGVhZDIgd29ya3NoZWV0X2NvdW50KCkKKworVGhlIEM8d29ya3NoZWV0X2NvdW50KCk+IG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgV29ya3NoZWV0IG9iamVjdHMgaW4gdGhlIFdvcmtib29rLgorCisgICAgbXkgJHdvcmtzaGVldF9jb3VudCA9ICR3b3JrYm9vay0+d29ya3NoZWV0X2NvdW50KCk7CisKKworPWhlYWQyIGdldF9maWxlbmFtZSgpCisKK1RoZSBDPGdldF9maWxlbmFtZSgpPiBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgRXhjZWwgZmlsZSBvZiBDPHVuZGVmPiBpZiB0aGUgZGF0YSB3YXMgcmVhZCBmcm9tIGEgZmlsZWhhbmRsZSByYXRoZXIgdGhhbiBhIGZpbGUuCisKKyAgICBteSAkZmlsZW5hbWUgPSAkd29ya2Jvb2stPmdldF9maWxlbmFtZSgpOworCisKKz1oZWFkMiBPdGhlciBXb3JrYm9vayBNZXRob2RzCisKK0ZvciBmdWxsIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMgYXZhaWxhYmxlIHZpYSBhIFdvcmtib29rIG9iamVjdCBzZWUgTDxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6V29ya2Jvb2s+LgorCis9aGVhZDEgV29ya3NoZWV0CisKK1RoZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQ+IGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgcHJvcGVydGllcyBvZiBhbiBFeGNlbCB3b3Jrc2hlZXQuCisKK0EgV29ya3NoZWV0IG9iamVjdCBpcyBvYnRhaW5lZCB2aWEgdGhlIEw8L3dvcmtzaGVldHMoKT4gb3IgTDwvd29ya3NoZWV0KCk+IG1ldGhvZHMuCisKKyAgICBmb3IgbXkgJHdvcmtzaGVldCAoICR3b3JrYm9vay0+d29ya3NoZWV0cygpICkgeworICAgICAgICAuLi4KKyAgICB9CisKKyAgICAjIE9yOgorCisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+d29ya3NoZWV0KCdTaGVldDEnKTsKKyAgICAkd29ya3NoZWV0ID0gJHdvcmtib29rLT53b3Jrc2hlZXQoMCk7CisKK1RoZSBtb3N0IGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBvZiB0aGUgV29ya3NoZWV0IGNsYXNzIGFyZToKKworICAgICR3b3Jrc2hlZXQtPmdldF9jZWxsKCkKKyAgICAkd29ya3NoZWV0LT5yb3dfcmFuZ2UoKQorICAgICR3b3Jrc2hlZXQtPmNvbF9yYW5nZSgpCisgICAgJHdvcmtzaGVldC0+Z2V0X25hbWUoKQorCitUaGUgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldCBjbGFzcyBleHBvc2VzIGEgbG90IG9mIG1ldGhvZHMgYnV0IGluIGdlbmVyYWwgdmVyeSBmZXcgYXJlIHJlcXVpcmVkIHVubGVzcyB5b3UgYXJlIHdyaXRpbmcgYW4gYWR2YW5jZWQgZmlsdGVyLgorCitUaGUgbW9zdCBjb21tb25seSB1c2VkIG1ldGhvZHMgYXJlIGRldGFpbGVkIGJlbG93LiBUaGUgb3RoZXJzIGFyZSBkb2N1bWVudGVkIGluIEw8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldD4uCisKKz1oZWFkMiBnZXRfY2VsbCgkcm93LCAkY29sKQorCitSZXR1cm4gdGhlIEw8L0NlbGw+IG9iamVjdCBhdCByb3cgQzwkcm93PiBhbmQgY29sdW1uIEM8JGNvbD4gaWYgaXQgaXMgZGVmaW5lZC4gT3RoZXJ3aXNlIHJldHVybnMgdW5kZWYuCisKKyAgICBteSAkY2VsbCA9ICR3b3Jrc2hlZXQtPmdldF9jZWxsKCRyb3csICRjb2wpOworCisKKz1oZWFkMiByb3dfcmFuZ2UoKQorCitSZXR1cm5zIGEgdHdvLWVsZW1lbnQgbGlzdCBDPCgkbWluLCAkbWF4KT4gY29udGFpbmluZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkZWZpbmVkIHJvd3MgaW4gdGhlIHdvcmtzaGVldC4gSWYgdGhlcmUgaXMgbm8gcm93IGRlZmluZWQgQzwkbWF4PiBpcyBzbWFsbGVyIHRoYW4gQzwkbWluPi4KKworICAgIG15ICggJHJvd19taW4sICRyb3dfbWF4ICkgPSAkd29ya3NoZWV0LT5yb3dfcmFuZ2UoKTsKKworCis9aGVhZDIgY29sX3JhbmdlKCkKKworUmV0dXJucyBhIHR3by1lbGVtZW50IGxpc3QgQzwoJG1pbiwgJG1heCk+IGNvbnRhaW5pbmcgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gb2YgZGVmaW5lZCBjb2x1bW5zIGluIHRoZSB3b3Jrc2hlZXQuIElmIHRoZXJlIGlzIG5vIGNvbHVtbiBkZWZpbmVkIEM8JG1heD4gaXMgc21hbGxlciB0aGFuIEM8JG1pbj4uCisKKyAgICBteSAoICRjb2xfbWluLCAkY29sX21heCApID0gJHdvcmtzaGVldC0+Y29sX3JhbmdlKCk7CisKKworPWhlYWQyIGdldF9uYW1lKCkKKworVGhlIEM8Z2V0X25hbWUoKT4gbWV0aG9kIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHdvcmtzaGVldCwgc3VjaCBhcyAnU2hlZXQxJy4KKworICAgIG15ICRuYW1lID0gJHdvcmtzaGVldC0+Z2V0X25hbWUoKTsKKworPWhlYWQyIE90aGVyIFdvcmtzaGVldCBNZXRob2RzCisKK0ZvciBvdGhlciwgbGVzcyBjb21tb25seSB1c2VkLCBXb3Jrc2hlZXQgbWV0aG9kcyBzZWUgTDxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6V29ya3NoZWV0Pi4KKworPWhlYWQxIENlbGwKKworVGhlIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkNlbGw+IGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIG1haW4gbWV0aG9kcy4KKworICAgICRjZWxsLT52YWx1ZSgpCisgICAgJGNlbGwtPnVuZm9ybWF0dGVkKCkKKworPWhlYWQyIHZhbHVlKCkKKworVGhlIEM8dmFsdWUoKT4gbWV0aG9kIHJldHVybnMgdGhlIGZvcm1hdHRlZCB2YWx1ZSBvZiB0aGUgY2VsbC4KKworICAgIG15ICR2YWx1ZSA9ICRjZWxsLT52YWx1ZSgpOworCitGb3JtYXR0ZWQgaW4gdGhpcyBzZW5zZSByZWZlcnMgdG8gdGhlIG51bWVyaWMgZm9ybWF0IG9mIHRoZSBjZWxsIHZhbHVlLiBGb3IgZXhhbXBsZSBhIG51bWJlciBzdWNoIGFzIDQwMTc3IG1pZ2h0IGJlIGZvcm1hdHRlZCBhcyA0MCwxMTcsIDQwMTE3LjAwMCBvciBldmVuIGFzIHRoZSBkYXRlIDIwMDkvMTIvMzAuCisKK0lmIHRoZSBjZWxsIGRvZXNuJ3QgY29udGFpbiBhIG51bWVyaWMgZm9ybWF0IHRoZW4gdGhlIGZvcm1hdHRlZCBhbmQgdW5mb3JtYXR0ZWQgY2VsbCB2YWx1ZXMgYXJlIHRoZSBzYW1lLCBzZWUgdGhlIEM8dW5mb3JtYXR0ZWQoKT4gbWV0aG9kIGJlbG93LgorCitGb3IgYSBkZWZpbmVkIEM8JGNlbGw+IHRoZSBDPHZhbHVlKCk+IG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KKworSW4gdGhlIGNhc2Ugb2YgYSBjZWxsIHdpdGggZm9ybWF0dGluZyBidXQgbm8gbnVtZXJpYyBvciBzdHJpbmcgY29udGVudHMgdGhlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nIEM8Jyc+LgorCisKKz1oZWFkMiB1bmZvcm1hdHRlZCgpCisKK1RoZSBDPHVuZm9ybWF0dGVkKCk+IG1ldGhvZCByZXR1cm5zIHRoZSB1bmZvcm1hdHRlZCB2YWx1ZSBvZiB0aGUgY2VsbC4KKworICAgIG15ICR1bmZvcm1hdHRlZCA9ICRjZWxsLT51bmZvcm1hdHRlZCgpOworCitSZXR1cm5zIHRoZSBjZWxsIHZhbHVlIHdpdGhvdXQgYSBudW1lcmljIGZvcm1hdC4gU2VlIHRoZSBDPHZhbHVlKCk+IG1ldGhvZCBhYm92ZS4KKworPWhlYWQyIE90aGVyIENlbGwgTWV0aG9kcworCitGb3Igb3RoZXIsIGxlc3MgY29tbW9ubHkgdXNlZCwgV29ya3NoZWV0IG1ldGhvZHMgc2VlIEw8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkNlbGw+LgorCisKKz1oZWFkMSBGb3JtYXQKKworVGhlIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZvcm1hdD4gY2xhc3MgaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKworPWhlYWQyIEZvcm1hdCBwcm9wZXJ0aWVzCisKKyAgICAkZm9ybWF0LT57Rm9udH0KKyAgICAkZm9ybWF0LT57QWxpZ25IfQorICAgICRmb3JtYXQtPntBbGlnblZ9CisgICAgJGZvcm1hdC0+e0luZGVudH0KKyAgICAkZm9ybWF0LT57V3JhcH0KKyAgICAkZm9ybWF0LT57U2hyaW5rfQorICAgICRmb3JtYXQtPntSb3RhdGV9CisgICAgJGZvcm1hdC0+e0p1c3RMYXN0fQorICAgICRmb3JtYXQtPntSZWFkRGlyfQorICAgICRmb3JtYXQtPntCZHJTdHlsZX0KKyAgICAkZm9ybWF0LT57QmRyQ29sb3J9CisgICAgJGZvcm1hdC0+e0JkckRpYWd9CisgICAgJGZvcm1hdC0+e0ZpbGx9CisgICAgJGZvcm1hdC0+e0xvY2t9CisgICAgJGZvcm1hdC0+e0hpZGRlbn0KKyAgICAkZm9ybWF0LT57U3R5bGV9CisKK1RoZXNlIHByb3BlcnRpZXMgYXJlIGdlbmVyYWxseSBvbmx5IG9mIGludGVyZXN0IHRvIGFkdmFuY2VkIHVzZXJzLiBDYXN1YWwgdXNlcnMgY2FuIHNraXAgdGhpcyBzZWN0aW9uLgorCis9aGVhZDIgJGZvcm1hdC0+e0ZvbnR9CisKK1JldHVybnMgdGhlIEw8L0ZvbnQ+IG9iamVjdCBmb3IgdGhlIEZvcm1hdC4KKworPWhlYWQyICRmb3JtYXQtPntBbGlnbkh9CisKK1JldHVybnMgdGhlIGhvcml6b250YWwgYWxpZ25tZW50IG9mIHRoZSBmb3JtYXQgd2hlcmUgdGhlIHZhbHVlIGhhcyB0aGUgZm9sbG93aW5nIG1lYW5pbmc6CisKKyAgICAwID0+IE5vIGFsaWdubWVudAorICAgIDEgPT4gTGVmdAorICAgIDIgPT4gQ2VudGVyCisgICAgMyA9PiBSaWdodAorICAgIDQgPT4gRmlsbAorICAgIDUgPT4gSnVzdGlmeQorICAgIDYgPT4gQ2VudGVyIGFjcm9zcworICAgIDcgPT4gRGlzdHJpYnV0ZWQvRXF1YWwgc3BhY2VkCisKKz1oZWFkMiAkZm9ybWF0LT57QWxpZ25WfQorCitSZXR1cm5zIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgdGhlIGZvcm1hdCB3aGVyZSB0aGUgdmFsdWUgaGFzIHRoZSBmb2xsb3dpbmcgbWVhbmluZzoKKworICAgIDAgPT4gVG9wCisgICAgMSA9PiBDZW50ZXIKKyAgICAyID0+IEJvdHRvbQorICAgIDMgPT4gSnVzdGlmeQorICAgIDQgPT4gRGlzdHJpYnV0ZWQvRXF1YWwgc3BhY2VkCisKKz1oZWFkMiAkZm9ybWF0LT57SW5kZW50fQorCitSZXR1cm5zIHRoZSBpbmRlbnQgbGV2ZWwgb2YgdGhlIEM8TGVmdD4gaG9yaXpvbnRhbCBhbGlnbm1lbnQuCisKKz1oZWFkMiAkZm9ybWF0LT57V3JhcH0KKworUmV0dXJucyB0cnVlIGlmIHRleHR3cmFwIGlzIG9uLgorCis9aGVhZDIgJGZvcm1hdC0+e1Nocmlua30KKworUmV0dXJucyB0cnVlIGlmICJTaHJpbmsgdG8gZml0IiBpcyBzZXQgZm9yIHRoZSBmb3JtYXQuCisKKz1oZWFkMiAkZm9ybWF0LT57Um90YXRlfQorCitSZXR1cm5zIHRoZSB0ZXh0IHJvdGF0aW9uLiBJbiBFeGNlbDk3KywgaXQgcmV0dXJucyB0aGUgYW5nbGUgaW4gZGVncmVlcyBvZiB0aGUgdGV4dCByb3RhdGlvbi4KKworSW4gRXhjZWw5NSBvciBlYXJsaWVyIGl0IHJldHVybnMgYSB2YWx1ZSBhcyBmb2xsb3dzOgorCisgICAgMCA9PiBObyByb3RhdGlvbgorICAgIDEgPT4gVG9wIGRvd24KKyAgICAyID0+IDkwIGRlZ3JlZXMgYW50aS1jbG9ja3dpc2UsCisgICAgMyA9PiA5MCBjbG9ja3dpc2UKKworPWhlYWQyICRmb3JtYXQtPntKdXN0TGFzdH0KKworUmV0dXJuIHRydWUgaWYgdGhlICJqdXN0aWZ5IGxhc3QiIHByb3BlcnR5IGlzIHNldCBmb3IgdGhlIGZvcm1hdC4KKworPWhlYWQyICRmb3JtYXQtPntSZWFkRGlyfQorCitSZXR1cm5zIHRoZSBkaXJlY3Rpb24gdGhhdCB0aGUgdGV4dCBpcyByZWFkIGZyb20uCisKKz1oZWFkMiAkZm9ybWF0LT57QmRyU3R5bGV9CisKK1JldHVybnMgYW4gYXJyYXkgcmVmIG9mIGJvcmRlciBzdHlsZXMgYXMgZm9sbG93czoKKworICAgIFsgJGxlZnQsICRyaWdodCwgJHRvcCwgJGJvdHRvbSBdCisKKz1oZWFkMiAkZm9ybWF0LT57QmRyQ29sb3J9CisKK1JldHVybnMgYW4gYXJyYXkgcmVmIG9mIGJvcmRlciBjb2xvciBpbmRleGVzIGFzIGZvbGxvd3M6CisKKyAgICBbICRsZWZ0LCAkcmlnaHQsICR0b3AsICRib3R0b20gXQorCis9aGVhZDIgJGZvcm1hdC0+e0JkckRpYWd9CisKK1JldHVybnMgYW4gYXJyYXkgcmVmIG9mIGRpYWdvbmFsIGJvcmRlciBraW5kLCBzdHlsZSBhbmQgY29sb3IgaW5kZXggYXMgZm9sbG93czoKKworICAgIFska2luZCwgJHN0eWxlLCAkY29sb3IgXQorCitXaGVyZSBraW5kIGlzOgorCisgICAgMCA9PiBOb25lCisgICAgMSA9PiBSaWdodC1Eb3duCisgICAgMiA9PiBSaWdodC1VcAorICAgIDMgPT4gQm90aAorCis9aGVhZDIgJGZvcm1hdC0+e0ZpbGx9CisKK1JldHVybnMgYW4gYXJyYXkgcmVmIG9mIGZpbGwgcGF0dGVybiBhbmQgY29sb3IgaW5kZXhlcyBhcyBmb2xsb3dzOgorCisgICAgWyAkcGF0dGVybiwgJGZyb250X2NvbG9yLCAkYmFja19jb2xvciBdCisKKz1oZWFkMiAkZm9ybWF0LT57TG9ja30KKworUmV0dXJucyB0cnVlIGlmIHRoZSBjZWxsIGlzIGxvY2tlZC4KKworPWhlYWQyICRmb3JtYXQtPntIaWRkZW59CisKK1JldHVybnMgdHJ1ZSBpZiB0aGUgY2VsbCBpcyBIaWRkZW4uCisKKz1oZWFkMiAkZm9ybWF0LT57U3R5bGV9CisKK1JldHVybnMgdHJ1ZSBpZiB0aGUgZm9ybWF0IGlzIGEgU3R5bGUgZm9ybWF0LgorCisKKworCis9aGVhZDEgRm9udAorCitJPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGb250PgorCitGb3JtYXQgY2xhc3MgaGFzIHRoZXNlIHByb3BlcnRpZXM6CisKKz1oZWFkMSBGb250IFByb3BlcnRpZXMKKworICAgICRmb250LT57TmFtZX0KKyAgICAkZm9udC0+e0JvbGR9CisgICAgJGZvbnQtPntJdGFsaWN9CisgICAgJGZvbnQtPntIZWlnaHR9CisgICAgJGZvbnQtPntVbmRlcmxpbmV9CisgICAgJGZvbnQtPntVbmRlcmxpbmVTdHlsZX0KKyAgICAkZm9udC0+e0NvbG9yfQorICAgICRmb250LT57U3RyaWtlb3V0fQorICAgICRmb250LT57U3VwZXJ9CisKKz1oZWFkMiAkZm9udC0+e05hbWV9CisKK1JldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZvbnQsIGZvciBleGFtcGxlICdBcmlhbCcuCisKKz1oZWFkMiAkZm9udC0+e0JvbGR9CisKK1JldHVybnMgdHJ1ZSBpZiB0aGUgZm9udCBpcyBib2xkLgorCis9aGVhZDIgJGZvbnQtPntJdGFsaWN9CisKK1JldHVybnMgdHJ1ZSBpZiB0aGUgZm9udCBpcyBpdGFsaWMuCisKKz1oZWFkMiAkZm9udC0+e0hlaWdodH0KKworUmV0dXJucyB0aGUgc2l6ZSAoaGVpZ2h0KSBvZiB0aGUgZm9udC4KKworPWhlYWQyICRmb250LT57VW5kZXJsaW5lfQorCitSZXR1cm5zIHRydWUgaWYgdGhlIGZvbnQgaW4gdW5kZXJsaW5lZC4KKworPWhlYWQyICRmb250LT57VW5kZXJsaW5lU3R5bGV9CisKK1JldHVybnMgdGhlIHN0eWxlIG9mIGFuIHVuZGVybGluZWQgZm9udCB3aGVyZSB0aGUgdmFsdWUgaGFzIHRoZSBmb2xsb3dpbmcgbWVhbmluZzoKKworICAgICAwID0+IE5vbmUKKyAgICAgMSA9PiBTaW5nbGUKKyAgICAgMiA9PiBEb3VibGUKKyAgICAzMyA9PiBTaW5nbGUgYWNjb3VudGluZworICAgIDM0ID0+IERvdWJsZSBhY2NvdW50aW5nCisKKz1oZWFkMiAkZm9udC0+e0NvbG9yfQorCitSZXR1cm5zIHRoZSBjb2xvciBpbmRleCBmb3IgdGhlIGZvbnQuIFRoZSBpbmRleCBjYW4gYmUgY29udmVydGVkIHRvIGEgUkdCIHN0cmluZyB1c2luZyB0aGUgQzxDb2xvcklkeFRvUkdCKCk+IFBhcnNlciBtZXRob2QuCisKKz1oZWFkMiAkZm9udC0+e1N0cmlrZW91dH0KKworUmV0dXJucyB0cnVlIGlmIHRoZSBmb250IGhhcyB0aGUgc3RyaWtlb3V0IHByb3BlcnR5IHNldC4KKworPWhlYWQyICRmb250LT57U3VwZXJ9CisKK1JldHVybnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGlmIHRoZSBzdXBlcnNjcmlwdCBvciBzdWJzY3JpcHQgcHJvcGVydHkgb2YgdGhlIGZvbnQgaXMgc2V0OgorCisgICAgMCA9PiBOb25lCisgICAgMSA9PiBTdXBlcnNjcmlwdAorICAgIDIgPT4gU3Vic2NyaXB0CisKKz1oZWFkMSBGb3JtYXR0ZXIgQ2xhc3MKKworRm9ybWF0dGVycyBjYW4gYmUgcGFzc2VkIHRvIHRoZSBDPHBhcnNlKCk+IG1ldGhvZCB0byBkZWFsIHdpdGggVW5pY29kZSBvciBBc2lhbiBmb3JtYXR0aW5nLgorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCBpbmNsdWRlcyAyIGZvcm1hdHRlciBjbGFzc2VzLiBDPEZtdERlZmF1bHQ+IGFuZCBDPEZtdEphcGFuZXNlPi4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYSB1c2VyIGRlZmluZWQgZm9ybWF0dGluZyBjbGFzcy4KKworVGhlIGZvcm1hdHRlciBjbGFzcyBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXQqPiBzaG91bGQgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKworCis9aGVhZDIgQ2hrVHlwZSgkc2VsZiwgJGlzX251bWVyaWMsICRmb3JtYXRfaW5kZXgpCisKK01ldGhvZCB0byBjaGVjayB0aGUgdHlwZSBvZiBkYXRhIGluIHRoZSBjZWxsLiBTaG91bGQgcmV0dXJuIEM8RGF0ZT4sIEM8TnVtZXJpYz4gb3IgQzxUZXh0Pi4gSXQgaXMgcGFzc2VkIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworPW92ZXIKKworPWl0ZW0gJHNlbGYKKworQSBzY2FsYXIgcmVmZXJlbmNlIHRvIHRoZSBGb3JtYXR0ZXIgb2JqZWN0LgorCis9aXRlbSAkaXNfbnVtZXJpYworCitJZiB0cnVlLCB0aGUgdmFsdWUgc2VlbXMgdG8gYmUgbnVtYmVyLgorCis9aXRlbSAkZm9ybWF0X2luZGV4CisKK1RoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjZWxsIEZvcm1hdCBvYmplY3QuCisKKz1iYWNrCisKKz1oZWFkMiBUZXh0Rm10KCRzZWxmLCAkc3RyaW5nX2RhdGEsICRzdHJpbmdfZW5jb2RpbmcpCisKK0NvbnZlcnRzIHRoZSBzdHJpbmcgZGF0YSBpbiB0aGUgY2VsbCBpbnRvIHRoZSBjb3JyZWN0IGVuY29kaW5nLiAgSXQgaXMgcGFzc2VkIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworPW92ZXIKKworPWl0ZW0gJHNlbGYKKworQSBzY2FsYXIgcmVmZXJlbmNlIHRvIHRoZSBGb3JtYXR0ZXIgb2JqZWN0LgorCis9aXRlbSAkc3RyaW5nX2RhdGEKKworVGhlIG9yaWdpbmFsIHN0cmluZy90ZXh0IGRhdGEuCisKKz1pdGVtICRzdHJpbmdfZW5jb2RpbmcKKworVGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiBvcmlnaW5hbCBzdHJpbmcvdGV4dC4KKworPWJhY2sKKworPWhlYWQyIFZhbEZtdCgkc2VsZiwgJGNlbGwsICR3b3JrYm9vaykKKworQ29udmVydCB0aGUgb3JpZ2luYWwgdW5mb3JtYXR0ZWQgY2VsbCB2YWx1ZSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXR0ZWQgdmFsdWUuIEZvciBpbnN0YW5jZSB0dXJuIGEgbnVtYmVyIGludG8gYSBmb3JtYXR0ZWQgZGF0ZS4gIEl0IGlzIHBhc3NlZCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisKKz1vdmVyCisKKz1pdGVtICRzZWxmCisKK0Egc2NhbGFyIHJlZmVyZW5jZSB0byB0aGUgRm9ybWF0dGVyIG9iamVjdC4KKworPWl0ZW0gJGNlbGwKKworQSBzY2FsYXIgcmVmZXJlbmNlIHRvIHRoZSBDZWxsIG9iamVjdC4KKworPWl0ZW0gJHdvcmtib29rCisKK0Egc2NhbGFyIHJlZmVyZW5jZSB0byB0aGUgV29ya2Jvb2sgb2JqZWN0LgorCis9YmFjaworCisKKz1oZWFkMiBGbXRTdHJpbmcoJHNlbGYsICRjZWxsLCAkd29ya2Jvb2spCisKK0dldCB0aGUgZm9ybWF0IHN0cmluZyBmb3IgdGhlIENlbGwuICBJdCBpcyBwYXNzZWQgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorCis9b3ZlcgorCis9aXRlbSAkc2VsZgorCitBIHNjYWxhciByZWZlcmVuY2UgdG8gdGhlIEZvcm1hdHRlciBvYmplY3QuCisKKz1pdGVtICRjZWxsCisKK0Egc2NhbGFyIHJlZmVyZW5jZSB0byB0aGUgQ2VsbCBvYmplY3QuCisKKz1pdGVtICR3b3JrYm9vaworCitBIHNjYWxhciByZWZlcmVuY2UgdG8gdGhlIFdvcmtib29rIG9iamVjdC4KKworPWJhY2sKKworCis9aGVhZDEgUmVkdWNpbmcgdGhlIG1lbW9yeSB1c2FnZSBvZiBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbAorCitJbiBzb21lIGNhc2VzIGEgQzxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbD4gYXBwbGljYXRpb24gbWF5IGNvbnN1bWUgYSBsb3Qgb2YgbWVtb3J5IHdoZW4gcHJvY2Vzc2luZyBhIGxhcmdlIEV4Y2VsIGZpbGUgYW5kLCBhcyBhIHJlc3VsdCwgbWF5IGZhaWwgdG8gY29tcGxldGUuIFRoZSBmb2xsb3dpbmcgZXhwbGFpbnMgd2h5IHRoaXMgY2FuIG9jY3VyIGFuZCBob3cgdG8gcmVzb2x2ZSBpdC4KKworQzxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbD4gcHJvY2Vzc2VzIGFuIEV4Y2VsIGZpbGUgaW4gdHdvIHN0YWdlcy4gSW4gdGhlIGZpcnN0IHN0YWdlIGl0IGV4dHJhY3RzIHRoZSBFeGNlbCBiaW5hcnkgc3RyZWFtIGZyb20gdGhlIE9MRSBjb250YWluZXIgZmlsZSB1c2luZyBDPE9MRTo6U3RvcmFnZV9MaXRlPi4gSW4gdGhlIHNlY29uZCBzdGFnZSBpdCBwYXJzZXMgdGhlIGJpbmFyeSBzdHJlYW0gdG8gcmVhZCB3b3JrYm9vaywgd29ya3NoZWV0IGFuZCBjZWxsIGRhdGEgd2hpY2ggaXQgdGhlbiBzdG9yZXMgaW4gbWVtb3J5LiBUaGUgbWFqb3JpdHkgb2YgdGhlIG1lbW9yeSB1c2FnZSBpcyByZXF1aXJlZCBmb3Igc3RvcmluZyBjZWxsIGRhdGEuCisKK1RoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBhcyB0aGUgRXhjZWwgZmlsZSBpcyBwYXJzZWQgYW5kIGVhY2ggY2VsbCBpcyBlbmNvdW50ZXJlZCBhIGNlbGwgaGFuZGxpbmcgZnVuY3Rpb24gY3JlYXRlcyBhIHJlbGF0aXZlbHkgbGFyZ2UgbmVzdGVkIGNlbGwgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNlbGwgdmFsdWUgYW5kIGFsbCBvZiB0aGUgZGF0YSB0aGF0IHJlbGF0ZXMgdG8gdGhlIGNlbGwgZm9ybWF0dGluZy4gRm9yIGxhcmdlIGZpbGVzIChhIDEwTUIgRXhjZWwgZmlsZSBvbiBhIDI1Nk1CIHN5c3RlbSkgdGhpcyBvdmVyaGVhZCBjYW4gY2F1c2UgdGhlIHN5c3RlbSB0byBncmluZCB0byBhIGhhbHQuCisKK0hvd2V2ZXIsIGluIGEgbG90IG9mIGNhc2VzIHdoZW4gYW4gRXhjZWwgZmlsZSBpcyBiZWluZyBwcm9jZXNzZWQgdGhlIG9ubHkgaW5mb3JtYXRpb24gdGhhdCBpcyByZXF1aXJlZCBhcmUgdGhlIGNlbGwgdmFsdWVzLiBJbiB0aGVzZSBjYXNlcyBpdCBpcyBwb3NzaWJsZSB0byBhdm9pZCBtb3N0IG9mIHRoZSBtZW1vcnkgb3ZlcmhlYWQgYnkgc3BlY2lmeWluZyB5b3VyIG93biBjZWxsIGhhbmRsaW5nIGZ1bmN0aW9uIGFuZCBieSB0ZWxsaW5nIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIG5vdCB0byBzdG9yZSB0aGUgcGFyc2VkIGNlbGwgZGF0YS4gVGhpcyBpcyBhY2hpZXZlZCBieSBwYXNzaW5nIGEgY2VsbCBoYW5kbGVyIGZ1bmN0aW9uIHRvIEM8bmV3KCk+IHdoZW4gY3JlYXRpbmcgdGhlIHBhcnNlIG9iamVjdC4gSGVyZSBpcyBhbiBleGFtcGxlLgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDsKKworICAgIG15ICRwYXJzZXIgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KAorICAgICAgICBDZWxsSGFuZGxlciA9PiBcJmNlbGxfaGFuZGxlciwKKyAgICAgICAgTm90U2V0Q2VsbCAgPT4gMQorICAgICk7CisKKyAgICBteSAkd29ya2Jvb2sgPSAkcGFyc2VyLT5wYXJzZSgnZmlsZS54bHMnKTsKKworICAgIHN1YiBjZWxsX2hhbmRsZXIgeworCisgICAgICAgIG15ICR3b3JrYm9vayAgICA9ICRfWzBdOworICAgICAgICBteSAkc2hlZXRfaW5kZXggPSAkX1sxXTsKKyAgICAgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMl07CisgICAgICAgIG15ICRjb2wgICAgICAgICA9ICRfWzNdOworICAgICAgICBteSAkY2VsbCAgICAgICAgPSAkX1s0XTsKKworICAgICAgICAjIERvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aGUgZm9ybWF0dGVkIGNlbGwgdmFsdWUKKyAgICAgICAgcHJpbnQgJGNlbGwtPnZhbHVlKCksICJcbiI7CisKKyAgICB9CisKKworVGhlIHVzZXIgc3BlY2lmaWVkIGNlbGwgaGFuZGxlciBpcyBwYXNzZWQgYXMgYSBjb2RlIHJlZmVyZW5jZSB0byBDPG5ldygpPiBhbG9uZyB3aXRoIHRoZSBwYXJhbWV0ZXIgQzxOb3RTZXRDZWxsPiB3aGljaCB0ZWxscyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCBub3QgdG8gc3RvcmUgdGhlIHBhcnNlZCBjZWxsLiBOb3RlLCB5b3UgZG9uJ3QgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIHJvd3MgYW5kIGNvbHVtbnMsIHRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGFzIHBhcnQgb2YgdGhlIHBhcnNpbmcuCisKK1RoZSBjZWxsIGhhbmRsZXIgaXMgcGFzc2VkIDUgYXJndW1lbnRzLiBUaGUgZmlyc3QsIEM8JHdvcmtib29rPiwgaXMgYSByZWZlcmVuY2UgdG8gdGhlIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Oldvcmtib29rPiBvYmplY3QgdGhhdCByZXByZXNlbnQgdGhlIHBhcnNlZCB3b3JrYm9vay4gVGhpcyBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgYW55IG9mIHRoZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3JrYm9vaz4gbWV0aG9kcywgc2VlIEw8L1dvcmtib29rPi4gVGhlIHNlY29uZCBDPCRzaGVldF9pbmRleD4gaXMgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHdvcmtzaGVldCBiZWluZyBwYXJzZWQuIFRoZSB0aGlyZCBhbmQgZm91cnRoLCBDPCRyb3c+IGFuZCBDPCRjb2w+LCBhcmUgdGhlIHplcm8tYmFzZWQgcm93IGFuZCBjb2x1bW4gbnVtYmVyIG9mIHRoZSBjZWxsLiBUaGUgZmlmdGgsIEM8JGNlbGw+LCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgQzxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Q2VsbD4gb2JqZWN0LiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgZGF0YSBmcm9tIHRoZSBjZWxsLiBTZWUgTDwvQ2VsbD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1RoaXMgdGVjaG5pcXVlIGNhbiBiZSB1c2VmdWwgaWYgeW91IGFyZSB3cml0aW5nIGFuIEV4Y2VsIHRvIGRhdGFiYXNlIGZpbHRlciBzaW5jZSB5b3UgY2FuIHB1dCB5b3VyIERCIGNhbGxzIGluIHRoZSBjZWxsIGhhbmRsZXIuCisKK0lmIHlvdSBkb24ndCB3YW50IGFsbCBvZiB0aGUgZGF0YSBpbiB0aGUgc3ByZWFkc2hlZXQgeW91IGNhbiBhZGQgc29tZSBjb250cm9sIGxvZ2ljIHRvIHRoZSBjZWxsIGhhbmRsZXIuIEZvciBleGFtcGxlIHdlIGNhbiBleHRlbmQgdGhlIHByZXZpb3VzIGV4YW1wbGUgc28gdGhhdCBpdCBvbmx5IHByaW50cyB0aGUgZmlyc3QgMTAgcm93cyBvZiB0aGUgZmlyc3QgdHdvIHdvcmtzaGVldHMgaW4gdGhlIHBhcnNlZCB3b3JrYm9vayBieSBhZGRpbmcgc29tZSBDPGlmKCk+IHN0YXRlbWVudHMgdG8gdGhlIGNlbGwgaGFuZGxlcjoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw7CisKKyAgICBteSAkcGFyc2VyID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPm5ldygKKyAgICAgICAgQ2VsbEhhbmRsZXIgPT4gXCZjZWxsX2hhbmRsZXIsCisgICAgICAgIE5vdFNldENlbGwgID0+IDEKKyAgICApOworCisgICAgbXkgJHdvcmtib29rID0gJHBhcnNlci0+cGFyc2UoJ2ZpbGUueGxzJyk7CisKKyAgICBzdWIgY2VsbF9oYW5kbGVyIHsKKworICAgICAgICBteSAkd29ya2Jvb2sgICAgPSAkX1swXTsKKyAgICAgICAgbXkgJHNoZWV0X2luZGV4ID0gJF9bMV07CisgICAgICAgIG15ICRyb3cgICAgICAgICA9ICRfWzJdOworICAgICAgICBteSAkY29sICAgICAgICAgPSAkX1szXTsKKyAgICAgICAgbXkgJGNlbGwgICAgICAgID0gJF9bNF07CisKKyAgICAgICAgIyBTa2lwIHNvbWUgd29ya3NoZWV0cyBhbmQgcm93cyAoaW5lZmZpY2llbnRseSkuCisgICAgICAgIHJldHVybiBpZiAkc2hlZXRfaW5kZXggPj0gMzsKKyAgICAgICAgcmV0dXJuIGlmICRyb3cgPj0gMTA7CisKKyAgICAgICAgIyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgZm9ybWF0dGVkIGNlbGwgdmFsdWUKKyAgICAgICAgcHJpbnQgJGNlbGwtPnZhbHVlKCksICJcbiI7CisKKyAgICB9CisKKworSG93ZXZlciwgdGhpcyBzdGlsbCBwcm9jZXNzZXMgdGhlIGVudGlyZSB3b3JrYm9vay4gSWYgeW91IHdpc2ggdG8gc2F2ZSBzb21lIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyB0aW1lIHlvdSBjYW4gYWJvcnQgdGhlIHBhcnNpbmcgYWZ0ZXIgeW91IGhhdmUgcmVhZCB0aGUgZGF0YSB0aGF0IHlvdSB3YW50LCB1c2luZyB0aGUgd29ya2Jvb2sgQzxQYXJzZUFib3J0PiBtZXRob2Q6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOworCisgICAgbXkgJHBhcnNlciA9IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLT5uZXcoCisgICAgICAgIENlbGxIYW5kbGVyID0+IFwmY2VsbF9oYW5kbGVyLAorICAgICAgICBOb3RTZXRDZWxsICA9PiAxCisgICAgKTsKKworICAgIG15ICR3b3JrYm9vayA9ICRwYXJzZXItPnBhcnNlKCdmaWxlLnhscycpOworCisgICAgc3ViIGNlbGxfaGFuZGxlciB7CisKKyAgICAgICAgbXkgJHdvcmtib29rICAgID0gJF9bMF07CisgICAgICAgIG15ICRzaGVldF9pbmRleCA9ICRfWzFdOworICAgICAgICBteSAkcm93ICAgICAgICAgPSAkX1syXTsKKyAgICAgICAgbXkgJGNvbCAgICAgICAgID0gJF9bM107CisgICAgICAgIG15ICRjZWxsICAgICAgICA9ICRfWzRdOworCisgICAgICAgICMgU2tpcCBzb21lIHdvcmtzaGVldHMgYW5kIHJvd3MgKG1vcmUgZWZmaWNpZW50bHkpLgorICAgICAgICBpZiAoICRzaGVldF9pbmRleCA+PSAxIGFuZCAkcm93ID49IDEwICkgeworICAgICAgICAgICAgJHdvcmtib29rLT5QYXJzZUFib3J0KDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgIyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgZm9ybWF0dGVkIGNlbGwgdmFsdWUKKyAgICAgICAgcHJpbnQgJGNlbGwtPnZhbHVlKCksICJcbiI7CisKKyAgICB9CisKKz1oZWFkMSBEZWNyeXB0aW9uCisKK0lmIGEgd29ya2Jvb2sgaXMgInByb3RlY3RlZCIgdGhlbiBFeGNlbCB3aWxsIGVuY3J5cHQgdGhlIGZpbGUgd2hldGhlciBhIHBhc3N3b3JkIGlzIHN1cHBsaWVkIG9yIG5vdC4gQXMgb2YgdmVyc2lvbiAwLjU5IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIHN1cHBvcnRzIGRlY3J5cHRpbmcgRXhjZWwgd29ya2Jvb2tzIHVzaW5nIGEgZGVmYXVsdCBvciB1c2VyIHN1cHBsaWVkIHBhc3N3b3JkLiBIb3dldmVyLCBvbmx5IHRoZSBmb2xsb3dpbmcgZW5jcnlwdGlvbiBzY2hlbWUgaXMgc3VwcG9ydGVkOgorCisgICAgT2ZmaWNlIDk3LzIwMDAgQ29tcGF0aWJsZSBlbmNyeXB0aW9uCisKK1RoZSBmb2xsb3dpbmcgZW5jcnlwdGlvbiBtZXRob2RzIGFyZSBub3Qgc3VwcG9ydGVkOgorCisgICAgV2VhayBFbmNyeXB0aW9uIChYT1IpCisgICAgUkM0LCBNaWNyb3NvZnQgQmFzZSBDcnlwdG9ncmFwaGljIFByb3ZpZGVyIHYxLjAKKyAgICBSQzQsIE1pY3Jvc29mdCBCYXNlIERTUyBhbmQgRGlmZmllLUhlbGxtYW4gQ3J5cHRvZ3JhcGhpYyBQcm92aWRlcgorICAgIFJDNCwgTWljcm9zb2Z0IERIIFNDaGFubmVsIENyeXB0b2dyYXBoaWMgUHJvdmlkZXIKKyAgICBSQzQsIE1pY3Jvc29mdCBFbmhhbmNlZCBDcnlwdG9ncmFwaGljIFByb3ZpZGVyIHYxLjAKKyAgICBSQzQsIE1pY3Jvc29mdCBFbmhhbmNlZCBEU1MgYW5kIERpZmZpZS1IZWxsbWFuIENyeXB0b2dyYXBoaWMgUHJvdmlkZXIKKyAgICBSQzQsIE1pY3Jvc29mdCBFbmhhbmNlZCBSU0EgYW5kIEFFUyBDcnlwdG9ncmFwaGljIFByb3ZpZGVyCisgICAgUkM0LCBNaWNyb3NvZnQgUlNBIFNDaGFubmVsIENyeXB0b2dyYXBoaWMgUHJvdmlkZXIKKyAgICBSQzQsIE1pY3Jvc29mdCBTdHJvbmcgQ3J5cHRvZ3JhcGhpYyBQcm92aWRlcgorCitTZWUgdGhlIGZvbGxvd2luZyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBFeGNlbCBlbmNyeXB0aW9uOiBMPGh0dHA6Ly9vZmZpY2UubWljcm9zb2Z0LmNvbS9lbi11cy9vZmZpY2UtMjAwMy1yZXNvdXJjZS1raXQvaW1wb3J0YW50LWFzcGVjdHMtb2YtcGFzc3dvcmQtYW5kLWVuY3J5cHRpb24tcHJvdGVjdGlvbi1IQTAwMTE0MDMxMS5hc3B4Pi4KKworCisKKz1oZWFkMSBLTk9XTiBQUk9CTEVNUworCis9b3ZlcgorCis9aXRlbSAqIElzc3VlcyByZXBvcnRlZCBieSB1c2VyczogTDxodHRwOi8vcnQuY3Bhbi5vcmcvUHVibGljL0Rpc3QvRGlzcGxheS5odG1sP05hbWU9U3ByZWFkc2hlZXQtUGFyc2VFeGNlbD4KKworPWl0ZW0gKiBUaGlzIG1vZHVsZSBjYW5ub3QgcmVhZCB0aGUgdmFsdWVzIG9mIGZvcm11bGFzIGZyb20gZmlsZXMgY3JlYXRlZCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHVubGVzcyB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIHZhbHVlcyB3aGVuIGNyZWF0aW5nIHRoZSBmaWxlICh3aGljaCBpcyBnZW5lcmFsbHkgbm90IHRoZSBjYXNlKS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHdyaXRlcyB0aGUgZm9ybXVsYSBidXQgbm90IHRoZSBmb3JtdWxhIHJlc3VsdCBzaW5jZSBpdCBpc24ndCBpbiBhIHBvc2l0aW9uIHRvIGNhbGN1bGF0ZSBhcmJpdHJhcnkgRXhjZWwgZm9ybXVsYXMgd2l0aG91dCBhY2Nlc3MgdG8gRXhjZWwncyBmb3JtdWxhIGVuZ2luZS4KKworPWl0ZW0gKiBJZiBFeGNlbCBoYXMgZGF0ZSBmaWVsZHMgd2hlcmUgdGhlIHNwZWNpZmllZCBmb3JtYXQgaXMgZXF1YWwgdG8gdGhlIHN5c3RlbS1kZWZhdWx0IGZvciB0aGUgc2hvcnQtZGF0ZSBsb2NhbGUsIEV4Y2VsIGRvZXMgbm90IHN0b3JlIHRoZSBmb3JtYXQsIGJ1dCBkZWZhdWx0cyB0byBhbiBpbnRlcm5hbCBmb3JtYXQgd2hpY2ggaXMgc3lzdGVtIGRlcGVuZGVudC4gSW4gdGhlc2UgY2FzZXMgUGFyc2VFeGNlbCB1c2VzIHRoZSBkYXRlIGZvcm1hdCAneXl5eS1tbS1kZCcuCisKKz1iYWNrCisKKworCisKKz1oZWFkMSBSRVBPUlRJTkcgQSBCVUcKKworQnVncyBjYW4gYmUgcmVwb3J0ZWQgdmlhIHJ0LmNwYW4ub3JnLiBTZWUgdGhlIGZvbGxvd2luZyBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGJ1ZyByZXBvcnRpbmcgZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsCisKK0w8aHR0cDovL3J0LmNwYW4ub3JnL1B1YmxpYy9EaXN0L0Rpc3BsYXkuaHRtbD9OYW1lPVNwcmVhZHNoZWV0LVBhcnNlRXhjZWw+CisKKworCisKKz1oZWFkMSBTRUUgQUxTTworCis9b3ZlcgorCis9aXRlbSAqIHhsczJjc3YgYnkgS2VuIFByb3dzIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+a2VuL3hsczJjc3YtMS4wNi9zY3JpcHQveGxzMmNzdj4uCisKKz1pdGVtICogeGxzMmNzdiBhbmQgeGxzY2F0IGJ5IEguTWVyaWpuIEJyYW5kICh0aGVzZSB1dGlsaXRpZXMgYXJlIHBhcnQgb2YgU3ByZWFkc2hlZXQ6OlJlYWQsIHNlZSBiZWxvdykuCisKKz1pdGVtICogZXhjZWwydHh0IGJ5IEtlbiBZb3VlbnMtQ2xhcmssIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+a2NsYXJrL2V4Y2VsMnR4dC9leGNlbDJ0eHQ+LiBUaGlzIGlzIGFuIGV4Y2VsbGVudCBleGFtcGxlIG9mIGFuIEV4Y2VsIGZpbHRlciB1c2luZyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4gSXQgY2FuIHByb2R1Y2UgQ1NWLCBUYWIgZGVsaW1pdGVkLCBIdG1sLCBYTUwgYW5kIFlhbWwuCisKKz1pdGVtICogWExTcGVybCBieSBKb24gQWxsZW4gTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35qb25hbGxlbi9YTFNwZXJsL2Jpbi9YTFNwZXJsPi4gVGhpcyBhcHBsaWNhdGlvbiBhbGxvd3MgeW91IHRvIHVzZSBQZXJsICJvbmUtbGluZXJzIiB3aXRoIE1pY3Jvc29mdCBFeGNlbCBmaWxlcy4KKworPWl0ZW0gKiBTcHJlYWRzaGVldDo6WExTWCBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfmRtb3cvU3ByZWFkc2hlZXQtWExTWC9saWIvU3ByZWFkc2hlZXQvWExTWC5wbT4gYnkgRG1pdHJ5IE92c3lhbmtvLiBBIG1vZHVsZSB3aXRoIGEgc2ltaWxhciBpbnRlcmZhY2UgdG8gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgZm9yIHBhcnNpbmcgRXhjZWwgMjAwNyBYTFNYIE9wZW5YTUwgZmlsZXMuCisKKz1pdGVtICogU3ByZWFkc2hlZXQ6OlJlYWQgTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35obWJyYW5kL1NwcmVhZHNoZWV0LVJlYWQvUmVhZC5wbT4gYnkgSC5NZXJpam4gQnJhbmQuIEEgc2luZ2xlIGludGVyZmFjZSBmb3IgcmVhZGluZyBzZXZlcmFsIGRpZmZlcmVudCBzcHJlYWRzaGVldCBmb3JtYXRzLgorCis9aXRlbSAqIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+am1jbmFtYXJhL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwvbGliL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwucG0+LiBBIHBlcmwgbW9kdWxlIGZvciBjcmVhdGluZyBuZXcgRXhjZWwgZmlsZXMuCisKKz1pdGVtICogU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXIgTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35qbWNuYW1hcmEvU3ByZWFkc2hlZXQtUGFyc2VFeGNlbC9saWIvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9TYXZlUGFyc2VyLnBtPi4gVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIGFuZCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgaXQgYWxsb3dzIHlvdSB0byAicmV3cml0ZSIgYW4gRXhjZWwgZmlsZS4gU2VlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfmptY25hbWFyYS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsL2xpYi9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsLnBtI01PRElGWUlOR19BTkRfUkVXUklUSU5HX0VYQ0VMX0ZJTEVTPi4gSXQgaXMgcGFydCBvZiB0aGUgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgZGlzdHJvLgorCis9aXRlbSAqIFRleHQ6OkNTVl9YUyBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfmhtYnJhbmQvVGV4dC1DU1ZfWFMvQ1NWX1hTLnBtPiBieSBILk1lcmlqbiBCcmFuZC4gQSBmYXN0IGFuZCByaWdvcm91cyBtb2R1bGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgQ1NWIGRhdGEuIERvbid0IGNvbnNpZGVyIHJvbGxpbmcgeW91ciBvd24gQ1NWIGhhbmRsaW5nLCB1c2UgdGhpcyBtb2R1bGUgaW5zdGVhZC4KKworPWJhY2sKKworCisKKworPWhlYWQxIE1BSUxJTkcgTElTVAorCitUaGVyZSBpcyBhIEdvb2dsZSBncm91cCBmb3IgZGlzY3Vzc2luZyBhbmQgYXNraW5nIHF1ZXN0aW9ucyBhYm91dCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4gVGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gc2VhcmNoIHRvIHNlZSBpZiB5b3VyIHF1ZXN0aW9uIGhhcyBiZWVuIGFza2VkIGJlZm9yZTogIEw8aHR0cDovL2dyb3Vwcy1iZXRhLmdvb2dsZS5jb20vZ3JvdXAvc3ByZWFkc2hlZXQtcGFyc2VleGNlbC8+CisKKworCisKKz1oZWFkMSBET05BVElPTlMKKworSWYgeW91J2QgY2FyZSB0byBkb25hdGUgdG8gdGhlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIHByb2plY3QsIHlvdSBjYW4gZG8gc28gdmlhIFBheVBhbDogTDxodHRwOi8vdGlueXVybC5jb20vN2F5ZXM+CisKKworCisKKz1oZWFkMSBUT0RPCisKKz1vdmVyCisKKz1pdGVtICogVGhlIGN1cnJlbnQgbWFpbnRlbmFuY2Ugd29yayBpcyBkaXJlY3RlZCB0b3dhcmRzIG1ha2luZyB0aGUgZG9jdW1lbnRhdGlvbiBtb3JlIHVzZWZ1bCwgaW1wcm92aW5nIGFuZCBzaW1wbGlmeWluZyB0aGUgQVBJLCBhbmQgaW1wcm92aW5nIHRoZSBtYWludGFpbmFiaWxpdHkgb2YgdGhlIGNvZGUgYmFzZS4gQWZ0ZXIgdGhhdCBuZXcgZmVhdHVyZXMgd2lsbCBiZSBhZGRlZC4KKworPWl0ZW0gKiBGaXggb3BlbiBidWdzIGFuZCBkb2N1bWVudGF0aW9uIGZvciBTYXZlUGFyc2VyLgorCis9aXRlbSAqIEFkZCBGb3JtdWxhIHN1cHBvcnQsIEh5cGVybGluayBzdXBwb3J0LCBOYW1lZCBSYW5nZSBzdXBwb3J0LgorCis9aXRlbSAqIEltcHJvdmUgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXIgY29tcGF0aWJpbGl0eSB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aXRlbSAqIEltcHJvdmUgVW5pY29kZSBhbmQgb3RoZXIgZW5jb2Rpbmcgc3VwcG9ydC4gVGhpcyB3aWxsIHByb2JhYmx5IHJlcXVpcmUgZHJvcHBpbmcgc3VwcG9ydCBmb3IgcGVybHMgcHJpb3IgdG8gNS44Ky4KKworPWJhY2sKKworCisKKz1oZWFkMSBBQ0tOT1dMRURHRU1FTlRTCisKK0Zyb20gS2F3YWkgVGFrYW5vcmk6CisKK0ZpcnN0IG9mIGFsbCwgSSB3b3VsZCBsaWtlIHRvIGFja25vd2xlZGdlIHRoZSBmb2xsb3dpbmcgdmFsdWFibGUgcHJvZ3JhbXMgYW5kIG1vZHVsZXM6CitYSFRNTCwgT0xFOjpTdG9yYWdlIGFuZCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworSW4gbm8gcGFydGljdWxhciBvcmRlcjogWWFtYWppIEhhcnVuYSwgU2ltYW1vdG8gVGFrZXNpLCBOb2d1Y2hpIEhhcnVtaSwgSWtlemF3YSBLYXp1aGlybywgU3V3YXpvbm8gU2h1Z28sIEhpcm9mdW1pIE1vcmlzYWRhLCBNaWNoYWVsIEVkd2FyZHMsIEtpbSBOYW11c2ssIFNsYXZlbiBSZXppYywgR3JhbnQgU3RldmVucywgSC5NZXJpam4gQnJhbmQgYW5kIG1hbnkgbWFueSBwZW9wbGUgKyBLYXdhaSBNaWtha28uCisKK0FsZXhleSBNYXp1cmluIGFkZGVkIHRoZSBkZWNyeXB0aW9uIGZhY2lsaXR5LgorCisKKworPWhlYWQxIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkKKworQmVjYXVzZSB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGZyZWUgb2YgY2hhcmdlLCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHNvZnR3YXJlLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdy4gRXhjZXB0IHdoZW4gb3RoZXJ3aXNlIHN0YXRlZCBpbiB3cml0aW5nIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQvb3Igb3RoZXIgcGFydGllcyBwcm92aWRlIHRoZSBzb2Z0d2FyZSAiYXMgaXMiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzZWQgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gVGhlIGVudGlyZSByaXNrIGFzIHRvIHRoZSBxdWFsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgc29mdHdhcmUgaXMgd2l0aCB5b3UuIFNob3VsZCB0aGUgc29mdHdhcmUgcHJvdmUgZGVmZWN0aXZlLCB5b3UgYXNzdW1lIHRoZSBjb3N0IG9mIGFsbCBuZWNlc3Nhcnkgc2VydmljaW5nLCByZXBhaXIsIG9yIGNvcnJlY3Rpb24uCisKK0luIG5vIGV2ZW50IHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyB3aWxsIGFueSBjb3B5cmlnaHQgaG9sZGVyLCBvciBhbnkgb3RoZXIgcGFydHkgd2hvIG1heSBtb2RpZnkgYW5kL29yIHJlZGlzdHJpYnV0ZSB0aGUgc29mdHdhcmUgYXMgcGVybWl0dGVkIGJ5IHRoZSBhYm92ZSBsaWNlbmNlLCBiZSBsaWFibGUgdG8geW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGdlbmVyYWwsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlIHNvZnR3YXJlIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGxvc3Mgb2YgZGF0YSBvciBkYXRhIGJlaW5nIHJlbmRlcmVkIGluYWNjdXJhdGUgb3IgbG9zc2VzIHN1c3RhaW5lZCBieSB5b3Ugb3IgdGhpcmQgcGFydGllcyBvciBhIGZhaWx1cmUgb2YgdGhlIHNvZnR3YXJlIHRvIG9wZXJhdGUgd2l0aCBhbnkgb3RoZXIgc29mdHdhcmUpLCBldmVuIGlmIHN1Y2ggaG9sZGVyIG9yIG90aGVyIHBhcnR5IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworCisKKworPWhlYWQxIExJQ0VOU0UKKworRWl0aGVyIHRoZSBQZXJsIEFydGlzdGljIExpY2VuY2UgTDxodHRwOi8vZGV2LnBlcmwub3JnL2xpY2Vuc2VzL2FydGlzdGljLmh0bWw+IG9yIHRoZSBHUEwgTDxodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocD4KKworCisKKworPWhlYWQxIEFVVEhPUgorCitDdXJyZW50IG1haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkgKEhpcHBvMjAwMCkga3dpdGtuckBjcGFuLm9yZworCisKKworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDExIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBpcyBmcmVlIHNvZnR3YXJlLiBZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UuCisKKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9DZWxsLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9DZWxsLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjcwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0NlbGwucG0KQEAgLTAsMCArMSwzMTQgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkNlbGw7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkNlbGwgLSBBIGNsYXNzIGZvciBDZWxsIGRhdGEgYW5kIGZvcm1hdHRpbmcuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjIENvbnN0cnVjdG9yLgorIworc3ViIG5ldyB7CisgICAgbXkgKCAkcGFja2FnZSwgJXByb3BlcnRpZXMgKSA9IEBfOworICAgIG15ICRzZWxmID0gXCVwcm9wZXJ0aWVzOworCisgICAgYmxlc3MgJHNlbGYsICRwYWNrYWdlOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHZhbHVlKCkKKyMKKyMgUmV0dXJucyB0aGUgZm9ybWF0dGVkIHZhbHVlIG9mIHRoZSBjZWxsLgorIworc3ViIHZhbHVlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntfVmFsdWV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHVuZm9ybWF0dGVkKCkKKyMKKyMgUmV0dXJucyB0aGUgdW5mb3JtYXR0ZWQgdmFsdWUgb2YgdGhlIGNlbGwuCisjCitzdWIgdW5mb3JtYXR0ZWQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e1ZhbH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2Zvcm1hdCgpCisjCisjIFJldHVybnMgdGhlIEZvcm1hdCBvYmplY3QgZm9yIHRoZSBjZWxsLgorIworc3ViIGdldF9mb3JtYXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e0Zvcm1hdH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgdHlwZSgpCisjCisjIFJldHVybnMgdGhlIHR5cGUgb2YgY2VsbCBzdWNoIGFzIFRleHQsIE51bWVyaWMgb3IgRGF0ZS4KKyMKK3N1YiB0eXBlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntUeXBlfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBlbmNvZGluZygpCisjCisjIFJldHVybnMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgY2VsbC4KKyMKK3N1YiBlbmNvZGluZyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKCAhZGVmaW5lZCAkc2VsZi0+e0NvZGV9ICkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzaWYgKCAkc2VsZi0+e0NvZGV9IGVxICd1Y3MyJyApIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIGVsc2lmICggJHNlbGYtPntDb2RlfSBlcSAnX25hdGl2ZV8nICkgeworICAgICAgICByZXR1cm4gMzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAkc2VsZi0+e0NvZGV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGlzX21lcmdlZCgpCisjCisjIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2VsbCBpcyBtZXJnZWQuCisjCitzdWIgaXNfbWVyZ2VkIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntNZXJnZWR9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9yaWNoX3RleHQoKQorIworIyBSZXR1cm5zIGFuIGFycmF5IHJlZiBvZiBmb250IGluZm9ybWF0aW9uIGFib3V0IGVhY2ggc3RyaW5nIGJsb2NrIGluIGEgInJpY2giLAorIyBpLmUuIG11bHRpLWZvcm1hdCwgc3RyaW5nLgorIworc3ViIGdldF9yaWNoX3RleHQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e1JpY2h9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE1hcHBpbmcgYmV0d2VlbiBsZWdhY3kgbWV0aG9kIG5hbWVzIGFuZCBuZXcgbmFtZXMuCisjCit7CisgICAgbm8gd2FybmluZ3M7ICAgICMgSWdub3JlIHdhcm5pbmdzIGFib3V0IHZhcmlhYmxlcyB1c2VkIG9ubHkgb25jZS4KKyAgICAqVmFsdWUgPSAqdmFsdWU7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Q2VsbCAtIEEgY2xhc3MgZm9yIENlbGwgZGF0YSBhbmQgZm9ybWF0dGluZy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBNZXRob2RzCisKK1RoZSBmb2xsb3dpbmcgQ2VsbCBtZXRob2RzIGFyZSBhdmFpbGFibGU6CisKKyAgICAkY2VsbC0+dmFsdWUoKQorICAgICRjZWxsLT51bmZvcm1hdHRlZCgpCisgICAgJGNlbGwtPmdldF9mb3JtYXQoKQorICAgICRjZWxsLT50eXBlKCkKKyAgICAkY2VsbC0+ZW5jb2RpbmcoKQorICAgICRjZWxsLT5pc19tZXJnZWQoKQorICAgICRjZWxsLT5nZXRfcmljaF90ZXh0KCkKKworCis9aGVhZDIgdmFsdWUoKQorCitUaGUgQzx2YWx1ZSgpPiBtZXRob2QgcmV0dXJucyB0aGUgZm9ybWF0dGVkIHZhbHVlIG9mIHRoZSBjZWxsLgorCisgICAgbXkgJHZhbHVlID0gJGNlbGwtPnZhbHVlKCk7CisKK0Zvcm1hdHRlZCBpbiB0aGlzIHNlbnNlIHJlZmVycyB0byB0aGUgbnVtZXJpYyBmb3JtYXQgb2YgdGhlIGNlbGwgdmFsdWUuIEZvciBleGFtcGxlIGEgbnVtYmVyIHN1Y2ggYXMgNDAxNzcgbWlnaHQgYmUgZm9ybWF0dGVkIGFzIDQwLDExNywgNDAxMTcuMDAwIG9yIGV2ZW4gYXMgdGhlIGRhdGUgMjAwOS8xMi8zMC4KKworSWYgdGhlIGNlbGwgZG9lc24ndCBjb250YWluIGEgbnVtZXJpYyBmb3JtYXQgdGhlbiB0aGUgZm9ybWF0dGVkIGFuZCB1bmZvcm1hdHRlZCBjZWxsIHZhbHVlcyBhcmUgdGhlIHNhbWUsIHNlZSB0aGUgQzx1bmZvcm1hdHRlZCgpPiBtZXRob2QgYmVsb3cuCisKK0ZvciBhIGRlZmluZWQgQzwkY2VsbD4gdGhlIEM8dmFsdWUoKT4gbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBhIHZhbHVlLgorCitJbiB0aGUgY2FzZSBvZiBhIGNlbGwgd2l0aCBmb3JtYXR0aW5nIGJ1dCBubyBudW1lcmljIG9yIHN0cmluZyBjb250ZW50cyB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcgQzwnJz4uCisKKworPWhlYWQyIHVuZm9ybWF0dGVkKCkKKworVGhlIEM8dW5mb3JtYXR0ZWQoKT4gbWV0aG9kIHJldHVybnMgdGhlIHVuZm9ybWF0dGVkIHZhbHVlIG9mIHRoZSBjZWxsLgorCisgICAgbXkgJHVuZm9ybWF0dGVkID0gJGNlbGwtPnVuZm9ybWF0dGVkKCk7CisKK1JldHVybnMgdGhlIGNlbGwgdmFsdWUgd2l0aG91dCBhIG51bWVyaWMgZm9ybWF0LiBTZWUgdGhlIEM8dmFsdWUoKT4gbWV0aG9kIGFib3ZlLgorCisKKz1oZWFkMiBnZXRfZm9ybWF0KCkKKworVGhlIEM8Z2V0X2Zvcm1hdCgpPiBtZXRob2QgcmV0dXJucyB0aGUgTDxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9ybWF0PiBvYmplY3QgZm9yIHRoZSBjZWxsLgorCisgICAgbXkgJGZvcm1hdCA9ICRjZWxsLT5nZXRfZm9ybWF0KCk7CisKK0lmIGEgdXNlciBkZWZpbmVkIGZvcm1hdCBoYXNuJ3QgYmVlbiBhcHBsaWVkIHRvIHRoZSBjZWxsIHRoZW4gdGhlIGRlZmF1bHQgY2VsbCBmb3JtYXQgaXMgcmV0dXJuZWQuCisKKworPWhlYWQyIHR5cGUoKQorCitUaGUgQzx0eXBlKCk+IG1ldGhvZCByZXR1cm5zIHRoZSB0eXBlIG9mIGNlbGwgc3VjaCBhcyBUZXh0LCBOdW1lcmljIG9yIERhdGUuIElmIHRoZSB0eXBlIHdhcyBkZXRlY3RlZCBhcyBOdW1lcmljLCBhbmQgdGhlIENlbGwgRm9ybWF0IG1hdGNoZXMgQzxte15bZG15XVstXFwvZG15XSokfWk+LCBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBEYXRlIHR5cGUuCisKKyAgICBteSAkdHlwZSA9ICRjZWxsLT50eXBlKCk7CisKK1NlZSBhbHNvIEw8RGF0ZXMgYW5kIFRpbWUgaW4gRXhjZWw+LgorCisKKz1oZWFkMiBlbmNvZGluZygpCisKK1RoZSBDPGVuY29kaW5nKCk+IG1ldGhvZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIGNlbGwuCisKKyAgICBteSAkZW5jb2RpbmcgPSAkY2VsbC0+ZW5jb2RpbmcoKTsKKworVGhpcyBtZXRob2QgaXMgb25seSBvZiBpbnRlcmVzdCB0byBkZXZlbG9wZXJzLiBJbiBnZW5lcmFsIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIHdpbGwgcmV0dXJuIGFsbCBjaGFyYWN0ZXIgc3RyaW5ncyBpbiBVVEYtOCByZWdhcmRsZXNzIG9mIHRoZSBlbmNvZGluZyB1c2VkIGJ5IEV4Y2VsLgorCitUaGUgQzxlbmNvZGluZygpPiBtZXRob2QgcmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKz1vdmVyCisKKz1pdGVtICogMDogVW5rbm93biBmb3JtYXQuIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gSW4gdGhlIGRlZmF1bHQgY2FzZSB0aGUgZm9ybWF0IHNob3VsZCBiZSAxLgorCis9aXRlbSAqIDE6IDhiaXQgQVNDSUkgb3Igc2luZ2xlIGJ5dGUgVVRGLTE2LiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSBlbmNvZGVkIGluIGEgc2luZ2xlIGJ5dGUuIEluIEV4Y2VsIDk1IGFuZCBlYXJsaWVyIFRoaXMgdXN1YWxseSBtZWFudCBBU0NJSSBvciBhbiBpbnRlcm5hdGlvbmFsIHZhcmlhbnQuIEluIEV4Y2VsIDk3IGl0IHJlZmVycyB0byBhIGNvbXByZXNzZWQgVVRGLTE2IGNoYXJhY3RlciBzdHJpbmcgd2hlcmUgYWxsIG9mIHRoZSBoaWdoIG9yZGVyIGJ5dGVzIGFyZSAwIGFuZCBhcmUgb21pdHRlZCB0byBzYXZlIHNwYWNlLgorCis9aXRlbSAqIDI6IFVURi0xNkJFLgorCis9aXRlbSAqIDM6IE5hdGl2ZSBlbmNvZGluZy4gSW4gRXhjZWwgOTUgYW5kIGVhcmxpZXIgdGhpcyBlbmNvZGluZyB3YXMgdXNlZCB0byByZXByZXNlbnQgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgZW5jb2RpbmdzIHN1Y2ggYXMgU0pJUy4KKworPWJhY2sKKworCis9aGVhZDIgaXNfbWVyZ2VkKCkKKworVGhlIEM8aXNfbWVyZ2VkKCk+IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGNlbGwgaXMgbWVyZ2VkLgorCisgICAgbXkgJGlzX21lcmdlZCA9ICRjZWxsLT5pc19tZXJnZWQoKTsKKworUmV0dXJucyBDPHVuZGVmPiBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBnZXRfcmljaF90ZXh0KCkKKworVGhlIEM8Z2V0X3JpY2hfdGV4dCgpPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSByZWYgb2YgZm9udCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHN0cmluZyBibG9jayBpbiBhICJyaWNoIiwgaS5lLiBtdWx0aS1mb3JtYXQsIHN0cmluZy4KKworICAgIG15ICRyaWNoX3RleHQgPSAkY2VsbC0+Z2V0X3JpY2hfdGV4dCgpOworCitUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGFycmF5cmVmIG9mIGFycmF5cmVmcyBpbiB0aGUgZm9ybToKKworICAgIFsKKyAgICAgICAgWyAkc3RhcnRfcG9zaXRpb24sICRmb250X29iamVjdCBdLAorICAgICAgICAgLi4uLAorICAgIF0KKworUmV0dXJucyB1bmRlZiBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMSBEYXRlcyBhbmQgVGltZSBpbiBFeGNlbAorCitEYXRlcyBhbmQgdGltZXMgaW4gRXhjZWwgYXJlIHJlcHJlc2VudGVkIGJ5IHJlYWwgbnVtYmVycywgZm9yIGV4YW1wbGUgIkphbiAxIDIwMDEgMTI6MzAgUE0iIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBudW1iZXIgMzY4OTIuNTIxLgorCitUaGUgaW50ZWdlciBwYXJ0IG9mIHRoZSBudW1iZXIgc3RvcmVzIHRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZXBvY2ggYW5kIHRoZSBmcmFjdGlvbmFsIHBhcnQgc3RvcmVzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBkYXkuCisKK0EgZGF0ZSBvciB0aW1lIGluIEV4Y2VsIGlzIGp1c3QgbGlrZSBhbnkgb3RoZXIgbnVtYmVyLiBUaGUgd2F5IGluIHdoaWNoIGl0IGlzIGRpc3BsYXllZCBpcyBjb250cm9sbGVkIGJ5IHRoZSBudW1iZXIgZm9ybWF0OgorCisgICAgTnVtYmVyIGZvcm1hdCAgICAgICAgICAgICAgICRjZWxsLT52YWx1ZSgpICAgICAgICAgICAgJGNlbGwtPnVuZm9ybWF0dGVkKCkKKyAgICA9PT09PT09PT09PT09ICAgICAgICAgICAgICAgPT09PT09PT09PT09PT0gICAgICAgICAgICA9PT09PT09PT09PT09PQorICAgICdkZC9tbS95eScgICAgICAgICAgICAgICAgICAnMjgvMDIvMDgnICAgICAgICAgICAgICAgIDM5NTA2LjUKKyAgICAnbW0vZGQveXknICAgICAgICAgICAgICAgICAgJzAyLzI4LzA4JyAgICAgICAgICAgICAgICAzOTUwNi41CisgICAgJ2QtbS15eXl5JyAgICAgICAgICAgICAgICAgICcyOC0yLTIwMDgnICAgICAgICAgICAgICAgMzk1MDYuNQorICAgICdkZC9tbS95eSBoaDptbScgICAgICAgICAgICAnMjgvMDIvMDggMTI6MDAnICAgICAgICAgIDM5NTA2LjUKKyAgICAnZCBtbW0geXl5eScgICAgICAgICAgICAgICAgJzI4IEZlYiAyMDA4JyAgICAgICAgICAgICAzOTUwNi41CisgICAgJ21tbSBkIHl5eXkgaGg6bW0gQU0vUE0nICAgICdGZWIgMjggMjAwOCAxMjowMCBQTScgICAgMzk1MDYuNQorCisKK1RoZSBMPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpVdGlsaXR5PiBtb2R1bGUgY29udGFpbnMgYSBmdW5jdGlvbiBjYWxsZWQgQzxFeGNlbExvY2FsdGltZT4gd2hpY2ggd2lsbCBjb252ZXJ0IGJldHdlZW4gYW4gdW5mb3JtYXR0ZWQgRXhjZWwgZGF0ZS90aW1lIG51bWJlciBhbmQgYSBDPGxvY2FsdGltZSgpPiBsaWtlIGFycmF5LgorCitGb3IgZGF0ZSBjb252ZXJzaW9ucyB1c2luZyB0aGUgQ1BBTiBDPERhdGVUaW1lPiBmcmFtZXdvcmsgc2VlIEw8RGF0ZVRpbWU6OkZvcm1hdDo6RXhjZWw+IGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc2VhcmNoP2Rpc3Q9RGF0ZVRpbWUtRm9ybWF0LUV4Y2VsCisKKworPWhlYWQxIEFVVEhPUgorCitNYWludGFpbmVyIDAuNDArOiBKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCitNYWludGFpbmVyIDAuMjctMC4zMzogR2Fib3IgU3phYm8gc3phYmdhYkBjcGFuLm9yZworCitPcmlnaW5hbCBhdXRob3I6IEthd2FpIFRha2Fub3JpIGt3aXRrbnJAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBKb2huIE1jTmFtYXJhCisKK0NvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisKK0NvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1lvdSBtYXkgZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgQXJ0aXN0aWMgTGljZW5zZSwgYXMgc3BlY2lmaWVkIGluIHRoZSBQZXJsIFJFQURNRSBmaWxlLgorCis9Y3V0CmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0R1bXAucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0R1bXAucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4NmRiMgotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvRHVtcC5wbQpAQCAtMCwwICsxLDM1NSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6RHVtcDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6RHVtcCAtIEEgY2xhc3MgZm9yIGR1bXBpbmcgRXhjZWwgcmVjb3Jkcy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKb2huIE1jTmFtYXJhCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisjIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCitvdXIgJFZFUlNJT04gPSAnMC41OSc7CisKK215ICVOYW1lVGJsID0gKAorCisgICAgI1AyOTEKKyAgICAweDBBID0+ICdFT0YnLAorICAgIDB4MEMgPT4gJ0NBTENDT1VOVCcsCisgICAgMHgwRCA9PiAnQ0FMQ01PREUnLAorICAgIDB4MEUgPT4gJ1BSRUNJU0lPTicsCisgICAgMHgwRiA9PiAnUkVGTU9ERScsCisgICAgMHgxMCA9PiAnREVMVEEnLAorICAgIDB4MTEgPT4gJ0lURVJBVElPTicsCisgICAgMHgxMiA9PiAnUFJPVEVDVCcsCisgICAgMHgxMyA9PiAnUEFTU1dPUkQnLAorICAgIDB4MTQgPT4gJ0hFQURFUicsCisKKyAgICAweDE1ID0+ICdGT09URVInLAorICAgIDB4MTYgPT4gJ0VYVEVSTkNPVU5UJywKKyAgICAweDE3ID0+ICdFWFRFUk5TSEVFVCcsCisgICAgMHgxOSA9PiAnV0lORE9XUFJPVEVDVCcsCisgICAgMHgxQSA9PiAnVkVSVElDQUxQQUdFQlJFQUtTJywKKyAgICAweDFCID0+ICdIT1JJWk9OVEFMUEFHRUJSRUFLUycsCisgICAgMHgxQyA9PiAnTk9URScsCisgICAgMHgxRCA9PiAnU0VMRUNUSU9OJywKKyAgICAweDIyID0+ICcxOTA0JywKKyAgICAweDI2ID0+ICdMRUZUTUFSR0lOJywKKworICAgIDB4MjcgPT4gJ1JJR0hUTUFSR0lOJywKKyAgICAweDI4ID0+ICdUT1BNQVJHSU4nLAorICAgIDB4MjkgPT4gJ0JPVFRPTU1BUkdJTicsCisgICAgMHgyQSA9PiAnUFJJTlRIRUFERVJTJywKKyAgICAweDJCID0+ICdQUklOVEdSSURMSU5FUycsCisgICAgMHgyRiA9PiAnRklMRVBBU1MnLAorICAgIDB4M0MgPT4gJ0NPVU5USU5VRScsCisgICAgMHgzRCA9PiAnV0lORE9XMScsCisgICAgMHg0MCA9PiAnQkFDS1VQJywKKyAgICAweDQxID0+ICdQQU5FJywKKworICAgIDB4NDIgPT4gJ0NPREVQQUdFJywKKyAgICAweDREID0+ICdQTFMnLAorICAgIDB4NTAgPT4gJ0RDT04nLAorICAgIDB4NTEgPT4gJ0RDT05SRUYnLAorCisgICAgI1AyOTIKKyAgICAweDUyID0+ICdEQ09OTkFNRScsCisgICAgMHg1NSA9PiAnREVGQ09MV0lEVEgnLAorICAgIDB4NTkgPT4gJ1hDVCcsCisgICAgMHg1QSA9PiAnQ1JOJywKKyAgICAweDVCID0+ICdGSUxFU0hBUklORycsCisgICAgMHg1QyA9PiAnV1JJVEVBQ0NFUycsCisgICAgMHg1RCA9PiAnT0JKJywKKyAgICAweDVFID0+ICdVTkNBTENFRCcsCisgICAgMHg1RiA9PiAnU0FWRVJFQ0FMQycsCisgICAgMHg2MCA9PiAnVEVNUExBVEUnLAorCisgICAgMHg2MyA9PiAnT0JKUFJPVEVDVCcsCisgICAgMHg3RCA9PiAnQ09MSU5GTycsCisgICAgMHg3RSA9PiAnUksnLAorICAgIDB4N0YgPT4gJ0lNREFUQScsCisgICAgMHg4MCA9PiAnR1VUUycsCisgICAgMHg4MSA9PiAnV1NCT09MJywKKyAgICAweDgyID0+ICdHUklEU0VUJywKKyAgICAweDgzID0+ICdIQ0VOVEVSJywKKyAgICAweDg0ID0+ICdWQ0VOVEVSJywKKyAgICAweDg1ID0+ICdCT1VORFNIRUVUJywKKworICAgIDB4ODYgPT4gJ1dSSVRFUFJPVCcsCisgICAgMHg4NyA9PiAnQURESU4nLAorICAgIDB4ODggPT4gJ0VERycsCisgICAgMHg4OSA9PiAnUFVCJywKKyAgICAweDhDID0+ICdDT1VOVFJZJywKKyAgICAweDhEID0+ICdISURFT0JKJywKKyAgICAweDkwID0+ICdTT1JUJywKKyAgICAweDkxID0+ICdTVUInLAorICAgIDB4OTIgPT4gJ1BBTEVUVEUnLAorICAgIDB4OTQgPT4gJ0xIUkVDT1JEJywKKworICAgIDB4OTUgPT4gJ0xITkdSQVBIJywKKyAgICAweDk2ID0+ICdTT1VORCcsCisgICAgMHg5OCA9PiAnTFBSJywKKyAgICAweDk5ID0+ICdTVEFOREFSRFdJRFRIJywKKyAgICAweDlBID0+ICdGTkdST1VQTkFNRScsCisgICAgMHg5QiA9PiAnRklMVEVSTU9ERScsCisgICAgMHg5QyA9PiAnRk5HUk9VUENPVU5UJywKKworICAgICNQMjkzCisgICAgMHg5RCA9PiAnQVVUT0ZJTFRFUklORk8nLAorICAgIDB4OUUgPT4gJ0FVVE9GSUxURVInLAorICAgIDB4QTAgPT4gJ1NDTCcsCisgICAgMHhBMSA9PiAnU0VUVVAnLAorICAgIDB4QTkgPT4gJ0NPT1JETElTVCcsCisgICAgMHhBQiA9PiAnR0NXJywKKyAgICAweEFFID0+ICdTQ0VOTUFOJywKKyAgICAweEFGID0+ICdTQ0VOQVJJTycsCisgICAgMHhCMCA9PiAnU1hWSUVXJywKKyAgICAweEIxID0+ICdTWFZEJywKKworICAgIDB4QjIgPT4gJ1NYVicsCisgICAgMHhCNCA9PiAnU1hJVkQnLAorICAgIDB4QjUgPT4gJ1NYTEknLAorICAgIDB4QjYgPT4gJ1NYUEknLAorICAgIDB4QjggPT4gJ0RPQ1JPVVRFJywKKyAgICAweEI5ID0+ICdSRUNJUE5BTUUnLAorICAgIDB4QkMgPT4gJ1NIUkZNTEEnLAorICAgIDB4QkQgPT4gJ01VTFJLJywKKyAgICAweEJFID0+ICdNVUxCTEFOSycsCisgICAgMHhCRiA9PiAnVE9PTEJBUkhEUicsCisgICAgMHhDMCA9PiAnVE9PTEJBUkVORCcsCisgICAgMHhDMSA9PiAnTU1TJywKKworICAgIDB4QzIgPT4gJ0FERE1FTlUnLAorICAgIDB4QzMgPT4gJ0RFTE1FTlUnLAorICAgIDB4QzUgPT4gJ1NYREknLAorICAgIDB4QzYgPT4gJ1NYREInLAorICAgIDB4Q0QgPT4gJ1NYU1RSSU5HJywKKyAgICAweEQwID0+ICdTWFRCTCcsCisgICAgMHhEMSA9PiAnU1hUQlJHSUlUTScsCisgICAgMHhEMiA9PiAnU1hUQlBHJywKKyAgICAweEQzID0+ICdPQlBST0onLAorICAgIDB4RDUgPT4gJ1NYSVNEVE0nLAorCisgICAgMHhENiA9PiAnUlNUUklORycsCisgICAgMHhENyA9PiAnREJDRUxMJywKKyAgICAweERBID0+ICdCT09LQk9PTCcsCisgICAgMHhEQyA9PiAnUEFSQU1RUlknLAorICAgIDB4REMgPT4gJ1NYRVhUJywKKyAgICAweEREID0+ICdTQ0VOUFJPVEVDVCcsCisgICAgMHhERSA9PiAnT0xFU0laRScsCisKKyAgICAjUDI5NAorICAgIDB4REYgPT4gJ1VEREVTQycsCisgICAgMHhFMCA9PiAnWEYnLAorICAgIDB4RTEgPT4gJ0lOVEVSRkFDRUhEUicsCisgICAgMHhFMiA9PiAnSU5URVJGQUNFRU5EJywKKyAgICAweEUzID0+ICdTWFZTJywKKyAgICAweEVBID0+ICdUQUJJRENPTkYnLAorICAgIDB4RUIgPT4gJ01TT0RSQVdJTkdHUk9VUCcsCisgICAgMHhFQyA9PiAnTVNPRFJBV0lORycsCisgICAgMHhFRCA9PiAnTVNPRFJBV0lOR1NFTEVDVElPTicsCisgICAgMHhFRiA9PiAnUEhPTkVUSUNJTkZPJywKKyAgICAweEYwID0+ICdTWFJVTEUnLAorCisgICAgMHhGMSA9PiAnU1hFWFQnLAorICAgIDB4RjIgPT4gJ1NYRklMVCcsCisgICAgMHhGNiA9PiAnU1hOQU1FJywKKyAgICAweEY3ID0+ICdTWFNFTEVDVCcsCisgICAgMHhGOCA9PiAnU1hQQUlSJywKKyAgICAweEY5ID0+ICdTWEZNTEEnLAorICAgIDB4RkIgPT4gJ1NYRk9STUFUJywKKyAgICAweEZDID0+ICdTU1QnLAorICAgIDB4RkQgPT4gJ0xBQkVMU1NUJywKKyAgICAweEZGID0+ICdFWFRTU1QnLAorCisgICAgMHgxMDAgPT4gJ1NYVkRFWCcsCisgICAgMHgxMDMgPT4gJ1NYRk9STVVMQScsCisgICAgMHgxMjIgPT4gJ1NYREJFWCcsCisgICAgMHgxM0QgPT4gJ1RBQklEJywKKyAgICAweDE2MCA9PiAnVVNFU0VMRlMnLAorICAgIDB4MTYxID0+ICdEU0YnLAorICAgIDB4MTYyID0+ICdYTDVNT0RJRlknLAorICAgIDB4MUE1ID0+ICdGSUxFU0hBUklORzInLAorICAgIDB4MUE5ID0+ICdVU0VSQlZJRVcnLAorICAgIDB4MUFBID0+ICdVU0VSVklFV0JFR0lOJywKKworICAgIDB4MUFCID0+ICdVU0VSU1ZJRVdFTkQnLAorICAgIDB4MUFEID0+ICdRU0knLAorICAgIDB4MUFFID0+ICdTVVBCT09LJywKKyAgICAweDFBRiA9PiAnUFJPVDRSRVYnLAorICAgIDB4MUIwID0+ICdDT05ERk1UJywKKyAgICAweDFCMSA9PiAnQ0YnLAorICAgIDB4MUIyID0+ICdEVkFMJywKKworICAgICNQMjk1CisgICAgMHgxQjUgPT4gJ0RDT05CSU4nLAorICAgIDB4MUI2ID0+ICdUWE8nLAorICAgIDB4MUI3ID0+ICdSRUZSRVNIQUxMJywKKyAgICAweDFCOCA9PiAnSExJTksnLAorICAgIDB4MUJBID0+ICdDT0RFTkFNRScsCisgICAgMHgxQkIgPT4gJ1NYRkRCVFlQRScsCisgICAgMHgxQkMgPT4gJ1BST1Q0UkVWUEFTUycsCisgICAgMHgxQkUgPT4gJ0RWJywKKyAgICAweDIwMCA9PiAnRElNRU5TSU9OUycsCisgICAgMHgyMDEgPT4gJ0JMQU5LJywKKworICAgIDB4MjAyID0+ICdJbnRlZ2VyJywgICAgICAgICAgICAjTm90IERvY3VtZW50ZWQKKyAgICAweDIwMyA9PiAnTlVNQkVSJywKKyAgICAweDIwNCA9PiAnTEFCRUwnLAorICAgIDB4MjA1ID0+ICdCT09MRVJSJywKKyAgICAweDIwNyA9PiAnU1RSSU5HJywKKyAgICAweDIwOCA9PiAnUk9XJywKKyAgICAweDIwQiA9PiAnSU5ERVgnLAorICAgIDB4MjE4ID0+ICdOQU1FJywKKyAgICAweDIyMSA9PiAnQVJSQVknLAorICAgIDB4MjIzID0+ICdFWFRFUk5OQU1FJywKKyAgICAweDIyNSA9PiAnREVGQVVMVFJPV0hFSUdIVCcsCisKKyAgICAweDIzMSA9PiAnRk9OVCcsCisgICAgMHgyMzYgPT4gJ1RBQkxFJywKKyAgICAweDIzRSA9PiAnV0lORE9XMicsCisgICAgMHgyOTMgPT4gJ1NUWUxFJywKKyAgICAweDQwNiA9PiAnRk9STVVMQScsCisgICAgMHg0MUUgPT4gJ0ZPUk1BVCcsCisKKyAgICAweDE4ID0+ICdOQU1FJywKKworICAgIDB4MDYgPT4gJ0ZPUk1VTEEnLAorCisgICAgMHgwOSAgPT4gJ0JPRihCSUZGMiknLAorICAgIDB4MjA5ID0+ICdCT0YoQklGRjMpJywKKyAgICAweDQwOSA9PiAnQk9GKEJJRkY0KScsCisgICAgMHg4MDkgPT4gJ0JPRihCSUZGNS03KScsCisKKyAgICAweDMxID0+ICdGT05UJywgMHgyN0UgPT4gJ1JLJywKKworICAgICNDaGFydC9HcmFwaAorICAgIDB4MTAwMSA9PiAnVU5JVFMnLAorICAgIDB4MTAwMiA9PiAnQ0hBUlQnLAorICAgIDB4MTAwMyA9PiAnU0VSSVNFUycsCisgICAgMHgxMDA2ID0+ICdEQVRBRk9STUFUJywKKyAgICAweDEwMDcgPT4gJ0xJTkVGT1JNQVQnLAorICAgIDB4MTAwOSA9PiAnTUFLRVJGT1JNQVQnLAorICAgIDB4MTAwQSA9PiAnQVJFQUZPUk1BVCcsCisgICAgMHgxMDBCID0+ICdQSUVGT1JNQVQnLAorICAgIDB4MTAwQyA9PiAnQVRUQUNIRURMQUJFTCcsCisgICAgMHgxMDBEID0+ICdTRVJJRVNURVhUJywKKyAgICAweDEwMTQgPT4gJ0NIQVJURk9STUFUJywKKyAgICAweDEwMTUgPT4gJ0xFR0VORCcsCisgICAgMHgxMDE2ID0+ICdTRVJJRVNMSVNUJywKKyAgICAweDEwMTcgPT4gJ0JBUicsCisgICAgMHgxMDE4ID0+ICdMSU5FJywKKyAgICAweDEwMTkgPT4gJ1BJRScsCisgICAgMHgxMDFBID0+ICdBUkVBJywKKyAgICAweDEwMUIgPT4gJ1NDQVRURVInLAorICAgIDB4MTAxQyA9PiAnQ0hBUlRMSU5FJywKKyAgICAweDEwMUQgPT4gJ0FYSVMnLAorICAgIDB4MTAxRSA9PiAnVElDSycsCisgICAgMHgxMDFGID0+ICdWQUxVRVJBTkdFJywKKyAgICAweDEwMjAgPT4gJ0NBVFNFUlJBTkdFJywKKyAgICAweDEwMjEgPT4gJ0FYSVNMSU5FRk9STUFUJywKKyAgICAweDEwMjIgPT4gJ0NIQVJURk9STUFUTElOSycsCisgICAgMHgxMDI0ID0+ICdERUZBVUxUVEVYVCcsCisgICAgMHgxMDI1ID0+ICdURVhUJywKKyAgICAweDEwMjYgPT4gJ0ZPTlRYJywKKyAgICAweDEwMjcgPT4gJ09CSkVDVExJTksnLAorICAgIDB4MTAzMiA9PiAnRlJBTUUnLAorICAgIDB4MTAzMyA9PiAnQkVHSU4nLAorICAgIDB4MTAzNCA9PiAnRU5EJywKKyAgICAweDEwMzUgPT4gJ1BMT1RBUkVBJywKKyAgICAweDEwM0EgPT4gJzNEJywKKyAgICAweDEwM0MgPT4gJ1BJQ0YnLAorICAgIDB4MTAzRCA9PiAnRFJPUEJBUicsCisgICAgMHgxMDNFID0+ICdSQURBUicsCisgICAgMHgxMDNGID0+ICdTVVJGQUNFJywKKyAgICAweDEwNDAgPT4gJ1JBREFSQVJFQScsCisgICAgMHgxMDQxID0+ICdBWElTUEFSRU5UJywKKyAgICAweDEwNDMgPT4gJ0xFR0VORFhOJywKKyAgICAweDEwNDQgPT4gJ1NIVFBST1BTJywKKyAgICAweDEwNDUgPT4gJ1NFUlRPQ1JUJywKKyAgICAweDEwNDYgPT4gJ0FYRVNVU0VEJywKKyAgICAweDEwNDggPT4gJ1NCQVNFUkVGJywKKyAgICAweDEwNEEgPT4gJ1NFUlBBUkVOVCcsCisgICAgMHgxMDRCID0+ICdTRVJBVVhUUkVORCcsCisgICAgMHgxMDRFID0+ICdJRk1UJywKKyAgICAweDEwNEYgPT4gJ1BPUycsCisgICAgMHgxMDUwID0+ICdBTFJVTlMnLAorICAgIDB4MTA1MSA9PiAnQUknLAorICAgIDB4MTA1QiA9PiAnU0VSQVVYRVJSQkFSJywKKyAgICAweDEwNUQgPT4gJ1NFUkZNVCcsCisgICAgMHgxMDYwID0+ICdGQkknLAorICAgIDB4MTA2MSA9PiAnQk9QUE9QJywKKyAgICAweDEwNjIgPT4gJ0FYQ0VYVCcsCisgICAgMHgxMDYzID0+ICdEQVQnLAorICAgIDB4MTA2NCA9PiAnUExPVEdST1dUSCcsCisgICAgMHgxMDY1ID0+ICdTSU5ERVgnLAorICAgIDB4MTA2NiA9PiAnR0VMRlJBTUUnLAorICAgIDB4MTA2NyA9PiAnQlBPUFBPUENVU1RPTScsCispOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHN1YkRVTVAgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBzdWJEVU1QIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIHByaW50ZiAiJTA0WDolLTIzcyAoTGVuOiUzZCkgOiAlc1xuIiwKKyAgICAgICRiT3AsIE9wTmFtZSgkYk9wKSwgJGJMZW4sIHVucGFjayggIkg0MCIsICRzV2sgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+T3BOYW1lCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgT3BOYW1lIHsKKyAgICBteSAoJGJPcCkgPSBAXzsKKyAgICByZXR1cm4gKCBkZWZpbmVkICROYW1lVGJseyRiT3B9ICkgPyAkTmFtZVRibHskYk9wfSA6ICd1bmRlZic7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6RHVtcCAtIEEgY2xhc3MgZm9yIGR1bXBpbmcgRXhjZWwgcmVjb3Jkcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworTWFpbnRhaW5lciAwLjQwKzogSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworTWFpbnRhaW5lciAwLjI3LTAuMzM6IEdhYm9yIFN6YWJvIHN6YWJnYWJAY3Bhbi5vcmcKKworT3JpZ2luYWwgYXV0aG9yOiBLYXdhaSBUYWthbm9yaSBrd2l0a25yQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSm9obiBNY05hbWFyYQorCitDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworPWN1dAorCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdERlZmF1bHQucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdERlZmF1bHQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2ODY2ZgotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvRm10RGVmYXVsdC5wbQpAQCAtMCwwICsxLDIyMSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCAtIEEgY2xhc3MgZm9yIENlbGwgZm9ybWF0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKb2huIE1jTmFtYXJhCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisjIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkgcXcoRXhjZWxGbXQpOworb3VyICRWRVJTSU9OID0gJzAuNTknOworCitteSAlaEZtdERlZmF1bHQgPSAoCisgICAgMHgwMCA9PiAnQCcsCisgICAgMHgwMSA9PiAnMCcsCisgICAgMHgwMiA9PiAnMC4wMCcsCisgICAgMHgwMyA9PiAnIywjIzAnLAorICAgIDB4MDQgPT4gJyMsIyMwLjAwJywKKyAgICAweDA1ID0+ICcoJCMsIyMwXyk7KCQjLCMjMCknLAorICAgIDB4MDYgPT4gJygkIywjIzBfKTtbUkVEXSgkIywjIzApJywKKyAgICAweDA3ID0+ICcoJCMsIyMwLjAwXyk7KCQjLCMjMC4wMF8pJywKKyAgICAweDA4ID0+ICcoJCMsIyMwLjAwXyk7W1JFRF0oJCMsIyMwLjAwXyknLAorICAgIDB4MDkgPT4gJzAlJywKKyAgICAweDBBID0+ICcwLjAwJScsCisgICAgMHgwQiA9PiAnMC4wMEUrMDAnLAorICAgIDB4MEMgPT4gJyMgPy8/JywKKyAgICAweDBEID0+ICcjID8/Lz8/JywKKyAgICAweDBFID0+ICd5eXl5LW1tLWRkJywgICAgICAjIFdhcyAnbS1kLXl5Jywgd2hpY2ggaXMgYmFkIGFzIHN5c3RlbSBkZWZhdWx0CisgICAgMHgwRiA9PiAnZC1tbW0teXknLAorICAgIDB4MTAgPT4gJ2QtbW1tJywKKyAgICAweDExID0+ICdtbW0teXknLAorICAgIDB4MTIgPT4gJ2g6bW0gQU0vUE0nLAorICAgIDB4MTMgPT4gJ2g6bW06c3MgQU0vUE0nLAorICAgIDB4MTQgPT4gJ2g6bW0nLAorICAgIDB4MTUgPT4gJ2g6bW06c3MnLAorICAgIDB4MTYgPT4gJ20tZC15eSBoOm1tJywKKworICAgICMweDE3LTB4MjQgLS0gRGlmZmVycyBpbiBOYXRpbmFsCisgICAgMHgyNSA9PiAnKCMsIyMwXyk7KCMsIyMwKScsCisgICAgMHgyNiA9PiAnKCMsIyMwXyk7W1JFRF0oIywjIzApJywKKyAgICAweDI3ID0+ICcoIywjIzAuMDApOygjLCMjMC4wMCknLAorICAgIDB4MjggPT4gJygjLCMjMC4wMCk7W1JFRF0oIywjIzAuMDApJywKKyAgICAweDI5ID0+ICdfKCojLCMjMF8pO18oKigjLCMjMCk7XygqIi0iXyk7XyhAXyknLAorICAgIDB4MkEgPT4gJ18oJCojLCMjMF8pO18oJCooIywjIzApO18oKiItIl8pO18oQF8pJywKKyAgICAweDJCID0+ICdfKCojLCMjMC4wMF8pO18oKigjLCMjMC4wMCk7XygqIi0iPz9fKTtfKEBfKScsCisgICAgMHgyQyA9PiAnXygkKiMsIyMwLjAwXyk7XygkKigjLCMjMC4wMCk7XygqIi0iPz9fKTtfKEBfKScsCisgICAgMHgyRCA9PiAnbW06c3MnLAorICAgIDB4MkUgPT4gJ1toXTptbTpzcycsCisgICAgMHgyRiA9PiAnbW06c3MuMCcsCisgICAgMHgzMCA9PiAnIyMwLjBFKzAnLAorICAgIDB4MzEgPT4gJ0AnLAorKTsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBuZXcgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBuZXcgeworICAgIG15ICggJHNQa2csICVoS2V5ICkgPSBAXzsKKyAgICBteSAkb1RoaXMgPSB7fTsKKyAgICBibGVzcyAkb1RoaXM7CisgICAgcmV0dXJuICRvVGhpczsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXh0Rm10IChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdERlZmF1bHQpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgVGV4dEZtdCB7CisgICAgbXkgKCAkb1RoaXMsICRzVHh0LCAkc0NvZGUgKSA9IEBfOworICAgIHJldHVybiAkc1R4dCBpZiAoICggIWRlZmluZWQoJHNDb2RlKSApIHx8ICggJHNDb2RlIGVxICdfbmF0aXZlXycgKSApOworICAgIHJldHVybiBwYWNrKCAnVSonLCB1bnBhY2soICduKicsICRzVHh0ICkgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGbXRTdHJpbmdEZWYgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBGbXRTdHJpbmdEZWYgeworICAgIG15ICggJG9UaGlzLCAkaUZtdElkeCwgJG9Cb29rLCAkcmhGbXQgKSA9IEBfOworICAgIG15ICRzRm10U3RyID0gJG9Cb29rLT57Rm9ybWF0U3RyfS0+eyRpRm10SWR4fTsKKworICAgIGlmICggISggZGVmaW5lZCgkc0ZtdFN0cikgKSAmJiBkZWZpbmVkKCRyaEZtdCkgKSB7CisgICAgICAgICRzRm10U3RyID0gJHJoRm10LT57JGlGbXRJZHh9OworICAgIH0KKyAgICAkc0ZtdFN0ciA9ICRoRm10RGVmYXVsdHskaUZtdElkeH0gdW5sZXNzICgkc0ZtdFN0cik7CisgICAgcmV0dXJuICRzRm10U3RyOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZtdFN0cmluZyAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXREZWZhdWx0KQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIEZtdFN0cmluZyB7CisgICAgbXkgKCAkb1RoaXMsICRvQ2VsbCwgJG9Cb29rICkgPSBAXzsKKworICAgIG15ICRzRm10U3RyID0KKyAgICAgICRvVGhpcy0+Rm10U3RyaW5nRGVmKCAkb0Jvb2stPntGb3JtYXR9WyAkb0NlbGwtPntGb3JtYXROb30gXS0+e0ZtdElkeH0sCisgICAgICAgICRvQm9vayApOworCisgICAgIyBTcGVjaWFsIGNhc2UgZm9yIGNlbGxzIHRoYXQgdXNlIExvdHVzMTIzIHN0eWxlIGxlYWRpbmcKKyAgICAjIGFwb3N0cm9waGUgdG8gZGVzaWduYXRlIHRleHQgZm9ybWF0dGluZy4KKyAgICBpZiAoICRvQm9vay0+e0Zvcm1hdH1bICRvQ2VsbC0+e0Zvcm1hdE5vfSBdLT57S2V5MTIzfSApIHsKKyAgICAgICAgJHNGbXRTdHIgPSAnQCc7CisgICAgfQorCisgICAgdW5sZXNzICggZGVmaW5lZCgkc0ZtdFN0cikgKSB7CisgICAgICAgIGlmICggJG9DZWxsLT57VHlwZX0gZXEgJ051bWVyaWMnICkgeworICAgICAgICAgICAgaWYgKCBpbnQoICRvQ2VsbC0+e1ZhbH0gKSAhPSAkb0NlbGwtPntWYWx9ICkgeworICAgICAgICAgICAgICAgICRzRm10U3RyID0gJzAuMDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJHNGbXRTdHIgPSAnMCc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkb0NlbGwtPntUeXBlfSBlcSAnRGF0ZScgKSB7CisgICAgICAgICAgICBpZiAoIGludCggJG9DZWxsLT57VmFsfSApIDw9IDAgKSB7CisgICAgICAgICAgICAgICAgJHNGbXRTdHIgPSAnaDptbTpzcyc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAkc0ZtdFN0ciA9ICd5eXl5LW1tLWRkJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRzRm10U3RyID0gJ0AnOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkc0ZtdFN0cjsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBWYWxGbXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBWYWxGbXQgeworICAgIG15ICggJG9UaGlzLCAkb0NlbGwsICRvQm9vayApID0gQF87CisKKyAgICBteSAoICREdCwgJGlGbXRJZHgsICRpTnVtZXJpYywgJEZsZzE5MDQgKTsKKworICAgIGlmICggJG9DZWxsLT57VHlwZX0gZXEgJ1RleHQnICkgeworICAgICAgICAkRHQgPQorICAgICAgICAgICggKCBkZWZpbmVkICRvQ2VsbC0+e1ZhbH0gKSAmJiAoICRvQ2VsbC0+e1ZhbH0gbmUgJycgKSApCisgICAgICAgICAgPyAkb1RoaXMtPlRleHRGbXQoICRvQ2VsbC0+e1ZhbH0sICRvQ2VsbC0+e0NvZGV9ICkKKyAgICAgICAgICA6ICcnOworCisgICAgICAgIHJldHVybiAkRHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkRHQgICAgICA9ICRvQ2VsbC0+e1ZhbH07CisgICAgICAgICRGbGcxOTA0ID0gJG9Cb29rLT57RmxnMTkwNH07CisgICAgICAgIG15ICRzRm10U3RyID0gJG9UaGlzLT5GbXRTdHJpbmcoICRvQ2VsbCwgJG9Cb29rICk7CisKKyAgICAgICAgcmV0dXJuIEV4Y2VsRm10KCAkc0ZtdFN0ciwgJER0LCAkRmxnMTkwNCwgJG9DZWxsLT57VHlwZX0gKTsKKyAgICB9Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hrVHlwZSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXREZWZhdWx0KQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIENoa1R5cGUgeworICAgIG15ICggJG9Qa2csICRpTnVtZXJpYywgJGlGbXRJZHggKSA9IEBfOworICAgIGlmICgkaU51bWVyaWMpIHsKKyAgICAgICAgaWYgKCAgICggKCAkaUZtdElkeCA+PSAweDBFICkgJiYgKCAkaUZtdElkeCA8PSAweDE2ICkgKQorICAgICAgICAgICAgfHwgKCAoICRpRm10SWR4ID49IDB4MkQgKSAmJiAoICRpRm10SWR4IDw9IDB4MkYgKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJEYXRlIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiTnVtZXJpYyI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAiVGV4dCI7CisgICAgfQorfQorCisxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdERlZmF1bHQgLSBBIGNsYXNzIGZvciBDZWxsIGZvcm1hdHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorCis9aGVhZDEgQVVUSE9SCisKK01haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkga3dpdGtuckBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBBcnRpc3RpYyBMaWNlbnNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIFBlcmwgUkVBRE1FIGZpbGUuCisKKz1jdXQKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvRm10SmFwYW4ucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdEphcGFuLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZjJiMTYKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdEphcGFuLnBtCkBAIC0wLDAgKzEsMjEwIEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRKYXBhbjsKK3VzZSB1dGY4OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRKYXBhbiAtIEEgY2xhc3MgZm9yIENlbGwgZm9ybWF0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKb2huIE1jTmFtYXJhCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisjIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRW5jb2RlIHF3KGZpbmRfZW5jb2RpbmcgZGVjb2RlKTsKK3VzZSBiYXNlICdTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCc7CitvdXIgJFZFUlNJT04gPSAnMC41OSc7CisKK215ICVGb3JtYXRUYWJsZSA9ICgKKyAgICAweDAwID0+ICdAJywKKyAgICAweDAxID0+ICcwJywKKyAgICAweDAyID0+ICcwLjAwJywKKyAgICAweDAzID0+ICcjLCMjMCcsCisgICAgMHgwNCA9PiAnIywjIzAuMDAnLAorICAgIDB4MDUgPT4gJyhcXCMsIyMwXyk7KFxcIywjIzApJywKKyAgICAweDA2ID0+ICcoXFwjLCMjMF8pO1tSRURdKFxcIywjIzApJywKKyAgICAweDA3ID0+ICcoXFwjLCMjMC4wMF8pOyhcXCMsIyMwLjAwXyknLAorICAgIDB4MDggPT4gJyhcXCMsIyMwLjAwXyk7W1JFRF0oXFwjLCMjMC4wMF8pJywKKyAgICAweDA5ID0+ICcwJScsCisgICAgMHgwQSA9PiAnMC4wMCUnLAorICAgIDB4MEIgPT4gJzAuMDBFKzAwJywKKyAgICAweDBDID0+ICcjID8vPycsCisgICAgMHgwRCA9PiAnIyA/Py8/PycsCisKKyAgICAjICAgIDB4MEUgPT4gJ20vZC95eScsCisgICAgMHgwRSA9PiAneXl5eS9tL2QnLAorICAgIDB4MEYgPT4gJ2QtbW1tLXl5JywKKyAgICAweDEwID0+ICdkLW1tbScsCisgICAgMHgxMSA9PiAnbW1tLXl5JywKKyAgICAweDEyID0+ICdoOm1tIEFNL1BNJywKKyAgICAweDEzID0+ICdoOm1tOnNzIEFNL1BNJywKKyAgICAweDE0ID0+ICdoOm1tJywKKyAgICAweDE1ID0+ICdoOm1tOnNzJywKKworICAgICMgICAgMHgxNiA9PiAnbS9kL3l5IGg6bW0nLAorICAgIDB4MTYgPT4gJ3l5eXkvbS9kIGg6bW0nLAorCisgICAgIzB4MTctMHgyNCAtLSBEaWZmZXJzIGluIE5hdGluYWwKKyAgICAweDFFID0+ICdtL2QveXknLAorICAgIDB4MUYgPT4gJ3l5eXki5bm0Im0i5pyIImQi5pelIicsCisgICAgMHgyMCA9PiAnaCLmmYIibW0i5YiGIicsCisgICAgMHgyMSA9PiAnaCLmmYIibW0i5YiGInNzIuenkiInLAorCisgICAgIzB4MTctMHgyNCAtLSBEaWZmZXJzIGluIE5hdGluYWwKKyAgICAweDI1ID0+ICcoIywjIzBfKTsoIywjIzApJywKKyAgICAweDI2ID0+ICcoIywjIzBfKTtbUkVEXSgjLCMjMCknLAorICAgIDB4MjcgPT4gJygjLCMjMC4wMCk7KCMsIyMwLjAwKScsCisgICAgMHgyOCA9PiAnKCMsIyMwLjAwKTtbUkVEXSgjLCMjMC4wMCknLAorICAgIDB4MjkgPT4gJ18oKiMsIyMwXyk7XygqKCMsIyMwKTtfKCoiLSJfKTtfKEBfKScsCisgICAgMHgyQSA9PiAnXyhcXCojLCMjMF8pO18oXFwqKCMsIyMwKTtfKCoiLSJfKTtfKEBfKScsCisgICAgMHgyQiA9PiAnXygqIywjIzAuMDBfKTtfKCooIywjIzAuMDApO18oKiItIj8/Xyk7XyhAXyknLAorICAgIDB4MkMgPT4gJ18oXFwqIywjIzAuMDBfKTtfKFxcKigjLCMjMC4wMCk7XygqIi0iPz9fKTtfKEBfKScsCisgICAgMHgyRCA9PiAnbW06c3MnLAorICAgIDB4MkUgPT4gJ1toXTptbTpzcycsCisgICAgMHgyRiA9PiAnbW06c3MuMCcsCisgICAgMHgzMCA9PiAnIyMwLjBFKzAnLAorICAgIDB4MzEgPT4gJ0AnLAorCisgICAgMHgzNyA9PiAneXl5eSLlubQibSLmnIgiJywKKyAgICAweDM4ID0+ICdtIuaciCJkIuaXpSInLAorICAgIDB4MzkgPT4gJ2dlLm0uZCcsCisgICAgMHgzQSA9PiAnZ2dnZSLlubQibSLmnIgiZCLml6UiJywKKyk7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbmV3IChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIG5ldyB7CisgICAgbXkgKCAkY2xhc3MsICVhcmdzICkgPSBAXzsKKyAgICBteSAkZW5jb2RpbmcgPSAkYXJnc3tDb2RlfSB8fCAkYXJnc3tlbmNvZGluZ307CisgICAgbXkgJHNlbGYgPSB7IENvZGUgPT4gJGVuY29kaW5nIH07CisgICAgaWYoJGVuY29kaW5nKXsKKyAgICAgICAgJHNlbGYtPntlbmNvZGluZ30gPSBmaW5kX2VuY29kaW5nKCRlbmNvZGluZyBlcSAnc2ppcycgPyAnY3A5MzInIDogJGVuY29kaW5nKQorICAgICAgICAgICAgb3IgZG97CisgICAgICAgICAgICAgICAgcmVxdWlyZSBDYXJwOworICAgICAgICAgICAgICAgIENhcnA6OmNyb2FrKHFxe1Vua25vd24gZW5jb2RpbmcgJyRlbmNvZGluZyd9KTsKKyAgICAgICAgICAgIH07CisgICAgfQorICAgIHJldHVybiBibGVzcyAkc2VsZiwgJGNsYXNzOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRleHRGbXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4pCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgVGV4dEZtdCB7CisgICAgbXkgKCAkc2VsZiwgJHRleHQsICRpbnB1dF9lbmNvZGluZyApID0gQF87CisgICAgaWYoIWRlZmluZWQgJGlucHV0X2VuY29kaW5nKXsKKyAgICAgICAgJGlucHV0X2VuY29kaW5nID0gJ3V0ZjgnOworICAgIH0KKyAgICBlbHNpZigkaW5wdXRfZW5jb2RpbmcgZXEgJ19uYXRpdmVfJyl7CisgICAgICAgICRpbnB1dF9lbmNvZGluZyA9ICdjcDkzMic7ICMgU2hpZnRfSklTIGluIE1pY3Jvc29mdCBwcm9kdWN0cworICAgIH0KKyAgICAkdGV4dCA9IGRlY29kZSgkaW5wdXRfZW5jb2RpbmcsICR0ZXh0KTsKKyAgICByZXR1cm4gJHNlbGYtPntDb2RlfSA/ICRzZWxmLT57ZW5jb2Rpbmd9LT5lbmNvZGUoJHRleHQpIDogJHRleHQ7Cit9CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZtdFN0cmluZ0RlZiAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRKYXBhbikKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBGbXRTdHJpbmdEZWYgeworICAgIG15ICggJHNlbGYsICRmb3JtYXRfaW5kZXgsICRib29rICkgPSBAXzsKKyAgICByZXR1cm4gJHNlbGYtPlNVUEVSOjpGbXRTdHJpbmdEZWYoICRmb3JtYXRfaW5kZXgsICRib29rLCBcJUZvcm1hdFRhYmxlICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ252TmVuZ28gKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4pCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgQ29udmVydCBBLkQuIGludG8gSmFwYW5lc2UgTmVuZ28gKGFrYSBHZW5nbykKKworbXkgQE5lbmdvID0gKAorCXsKKwkJbmFtZSAgICAgID0+ICflubPmiJAnLCAjIEhlaXNlaQorCQlhYmJyX25hbWUgPT4gJ0gnLAorCisJCWJhc2UgICAgICA9PiAxOTg4LAorCQlzdGFydCAgICAgPT4gMTk4OTAxMDgsCisJfSwKKwl7CisJCW5hbWUgICAgICA9PiAn5pit5ZKMJywgIyBTaG93YQorCQlhYmJyX25hbWUgPT4gJ1MnLAorCisJCWJhc2UgICAgICA9PiAxOTI1LAorCQlzdGFydCAgICAgPT4gMTkyNjEyMjUsCisJfSwKKwl7CisJCW5hbWUgICAgICA9PiAn5aSn5q2jJywgIyBUYWlzaG8KKwkJYWJicl9uYW1lID0+ICdUJywKKworCQliYXNlICAgICAgPT4gMTkxMSwKKwkJc3RhcnQgICAgID0+IDE5MTIwNzMwLAorCX0sCisJeworCQluYW1lICAgICAgPT4gJ+aYjuayuycsICMgTWVpamkKKwkJYWJicl9uYW1lID0+ICdNJywKKworCQliYXNlICAgICAgPT4gMTg2NywKKwkJc3RhcnQgICAgID0+IDE4NjgwOTA4LAorCX0sCispOworCisjIFVzYWdlOiBDbnZOZW5nbyhuYW1lID0+IEB0bSkgb3IgQ252TmVuZyhhYmJyX25hbWUgPT4gQHRtKQorc3ViIENudk5lbmdvIHsKKyAgICBteSAoICRraW5kLCBAdG0gKSA9IEBfOworICAgIG15ICR5ZWFyID0gJHRtWzVdICsgMTkwMDsKKyAgICBteSAkd2sgPSAoJHllYXIgKiAxMDAwMCkgKyAoJHRtWzRdICogMTAwKSArICgkdG1bM10gKiAxKTsKKyAgICAjbXkgJHdrID0gc3ByaW50ZiggJyUwNGQlMDJkJTAyZCcsICR5ZWFyLCAkdG1bNF0sICR0bVszXSApOworICAgIGZvcmVhY2ggbXkgJG5lbmdvKEBOZW5nbyl7CisgICAgICAgIGlmKCAkd2sgPj0gJG5lbmdvLT57c3RhcnR9ICl7CisgICAgICAgICAgICByZXR1cm4gJG5lbmdvLT57JGtpbmR9IC4gKCR5ZWFyIC0gJG5lbmdvLT57YmFzZX0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkeWVhcjsKK30KKworMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRKYXBhbiAtIEEgY2xhc3MgZm9yIENlbGwgZm9ybWF0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworTWFpbnRhaW5lciAwLjQwKzogSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworTWFpbnRhaW5lciAwLjI3LTAuMzM6IEdhYm9yIFN6YWJvIHN6YWJnYWJAY3Bhbi5vcmcKKworT3JpZ2luYWwgYXV0aG9yOiBLYXdhaSBUYWthbm9yaSBrd2l0a25yQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSm9obiBNY05hbWFyYQorCitDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9GbXRKYXBhbjIucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdEphcGFuMi5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMThjYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9GbXRKYXBhbjIucG0KQEAgLTAsMCArMSwxMDMgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuMjsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4yIC0gQSBjbGFzcyBmb3IgQ2VsbCBmb3JtYXRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisjCisjIENvcHlyaWdodCAoYykgMjAwOSAgICAgIEpvaG4gTWNOYW1hcmEKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKyMgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKyMKKyMgcGVybHRpZHkgd2l0aCBzdGFuZGFyZCBzZXR0aW5ncy4KKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBKY29kZTsKK3VzZSBVbmljb2RlOjpNYXA7Cit1c2UgYmFzZSAnU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuJzsKK291ciAkVkVSU0lPTiA9ICcwLjU5JzsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBuZXcgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4yKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIG5ldyB7CisgICAgbXkgKCAkc1BrZywgJWhLZXkgKSA9IEBfOworICAgIG15ICRvTWFwID0gVW5pY29kZTo6TWFwLT5uZXcoJ0NQOTMyRXhjZWwnKTsKKyAgICBkaWUgIk5PIE1BUCBGSUxFIENQOTMyRXhjZWwhISIKKyAgICAgIHVubGVzcyAoIC1yIFVuaWNvZGU6Ok1hcC0+bWFwcGluZygiQ1A5MzJFeGNlbCIpICk7CisKKyAgICBteSAkb1RoaXMgPSB7CisgICAgICAgIENvZGUgICAgPT4gJGhLZXl7Q29kZX0sCisgICAgICAgIF9VbmlNYXAgPT4gJG9NYXAsCisgICAgfTsKKyAgICBibGVzcyAkb1RoaXM7CisgICAgJG9UaGlzLT5TVVBFUjo6bmV3KCVoS2V5KTsKKyAgICByZXR1cm4gJG9UaGlzOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRleHRGbXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4yKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIFRleHRGbXQgeworICAgIG15ICggJG9UaGlzLCAkc1R4dCwgJHNDb2RlICkgPSBAXzsKKworICAgICMgICAgJHNDb2RlID0gJ3NqaXMnIGlmKCghIGRlZmluZWQoJHNDb2RlKSkgfHwgKCRzQ29kZSBlcSAnX25hdGl2ZV8nKSk7CisgICAgaWYgKCAkb1RoaXMtPntDb2RlfSApIHsKKyAgICAgICAgaWYgKCAhZGVmaW5lZCgkc0NvZGUpICkgeworICAgICAgICAgICAgJHNUeHQgPX4gcy8oLikvXHgwMCQxL3NnOworICAgICAgICAgICAgJHNUeHQgPSAkb1RoaXMtPntfVW5pTWFwfS0+ZnJvbV91bmljb2RlKCRzVHh0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRzQ29kZSBlcSAndWNzMicgKSB7CisgICAgICAgICAgICAkc1R4dCA9ICRvVGhpcy0+e19VbmlNYXB9LT5mcm9tX3VuaWNvZGUoJHNUeHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBKY29kZTo6Y29udmVydCggJHNUeHQsICRvVGhpcy0+e0NvZGV9LCAnc2ppcycgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAkc1R4dDsKKyAgICB9Cit9CisxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuMiAtIEEgY2xhc3MgZm9yIENlbGwgZm9ybWF0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworTWFpbnRhaW5lciAwLjQwKzogSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworTWFpbnRhaW5lciAwLjI3LTAuMzM6IEdhYm9yIFN6YWJvIHN6YWJnYWJAY3Bhbi5vcmcKKworT3JpZ2luYWwgYXV0aG9yOiBLYXdhaSBUYWthbm9yaSBrd2l0a25yQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSm9obiBNY05hbWFyYQorCitDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9GbXRVbmljb2RlLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9GbXRVbmljb2RlLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMzY4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdFVuaWNvZGUucG0KQEAgLTAsMCArMSwxMDQgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdFVuaWNvZGU7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdFVuaWNvZGUgLSBBIGNsYXNzIGZvciBDZWxsIGZvcm1hdHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFVuaWNvZGU6Ok1hcDsKK3VzZSBiYXNlICdTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCc7CisKK291ciAkVkVSU0lPTiA9ICcwLjU5JzsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBuZXcgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10VW5pY29kZSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBuZXcgeworICAgIG15ICggJHNQa2csICVoS2V5ICkgPSBAXzsKKyAgICBteSAkc01hcCA9ICRoS2V5e1VuaWNvZGVfTWFwfTsKKyAgICBteSAkb01hcDsKKyAgICAkb01hcCA9IFVuaWNvZGU6Ok1hcC0+bmV3KCRzTWFwKSBpZiAkc01hcDsKKyAgICBteSAkb1RoaXMgPSB7CisgICAgICAgIFVuaWNvZGVfTWFwID0+ICRzTWFwLAorICAgICAgICBfVW5pTWFwICAgICA9PiAkb01hcCwKKyAgICB9OworICAgIGJsZXNzICRvVGhpczsKKyAgICByZXR1cm4gJG9UaGlzOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRleHRGbXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10VW5pY29kZSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBUZXh0Rm10IHsKKyAgICBteSAoICRvVGhpcywgJHNUeHQsICRzQ29kZSApID0gQF87CisgICAgaWYgKCAkb1RoaXMtPntfVW5pTWFwfSApIHsKKyAgICAgICAgaWYgKCAhZGVmaW5lZCgkc0NvZGUpICkgeworICAgICAgICAgICAgbXkgJHNTdiA9ICRzVHh0OworICAgICAgICAgICAgJHNUeHQgPX4gcy8oLikvXHgwMCQxL3NnOworICAgICAgICAgICAgJHNUeHQgPSAkb1RoaXMtPntfVW5pTWFwfS0+ZnJvbV91bmljb2RlKCRzVHh0KTsKKyAgICAgICAgICAgICRzVHh0ID0gJHNTdiB1bmxlc3MgKCRzVHh0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRzQ29kZSBlcSAndWNzMicgKSB7CisgICAgICAgICAgICAkc1R4dCA9ICRvVGhpcy0+e19VbmlNYXB9LT5mcm9tX3VuaWNvZGUoJHNUeHQpOworICAgICAgICB9CisKKyAgICAgICAgIyAgICAgICAgJHNUeHQgPSAkb1RoaXMtPntfVW5pTWFwfS0+ZnJvbV91bmljb2RlKCRzVHh0KQorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgaWYoZGVmaW5lZCgkc0NvZGUpICYmICRzQ29kZSBlcSAndWNzMicpOworICAgICAgICByZXR1cm4gJHNUeHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gJHNUeHQ7CisgICAgfQorfQorMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRVbmljb2RlIC0gQSBjbGFzcyBmb3IgQ2VsbCBmb3JtYXRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIEFVVEhPUgorCitNYWludGFpbmVyIDAuNDArOiBKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCitNYWludGFpbmVyIDAuMjctMC4zMzogR2Fib3IgU3phYm8gc3phYmdhYkBjcGFuLm9yZworCitPcmlnaW5hbCBhdXRob3I6IEthd2FpIFRha2Fub3JpIGt3aXRrbnJAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBKb2huIE1jTmFtYXJhCisKK0NvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisKK0NvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1lvdSBtYXkgZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgQXJ0aXN0aWMgTGljZW5zZSwgYXMgc3BlY2lmaWVkIGluIHRoZSBQZXJsIFJFQURNRSBmaWxlLgorCis9Y3V0CmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZvbnQucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZvbnQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzYjFmZAotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvRm9udC5wbQpAQCAtMCwwICsxLDY5IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGb250OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGb250IC0gQSBjbGFzcyBmb3IgQ2VsbCBmb250cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKb2huIE1jTmFtYXJhCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisjIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCitvdXIgJFZFUlNJT04gPSAnMC41OSc7CisKK3N1YiBuZXcgeworICAgIG15ICggJGNsYXNzLCAlcmhJbmkgKSA9IEBfOworICAgIG15ICRzZWxmID0gXCVyaEluaTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9udCAtIEEgY2xhc3MgZm9yIENlbGwgZm9udHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorCis9aGVhZDEgQVVUSE9SCisKK01haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkga3dpdGtuckBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBBcnRpc3RpYyBMaWNlbnNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIFBlcmwgUkVBRE1FIGZpbGUuCisKKz1jdXQKKwpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9Gb3JtYXQucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0Zvcm1hdC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGI3NjJmCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9Gb3JtYXQucG0KQEAgLTAsMCArMSw2OCBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9ybWF0OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGb3JtYXQgLSBBIGNsYXNzIGZvciBDZWxsIGZvcm1hdHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCitzdWIgbmV3IHsKKyAgICBteSAoICRjbGFzcywgJXJoSW5pICkgPSBAXzsKKyAgICBteSAkc2VsZiA9IFwlcmhJbmk7CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworfQorCisxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZvcm1hdCAtIEEgY2xhc3MgZm9yIENlbGwgZm9ybWF0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworTWFpbnRhaW5lciAwLjQwKzogSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworTWFpbnRhaW5lciAwLjI3LTAuMzM6IEdhYm9yIFN6YWJvIHN6YWJnYWJAY3Bhbi5vcmcKKworT3JpZ2luYWwgYXV0aG9yOiBLYXdhaSBUYWthbm9yaSBrd2l0a25yQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSm9obiBNY05hbWFyYQorCitDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9TYXZlUGFyc2VyLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9TYXZlUGFyc2VyLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMmNmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1NhdmVQYXJzZXIucG0KQEAgLTAsMCArMSwzMTAgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXIgLSBSZXdyaXRlIGFuIGV4aXN0aW5nIEV4Y2VsIGZpbGUuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOwordXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOjpXb3JrYm9vazsKK3VzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya3NoZWV0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOwordXNlIGJhc2UgJ1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsJzsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCitzdWIgbmV3IHsKKworICAgIG15ICggJHBhY2thZ2UsICVwYXJhbXMgKSA9IEBfOworICAgICRwYWNrYWdlLT5TVVBFUjo6bmV3KCVwYXJhbXMpOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENyZWF0ZSgpCisjCitzdWIgQ3JlYXRlIHsKKworICAgIG15ICggJHNlbGYsICRmb3JtYXR0ZXIgKSA9IEBfOworCisgICAgIzAuIE5ldyAkd29ya2Jvb2sKKyAgICBteSAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6V29ya2Jvb2stPm5ldygpOworICAgICR3b3JrYm9vay0+e1NoZWV0Q291bnR9ID0gMDsKKworICAgICMgVXNlciBzcGVjaWZpZWQgZm9ybWF0ZXIgY2xhc3MuCisgICAgaWYgKCRmb3JtYXR0ZXIpIHsKKyAgICAgICAgJHdvcmtib29rLT57Rm10Q2xhc3N9ID0gJGZvcm1hdHRlcjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICR3b3JrYm9vay0+e0ZtdENsYXNzfSA9IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXREZWZhdWx0LT5uZXcoKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rLT5uZXcoJHdvcmtib29rKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBQYXJzZSgpCisjCitzdWIgUGFyc2UgeworCisgICAgbXkgKCAkc2VsZiwgJHNGaWxlLCAkZm9ybWF0dGVyICkgPSBAXzsKKworICAgIG15ICR3b3JrYm9vayA9ICRzZWxmLT5TVVBFUjo6UGFyc2UoICRzRmlsZSwgJGZvcm1hdHRlciApOworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyBkZWZpbmVkICR3b3JrYm9vazsKKyAgICByZXR1cm4gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rLT5uZXcoJHdvcmtib29rKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTYXZlQXMoKQorIworc3ViIFNhdmVBcyB7CisKKyAgICBteSAoICRzZWxmLCAkd29ya2Jvb2ssICRmaWxlbmFtZSApID0gQF87CisKKyAgICAkd29ya2Jvb2stPlNhdmVBcygkZmlsZW5hbWUpOworfQorCisxOworCitfX0VORF9fCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyIC0gUmV3cml0ZSBhbiBleGlzdGluZyBFeGNlbCBmaWxlLgorCis9aGVhZDEgU1lOT1BTSVMKKworCisKK1NheSB3ZSBzdGFydCB3aXRoIGFuIEV4Y2VsIGZpbGUgdGhhdCBsb29rcyBsaWtlIHRoaXM6CisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCAgIHwgICAgICBBICAgICAgfCAgICAgIEIgICAgICB8ICAgICAgQyAgICAgIHwKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCAxIHwgSGVsbG8gICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCAyIHwgV29ybGQgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCAzIHwgKkJvbGQgdGV4dCogfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCA0IHwgLi4uICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCA1IHwgLi4uICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorCisKK1RoZW4gd2UgcHJvY2VzcyBpdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbToKKworICAgICMhL3Vzci9iaW4vcGVybAorCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2Ugd2FybmluZ3M7CisKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOworCisKKyAgICAjIE9wZW4gYW4gZXhpc3RpbmcgZmlsZSB3aXRoIFNhdmVQYXJzZXIKKyAgICBteSAkcGFyc2VyICAgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlci0+bmV3KCk7CisgICAgbXkgJHRlbXBsYXRlID0gJHBhcnNlci0+UGFyc2UoJ3RlbXBsYXRlLnhscycpOworCisKKyAgICAjIEdldCB0aGUgZmlyc3Qgd29ya3NoZWV0LgorICAgIG15ICR3b3Jrc2hlZXQgPSAkdGVtcGxhdGUtPndvcmtzaGVldCgwKTsKKyAgICBteSAkcm93ICA9IDA7CisgICAgbXkgJGNvbCAgPSAwOworCisKKyAgICAjIE92ZXJ3cml0ZSB0aGUgc3RyaW5nIGluIGNlbGwgQTEKKyAgICAkd29ya3NoZWV0LT5BZGRDZWxsKCAkcm93LCAkY29sLCAnTmV3IHN0cmluZycgKTsKKworCisgICAgIyBBZGQgYSBuZXcgc3RyaW5nIGluIGNlbGwgQjEKKyAgICAkd29ya3NoZWV0LT5BZGRDZWxsKCAkcm93LCAkY29sICsgMSwgJ05ld2VyJyApOworCisKKyAgICAjIEFkZCBhIG5ldyBzdHJpbmcgaW4gY2VsbCBDMSB3aXRoIHRoZSBmb3JtYXQgZnJvbSBjZWxsIEEzLgorICAgIG15ICRjZWxsID0gJHdvcmtzaGVldC0+Z2V0X2NlbGwoICRyb3cgKyAyLCAkY29sICk7CisgICAgbXkgJGZvcm1hdF9udW1iZXIgPSAkY2VsbC0+e0Zvcm1hdE5vfTsKKworICAgICR3b3Jrc2hlZXQtPkFkZENlbGwoICRyb3csICRjb2wgKyAyLCAnTmV3ZXN0JywgJGZvcm1hdF9udW1iZXIgKTsKKworCisgICAgIyBXcml0ZSBvdmVyIHRoZSBleGlzdGluZyBmaWxlIG9yIHdyaXRlIGEgbmV3IGZpbGUuCisgICAgJHRlbXBsYXRlLT5TYXZlQXMoJ25ld2ZpbGUueGxzJyk7CisKKworV2Ugc2hvdWxkIG5vdyBoYXZlIGFuIEV4Y2VsIGZpbGUgdGhhdCBsb29rcyBsaWtlIHRoaXM6CisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCAgIHwgICAgICBBICAgICAgfCAgICAgIEIgICAgICB8ICAgICAgQyAgICAgIHwKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCAxIHwgTmV3IHN0cmluZyAgfCBOZXdlciAgICAgICB8ICpOZXdlc3QqICAgIHwgIC4uLgorICAgfCAyIHwgV29ybGQgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCAzIHwgKkJvbGQgdGV4dCogfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCA0IHwgLi4uICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCA1IHwgLi4uICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorCisKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyPiBtb2R1bGUgcmV3cml0ZSBhbiBleGlzdGluZyBFeGNlbCBmaWxlIGJ5IHJlYWRpbmcgaXQgd2l0aCBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsPiBhbmQgcmV3cml0aW5nIGl0IHdpdGggQzxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4uCisKKz1oZWFkMSBNRVRIT0RTCisKKz1oZWFkMSBQYXJzZXIKKworPWhlYWQyIG5ldygpCisKKyAgICAkcGFyc2UgPSBuZXcgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXIoKTsKKworQ29uc3RydWN0b3IuCisKKz1oZWFkMiBQYXJzZSgpCisKKyAgICAkd29ya2Jvb2sgPSAkcGFyc2UtPlBhcnNlKCRzRmlsZU5hbWUpOworCisgICAgJHdvcmtib29rID0gJHBhcnNlLT5QYXJzZSgkc0ZpbGVOYW1lICwgJGZvcm1hdHRlcik7CisKK1JldHVybnMgYSBMPC9Xb3JrYm9vaz4gb2JqZWN0LiBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybnMgdW5kZWYuCisKK1RoZSBvcHRpb25hbCBDPCRmb3JtYXR0ZXI+IGlzIGEgRm9ybWF0dGVyIENsYXNzIHRvIGZvcm1hdCB0aGUgdmFsdWUgb2YgY2VsbHMuCisKKworPWhlYWQxIFdvcmtib29rCisKK1RoZSBDPFBhcnNlKCk+IG1ldGhvZCByZXR1cm5zIGEgQzxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2s+IG9iamVjdC4KKworVGhpcyBpcyBhIHN1YmNsYXNzIG9mIHRoZSBMPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3JrYm9vaz4gYW5kIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKKz1oZWFkMiB3b3Jrc2hlZXRzKCkKKworUmV0dXJucyBhbiBhcnJheSBvZiBMPC9Xb3Jrc2hlZXQ+IG9iamVjdHMuIFRoaXMgd2FzIG1vc3QgY29tbW9ubHkgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHdvcmtzaGVldHMgaW4gYSB3b3JrYm9vazoKKworICAgIGZvciBteSAkd29ya3NoZWV0ICggJHdvcmtib29rLT53b3Jrc2hlZXRzKCkgKSB7CisgICAgICAgIC4uLgorICAgIH0KKworPWhlYWQyIHdvcmtzaGVldCgpCisKK1RoZSBDPHdvcmtzaGVldCgpPiBtZXRob2QgcmV0dXJucyBhIHNpbmdsZSBDPFdvcmtzaGVldD4gb2JqZWN0IHVzaW5nIGVpdGhlciBpdHMgbmFtZSBvciBpbmRleDoKKworICAgICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPndvcmtzaGVldCgnU2hlZXQxJyk7CisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+d29ya3NoZWV0KDApOworCitSZXR1cm5zIEM8dW5kZWY+IGlmIHRoZSBzaGVldCBuYW1lIG9yIGluZGV4IGRvZXNuJ3QgZXhpc3QuCisKKworPWhlYWQyIEFkZFdvcmtzaGVldCgpCisKKyAgICAkd29ya2Jvb2sgPSAkd29ya2Jvb2stPkFkZFdvcmtzaGVldCgkbmFtZSwgJXByb3BlcnRpZXMpOworCitDcmVhdGUgYSBuZXcgV29ya3NoZWV0IG9iamVjdCBvZiB0eXBlIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldD4uCisKK1RoZSBDPCVwcm9wZXJ0aWVzPiBoYXNoIGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIG5ldyBXb3Jrc2hlZXQuCisKKworPWhlYWQyIEFkZEZvbnQKKworICAgICR3b3JrYm9vayA9ICR3b3JrYm9vay0+QWRkRm9udCglcHJvcGVydGllcyk7CisKK0NyZWF0ZSBuZXcgRm9udCBvYmplY3Qgb2YgdHlwZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGb250Pi4KKworVGhlIEM8JXByb3BlcnRpZXM+IGhhc2ggY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgbmV3IEZvbnQuCisKKworPWhlYWQyIEFkZEZvcm1hdAorCisgICAgJHdvcmtib29rID0gJHdvcmtib29rLT5BZGRGb3JtYXQoJXByb3BlcnRpZXMpOworCitUaGUgQzwlcHJvcGVydGllcz4gaGFzaCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiBuZXcgRm9udC4KKworCis9aGVhZDEgV29ya3NoZWV0CisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOjpXb3Jrc2hlZXQKKworV29ya3NoZWV0IGlzIGEgc3ViY2xhc3Mgb2YgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldC4KK0FuZCBoYXMgdGhlc2UgbWV0aG9kcyA6CisKKworVGhlIEM8V29ya3Nib29rOjp3b3Jrc2hlZXQoKT4gbWV0aG9kIHJldHVybnMgYSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOjpXb3Jrc2hlZXQ+IG9iamVjdC4KKworVGhpcyBpcyBhIHN1YmNsYXNzIG9mIHRoZSBMPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQ+IGFuZCBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCisKKz1oZWFkMSBBZGRDZWxsCisKKyAgICAkd29ya2Jvb2sgPSAkd29ya3NoZWV0LT5BZGRDZWxsKCRyb3csICRjb2wsICR2YWx1ZSwgJGZvcm1hdCBbJGVuY29kaW5nXSk7CisKK0NyZWF0ZSBuZXcgQ2VsbCBvYmplY3Qgb2YgdHlwZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpDZWxsPi4KKworVGhlIEM8JGZvcm1hdD4gcGFyYW1ldGVyIGlzIHRoZSBmb3JtYXQgbnVtYmVyIHJhdGhlciB0aGFuIGEgZnVsbCBmb3JtYXQgb2JqZWN0LgorCitUbyBzcGVjaWZ5IGp1c3Qgc2FtZSBhcyBhbm90aGVyIGNlbGwsCit5b3UgY2FuIHNldCBpdCBsaWtlIGJlbG93OgorCisgICAgJHJvdyAgICAgICAgICAgID0gMDsKKyAgICAkY29sICAgICAgICAgICAgPSAwOworICAgICR3b3Jrc2hlZXQgICAgICA9ICR0ZW1wbGF0ZS0+d29ya3NoZWV0KDApOworICAgICRjZWxsICAgICAgICAgICA9ICR3b3Jrc2hlZXQtPmdldF9jZWxsKCAkcm93LCAkY29sICk7CisgICAgJGZvcm1hdF9udW1iZXIgID0gJGNlbGwtPntGb3JtYXROb307CisKKyAgICAkd29ya3NoZWV0LT5BZGRDZWxsKCRyb3cgKzEsICRjb2xsLCAnTmV3IGRhdGEnLCAkZm9ybWF0X251bWJlcik7CisKKworCisKKz1oZWFkMSBUT0RPCisKK1BsZWFzZSBub3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgY3VycmVudGx5ICh2ZXJzaW9ucyAwLjUwLTAuNjApIHVuZGVyZ29pbmcgYSBtYWpvcgorcmVzdHJ1Y3R1cmluZyBhbmQgcmV3cml0aW5nLgorCis9aGVhZDEgS25vd24gUHJvYmxlbXMKKworCitZb3UgY2FuIG9ubHkgcmV3cml0ZSB0aGUgZmVhdHVyZXMgdGhhdCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBzdXBwb3J0cyBzbworbWFjcm9zLCBncmFwaHMgYW5kIHNvbWUgb3RoZXIgZmVhdHVyZXMgaW4gdGhlIG9yaWdpbmFsIEV4Y2VsIGZpbGUgd2lsbCBiZSBsb3N0LgorQWxzbywgZm9ybXVsYXMgYXJlbid0IHJld3JpdHRlbiwgb25seSB0aGUgcmVzdWx0IG9mIGEgZm9ybXVsYSBpcyB3cml0dGVuLgorCitPbmx5IGxhc3QgcHJpbnQgYXJlYSB3aWxsIHJlbWFpbi4gKE90aGVycyB3aWxsIGJlIHJlbW92ZWQpCisKKworPWhlYWQxIEFVVEhPUgorCitNYWludGFpbmVyIDAuNDArOiBKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCitNYWludGFpbmVyIDAuMjctMC4zMzogR2Fib3IgU3phYm8gc3phYmdhYkBjcGFuLm9yZworCitPcmlnaW5hbCBhdXRob3I6IEthd2FpIFRha2Fub3JpIGt3aXRrbnJAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBKb2huIE1jTmFtYXJhCisKK0NvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisKK0NvcHlyaWdodCAoYykgMjAwMC0yMDAyIEthd2FpIFRha2Fub3JpIGFuZCBOaXBwb24tUkFEIENvLiBPUCBEaXZpc2lvbgorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworCis9Y3V0CmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1NhdmVQYXJzZXIvV29ya2Jvb2sucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1NhdmVQYXJzZXIvV29ya2Jvb2sucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxMTU2MwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvU2F2ZVBhcnNlci9Xb3JrYm9vay5wbQpAQCAtMCwwICsxLDQzNiBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2s7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rIC0gQSBjbGFzcyBmb3IgU2F2ZVBhcnNlciBXb3JrYm9va3MuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIGJhc2UgJ1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3JrYm9vayc7CitvdXIgJFZFUlNJT04gPSAnMC41OSc7CisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N1YiBuZXcgeworICAgIG15ICggJHNQa2csICRvQm9vayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rICk7CisgICAgbXkgJW9UaGlzID0gJSRvQm9vazsKKyAgICBibGVzcyBcJW9UaGlzLCAkc1BrZzsKKworICAgICMgcmUtYmxlc3Mgd29ya3NoZWV0cyAoYW5kIHNldCB0aGVpciBfQm9vayBwcm9wZXJ0aWVzICEhISkKKyAgICBteSAkc1drUCA9IHJlZigkc1BrZykgfHwgIiRzUGtnIjsKKyAgICAkc1drUCA9fiBzL1dvcmtib29rJC9Xb3Jrc2hlZXQvOworICAgIG1hcCB7IGJsZXNzKCAkXywgJHNXa1AgKTsgfSBAeyAkb1RoaXN7V29ya3NoZWV0fSB9OworICAgIG1hcCB7ICRfLT57X0Jvb2t9ID0gXCVvVGhpczsgfSBAeyAkb1RoaXN7V29ya3NoZWV0fSB9OworICAgIHJldHVybiBcJW9UaGlzOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBhcnNlIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIFBhcnNlIHsKKyAgICBteSAoICRzQ2xhc3MsICRzRmlsZSwgJG9Xa0ZtdCApID0gQF87CisgICAgbXkgJG9Cb29rID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Oldvcmtib29rLT5QYXJzZSggJHNGaWxlLCAkb1drRm10ICk7CisgICAgYmxlc3MgJG9Cb29rLCAkc0NsYXNzOworCisgICAgIyByZS1ibGVzcyB3b3Jrc2hlZXRzIChhbmQgc2V0IHRoZWlyIF9Cb29rIHByb3BlcnRpZXMgISEhKQorICAgIG15ICRzV2tQID0gcmVmKCRzQ2xhc3MpIHx8ICIkc0NsYXNzIjsKKyAgICAkc1drUCA9fiBzL1dvcmtib29rJC9Xb3Jrc2hlZXQvOworICAgIG1hcCB7IGJsZXNzKCAkXywgJHNXa1AgKTsgfSBAeyAkb0Jvb2stPntXb3Jrc2hlZXR9IH07CisgICAgbWFwIHsgJF8tPntfQm9va30gPSAkb0Jvb2s7IH0gQHsgJG9Cb29rLT57V29ya3NoZWV0fSB9OworICAgIHJldHVybiAkb0Jvb2s7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2F2ZUFzIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIFNhdmVBcyB7CisgICAgbXkgKCAkb0Jvb2ssICRzTmFtZSApID0gQF87CisKKyAgICAjIENyZWF0ZSBhIG5ldyBFeGNlbCB3b3JrYm9vaworICAgIG15ICRvV3JFeCA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJHNOYW1lKTsKKyAgICAkb1dyRXgtPmNvbXBhdGliaWxpdHlfbW9kZSgpOworICAgIG15ICVoRm10OworCisgICAgbXkgJGlObyAgPSAwOworICAgIG15IEBhQWxIID0gKAorICAgICAgICAnbGVmdCcsICdsZWZ0JywgICAgJ2NlbnRlcicsICdyaWdodCcsCisgICAgICAgICdmaWxsJywgJ2p1c3RpZnknLCAnbWVyZ2UnLCAgJ2VxdWFsX3NwYWNlJworICAgICk7CisgICAgbXkgQGFBbFYgPSAoICd0b3AnLCAndmNlbnRlcicsICdib3R0b20nLCAndmp1c3RpZnknLCAndmVxdWFsX3NwYWNlJyApOworCisgICAgZm9yZWFjaCBteSAkcEZtdCAoIEB7ICRvQm9vay0+e0Zvcm1hdH0gfSApIHsKKyAgICAgICAgbXkgJG9GbXQgPSAkb1dyRXgtPmFkZGZvcm1hdCgpOyAgICAjIEFkZCBGb3JtYXRzCisgICAgICAgIHVubGVzcyAoICRwRm10LT57U3R5bGV9ICkgeworICAgICAgICAgICAgJGhGbXR7JGlOb30gPSAkb0ZtdDsKKyAgICAgICAgICAgIG15ICRyRm9udCA9ICRwRm10LT57Rm9udH07CisKKyAgICAgICAgICAgICRvRm10LT5zZXRfZm9udCggJHJGb250LT57TmFtZX0gKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfc2l6ZSggJHJGb250LT57SGVpZ2h0fSApOworICAgICAgICAgICAgJG9GbXQtPnNldF9jb2xvciggJHJGb250LT57Q29sb3J9ICk7CisgICAgICAgICAgICAkb0ZtdC0+c2V0X2JvbGQoICRyRm9udC0+e0JvbGR9ICk7CisgICAgICAgICAgICAkb0ZtdC0+c2V0X2l0YWxpYyggJHJGb250LT57SXRhbGljfSApOworICAgICAgICAgICAgJG9GbXQtPnNldF91bmRlcmxpbmUoICRyRm9udC0+e1VuZGVybGluZX0gKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfZm9udF9zdHJpa2VvdXQoICRyRm9udC0+e1N0cmlrZW91dH0gKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfZm9udF9zY3JpcHQoICRyRm9udC0+e1N1cGVyfSApOworCisgICAgICAgICAgICAkb0ZtdC0+c2V0X2hpZGRlbiggJHJGb250LT57SGlkZGVufSApOyAgICAjQWRkCisKKyAgICAgICAgICAgICRvRm10LT5zZXRfbG9ja2VkKCAkcEZtdC0+e0xvY2t9ICk7CisKKyAgICAgICAgICAgICRvRm10LT5zZXRfYWxpZ24oICRhQWxIWyAkcEZtdC0+e0FsaWduSH0gXSApOworICAgICAgICAgICAgJG9GbXQtPnNldF9hbGlnbiggJGFBbFZbICRwRm10LT57QWxpZ25WfSBdICk7CisKKyAgICAgICAgICAgICRvRm10LT5zZXRfcm90YXRpb24oICRwRm10LT57Um90YXRlfSApOworCisgICAgICAgICAgICAkb0ZtdC0+c2V0X251bV9mb3JtYXQoCisgICAgICAgICAgICAgICAgJG9Cb29rLT57Rm10Q2xhc3N9LT5GbXRTdHJpbmdEZWYoICRwRm10LT57Rm10SWR4fSwgJG9Cb29rICkgKTsKKworICAgICAgICAgICAgJG9GbXQtPnNldF90ZXh0X3dyYXAoICRwRm10LT57V3JhcH0gKTsKKworICAgICAgICAgICAgJG9GbXQtPnNldF9wYXR0ZXJuKCAkcEZtdC0+e0ZpbGx9LT5bMF0gKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfZmdfY29sb3IoICRwRm10LT57RmlsbH0tPlsxXSApCisgICAgICAgICAgICAgIGlmICggKCAkcEZtdC0+e0ZpbGx9LT5bMV0gPj0gOCApCisgICAgICAgICAgICAgICAgJiYgKCAkcEZtdC0+e0ZpbGx9LT5bMV0gPD0gNjMgKSApOworICAgICAgICAgICAgJG9GbXQtPnNldF9iZ19jb2xvciggJHBGbXQtPntGaWxsfS0+WzJdICkKKyAgICAgICAgICAgICAgaWYgKCAoICRwRm10LT57RmlsbH0tPlsyXSA+PSA4ICkKKyAgICAgICAgICAgICAgICAmJiAoICRwRm10LT57RmlsbH0tPlsyXSA8PSA2MyApICk7CisKKyAgICAgICAgICAgICRvRm10LT5zZXRfbGVmdCgKKyAgICAgICAgICAgICAgICAoICRwRm10LT57QmRyU3R5bGV9LT5bMF0gPiA3ICkgPyAzIDogJHBGbXQtPntCZHJTdHlsZX0tPlswXSApOworICAgICAgICAgICAgJG9GbXQtPnNldF9yaWdodCgKKyAgICAgICAgICAgICAgICAoICRwRm10LT57QmRyU3R5bGV9LT5bMV0gPiA3ICkgPyAzIDogJHBGbXQtPntCZHJTdHlsZX0tPlsxXSApOworICAgICAgICAgICAgJG9GbXQtPnNldF90b3AoCisgICAgICAgICAgICAgICAgKCAkcEZtdC0+e0JkclN0eWxlfS0+WzJdID4gNyApID8gMyA6ICRwRm10LT57QmRyU3R5bGV9LT5bMl0gKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfYm90dG9tKAorICAgICAgICAgICAgICAgICggJHBGbXQtPntCZHJTdHlsZX0tPlszXSA+IDcgKSA/IDMgOiAkcEZtdC0+e0JkclN0eWxlfS0+WzNdICk7CisKKyAgICAgICAgICAgICRvRm10LT5zZXRfbGVmdF9jb2xvciggJHBGbXQtPntCZHJDb2xvcn0tPlswXSApCisgICAgICAgICAgICAgIGlmICggKCAkcEZtdC0+e0JkckNvbG9yfS0+WzBdID49IDggKQorICAgICAgICAgICAgICAgICYmICggJHBGbXQtPntCZHJDb2xvcn0tPlswXSA8PSA2MyApICk7CisgICAgICAgICAgICAkb0ZtdC0+c2V0X3JpZ2h0X2NvbG9yKCAkcEZtdC0+e0JkckNvbG9yfS0+WzFdICkKKyAgICAgICAgICAgICAgaWYgKCAoICRwRm10LT57QmRyQ29sb3J9LT5bMV0gPj0gOCApCisgICAgICAgICAgICAgICAgJiYgKCAkcEZtdC0+e0JkckNvbG9yfS0+WzFdIDw9IDYzICkgKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfdG9wX2NvbG9yKCAkcEZtdC0+e0JkckNvbG9yfS0+WzJdICkKKyAgICAgICAgICAgICAgaWYgKCAoICRwRm10LT57QmRyQ29sb3J9LT5bMl0gPj0gOCApCisgICAgICAgICAgICAgICAgJiYgKCAkcEZtdC0+e0JkckNvbG9yfS0+WzJdIDw9IDYzICkgKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfYm90dG9tX2NvbG9yKCAkcEZtdC0+e0JkckNvbG9yfS0+WzNdICkKKyAgICAgICAgICAgICAgaWYgKCAoICRwRm10LT57QmRyQ29sb3J9LT5bM10gPj0gOCApCisgICAgICAgICAgICAgICAgJiYgKCAkcEZtdC0+e0JkckNvbG9yfS0+WzNdIDw9IDYzICkgKTsKKyAgICAgICAgfQorICAgICAgICAkaU5vKys7CisgICAgfQorICAgIGZvciAoIG15ICRpU2hlZXQgPSAwIDsgJGlTaGVldCA8ICRvQm9vay0+e1NoZWV0Q291bnR9IDsgJGlTaGVldCsrICkgeworICAgICAgICBteSAkb1drUyA9ICRvQm9vay0+e1dvcmtzaGVldH1bJGlTaGVldF07CisgICAgICAgIG15ICRvV3JTID0gJG9XckV4LT5hZGR3b3Jrc2hlZXQoICRvV2tTLT57TmFtZX0gKTsKKworICAgICAgICAjTGFuZHNjYXBlCisgICAgICAgIGlmICggISRvV2tTLT57TGFuZHNjYXBlfSApIHsgICAgIyBMYW5kc2NhcGUgKDA6SG9yaXpvbnRhbCwgMTpWZXJ0aWNhbCkKKyAgICAgICAgICAgICRvV3JTLT5zZXRfbGFuZHNjYXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkb1dyUy0+c2V0X3BvcnRyYWl0KCk7CisgICAgICAgIH0KKworICAgICAgICAjUHJvdGVjdAorICAgICAgICBpZiAoIGRlZmluZWQgJG9Xa1MtPntQcm90ZWN0fSApCisgICAgICAgIHsgICAgIyBQcm90ZWN0ICgnJzpOb1Bhc3N3b3JkLCBQYXNzd29yZDpQYXNzd29yZCkKKyAgICAgICAgICAgIGlmICggJG9Xa1MtPntQcm90ZWN0fSBuZSAnJyApIHsKKyAgICAgICAgICAgICAgICAkb1dyUy0+cHJvdGVjdCggJG9Xa1MtPntQcm90ZWN0fSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJG9XclMtPnByb3RlY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoICggJG9Xa1MtPntGaXRXaWR0aH0gPT0gMSApIGFuZCAoICRvV2tTLT57Rml0SGVpZ2h0fSA9PSAxICkgKSB7CisKKyAgICAgICAgICAgICMgUGFnZXMgb24gZml0IHdpdGggd2lkdGggYW5kIEhlaWd0CisgICAgICAgICAgICAkb1dyUy0+Zml0X3RvX3BhZ2VzKCAkb1drUy0+e0ZpdFdpZHRofSwgJG9Xa1MtPntGaXRIZWlnaHR9ICk7CisKKyAgICAgICAgICAgICNQcmludCBTY2FsZQorICAgICAgICAgICAgJG9XclMtPnNldF9wcmludF9zY2FsZSggJG9Xa1MtPntTY2FsZX0gKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgI1ByaW50IFNjYWxlCisgICAgICAgICAgICAkb1dyUy0+c2V0X3ByaW50X3NjYWxlKCAkb1drUy0+e1NjYWxlfSApOworCisgICAgICAgICAgICAjIFBhZ2VzIG9uIGZpdCB3aXRoIHdpZHRoIGFuZCBIZWlndAorICAgICAgICAgICAgJG9XclMtPmZpdF90b19wYWdlcyggJG9Xa1MtPntGaXRXaWR0aH0sICRvV2tTLT57Rml0SGVpZ2h0fSApOworICAgICAgICB9CisKKyAgICAgICAgIyBQYXBlciBTaXplCisgICAgICAgICRvV3JTLT5zZXRfcGFwZXIoICRvV2tTLT57UGFwZXJTaXplfSApOworCisgICAgICAgICMgTWFyZ2luCisgICAgICAgICRvV3JTLT5zZXRfbWFyZ2luX2xlZnQoICRvV2tTLT57TGVmdE1hcmdpbn0gKTsKKyAgICAgICAgJG9XclMtPnNldF9tYXJnaW5fcmlnaHQoICRvV2tTLT57UmlnaHRNYXJnaW59ICk7CisgICAgICAgICRvV3JTLT5zZXRfbWFyZ2luX3RvcCggJG9Xa1MtPntUb3BNYXJnaW59ICk7CisgICAgICAgICRvV3JTLT5zZXRfbWFyZ2luX2JvdHRvbSggJG9Xa1MtPntCb3R0b21NYXJnaW59ICk7CisKKyAgICAgICAgIyBIQ2VudGVyCisgICAgICAgICRvV3JTLT5jZW50ZXJfaG9yaXpvbnRhbGx5KCkgaWYgKCAkb1drUy0+e0hDZW50ZXJ9ICk7CisKKyAgICAgICAgIyBWQ2VudGVyCisgICAgICAgICRvV3JTLT5jZW50ZXJfdmVydGljYWxseSgpIGlmICggJG9Xa1MtPntWQ2VudGVyfSApOworCisgICAgICAgICMgSGVhZGVyLCBGb290ZXIKKyAgICAgICAgJG9XclMtPnNldF9oZWFkZXIoICRvV2tTLT57SGVhZGVyfSwgJG9Xa1MtPntIZWFkZXJNYXJnaW59ICk7CisgICAgICAgICRvV3JTLT5zZXRfZm9vdGVyKCAkb1drUy0+e0Zvb3Rlcn0sICRvV2tTLT57Rm9vdGVyTWFyZ2lufSApOworCisgICAgICAgICMgUHJpbnQgQXJlYQorICAgICAgICBpZiAoIHJlZiggJG9Cb29rLT57UHJpbnRBcmVhfVskaVNoZWV0XSApIGVxICdBUlJBWScgKSB7CisgICAgICAgICAgICBteSAkcmFQOworICAgICAgICAgICAgZm9yICRyYVAgKCBAeyAkb0Jvb2stPntQcmludEFyZWF9WyRpU2hlZXRdIH0gKSB7CisgICAgICAgICAgICAgICAgJG9XclMtPnByaW50X2FyZWEoQCRyYVApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBQcmludCBUaXRsZQorICAgICAgICBteSAkcmFXOworICAgICAgICBmb3JlYWNoICRyYVcgKCBAeyAkb0Jvb2stPntQcmludFRpdGxlfVskaVNoZWV0XS0+e1Jvd30gfSApIHsKKyAgICAgICAgICAgICRvV3JTLT5yZXBlYXRfcm93cyhAJHJhVyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yZWFjaCAkcmFXICggQHsgJG9Cb29rLT57UHJpbnRUaXRsZX1bJGlTaGVldF0tPntDb2x1bW59IH0gKSB7CisgICAgICAgICAgICAkb1dyUy0+cmVwZWF0X2NvbHVtbnMoQCRyYVcpOworICAgICAgICB9CisKKyAgICAgICAgIyBQcmludCBHcmlkbGluZXMKKyAgICAgICAgaWYgKCAkb1drUy0+e1ByaW50R3JpZH0gPT0gMSApIHsKKyAgICAgICAgICAgICRvV3JTLT5oaWRlX2dyaWRsaW5lcygwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRvV3JTLT5oaWRlX2dyaWRsaW5lcygxKTsKKyAgICAgICAgfQorCisgICAgICAgICMgUHJpbnQgSGVhZGluZ3MKKyAgICAgICAgaWYgKCAkb1drUy0+e1ByaW50SGVhZGVyc30gKSB7CisgICAgICAgICAgICAkb1dyUy0+cHJpbnRfcm93X2NvbF9oZWFkZXJzKCk7CisgICAgICAgIH0KKworICAgICAgICAjIEhvcml6b250YWwgUGFnZSBCcmVha3MKKyAgICAgICAgJG9XclMtPnNldF9oX3BhZ2VicmVha3MoIEB7ICRvV2tTLT57SFBhZ2VCcmVha30gfSApOworCisgICAgICAgICMgVmVyaXRpY2FsIFBhZ2UgQnJlYWtzCisgICAgICAgICRvV3JTLT5zZXRfdl9wYWdlYnJlYWtzKCBAeyAkb1drUy0+e1ZQYWdlQnJlYWt9IH0gKTsKKworCisKKyMgICAgICAgIFBhZ2VTdGFydCAgICA9PiAkb1drUy0+e1BhZ2VTdGFydH0sICAgICAgICAgICAgIyBQYWdlIG51bWJlciBmb3Igc3RhcnQKKyMgICAgICAgIFVzZVBhZ2UgICAgICA9PiAkb1drUy0+e1VzZVBhZ2V9LCAgICAgICAgICAgICAgIyBVc2Ugb3duIHN0YXJ0IHBhZ2UgbnVtYmVyCisjICAgICAgICBOb0NvbG9yICAgICAgPT4gJG9Xa1MtPntOb0NvbG9yfSwgICAgICAgICAgICAgICAjIFByaW50IGluIGJsY2FrLXdoaXRlCisjICAgICAgICBEcmFmdCAgICAgICAgPT4gJG9Xa1MtPntEcmFmdH0sICAgICAgICAgICAgICAgICAjIFByaW50IGluIGRyYWZ0IG1vZGUKKyMgICAgICAgIE5vdGVzICAgICAgICA9PiAkb1drUy0+e05vdGVzfSwgICAgICAgICAgICAgICAgICMgUHJpbnQgbm90ZXMKKyMgICAgICAgIExlZnRUb1JpZ2h0ICA9PiAkb1drUy0+e0xlZnRUb1JpZ2h0fSwgICAgICAgICAgICMgTGVmdCB0byBSaWdodAorCisKKyAgICAgICAgZm9yICgKKyAgICAgICAgICAgIG15ICRpQyA9ICRvV2tTLT57TWluQ29sfSA7CisgICAgICAgICAgICBkZWZpbmVkICRvV2tTLT57TWF4Q29sfSAmJiAkaUMgPD0gJG9Xa1MtPntNYXhDb2x9IDsKKyAgICAgICAgICAgICRpQysrCisgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGRlZmluZWQgJG9Xa1MtPntDb2xXaWR0aH1bJGlDXSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICRvV2tTLT57Q29sV2lkdGh9WyRpQ10gPiAwICkgeworICAgICAgICAgICAgICAgICAgICAkb1dyUy0+c2V0X2NvbHVtbiggJGlDLCAkaUMsICRvV2tTLT57Q29sV2lkdGh9WyRpQ10gKQorICAgICAgICAgICAgICAgICAgICAgIDsgICAgIywgdW5kZWYsIDEpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRvV3JTLT5zZXRfY29sdW1uKCAkaUMsICRpQywgMCwgdW5kZWYsIDEgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yICgKKyAgICAgICAgICAgIG15ICRpUiA9ICRvV2tTLT57TWluUm93fSA7CisgICAgICAgICAgICBkZWZpbmVkICRvV2tTLT57TWF4Um93fSAmJiAkaVIgPD0gJG9Xa1MtPntNYXhSb3d9IDsKKyAgICAgICAgICAgICRpUisrCisgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICAkb1dyUy0+c2V0X3JvdyggJGlSLCAkb1drUy0+e1Jvd0hlaWdodH1bJGlSXSApOworICAgICAgICAgICAgZm9yICgKKyAgICAgICAgICAgICAgICBteSAkaUMgPSAkb1drUy0+e01pbkNvbH0gOworICAgICAgICAgICAgICAgIGRlZmluZWQgJG9Xa1MtPntNYXhDb2x9ICYmICRpQyA8PSAkb1drUy0+e01heENvbH0gOworICAgICAgICAgICAgICAgICRpQysrCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIG15ICRvV2tDID0gJG9Xa1MtPntDZWxsc31bJGlSXVskaUNdOworICAgICAgICAgICAgICAgIGlmICgkb1drQykgeworICAgICAgICAgICAgICAgICAgICBpZiAoICRvV2tDLT57TWVyZ2VkfSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICRvRm10TiA9ICRvV3JFeC0+YWRkZm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkb0ZtdE4tPmNvcHkoICRoRm10eyAkb1drQy0+e0Zvcm1hdE5vfSB9ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAkb0ZtdE4tPnNldF9tZXJnZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRvV3JTLT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvQm9vay0+e0ZtdENsYXNzfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5UZXh0Rm10KCAkb1drQy0+e1ZhbH0sICRvV2tDLT57Q29kZX0gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb0ZtdE4KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkb1dyUy0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb0Jvb2stPntGbXRDbGFzc30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VGV4dEZtdCggJG9Xa0MtPntWYWx9LCAkb1drQy0+e0NvZGV9ICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhGbXR7ICRvV2tDLT57Rm9ybWF0Tm99IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICRvV3JFeDsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGRXb3Jrc2hlZXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2spCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgQWRkV29ya3NoZWV0IHsKKyAgICBteSAoICRvQm9vaywgJHNOYW1lLCAlaEF0dHIgKSA9IEBfOworICAgICRvQm9vay0+QWRkRm9ybWF0IGlmICggJCN7ICRvQm9vay0+e0Zvcm1hdH0gfSA8IDAgKTsKKyAgICAkaEF0dHJ7TmFtZX0gICAgICAgICB8fD0gJHNOYW1lOworICAgICRoQXR0cntMZWZ0TWFyZ2lufSAgIHx8PSAwOworICAgICRoQXR0cntSaWdodE1hcmdpbn0gIHx8PSAwOworICAgICRoQXR0cntUb3BNYXJnaW59ICAgIHx8PSAwOworICAgICRoQXR0cntCb3R0b21NYXJnaW59IHx8PSAwOworICAgICRoQXR0cntIZWFkZXJNYXJnaW59IHx8PSAwOworICAgICRoQXR0cntGb290ZXJNYXJnaW59IHx8PSAwOworICAgICRoQXR0cntGaXRXaWR0aH0gICAgIHx8PSAwOworICAgICRoQXR0cntGaXRIZWlnaHR9ICAgIHx8PSAwOworICAgICRoQXR0cntQcmludEdyaWR9ICAgIHx8PSAwOworICAgIG15ICRvV2tTID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6OldvcmtzaGVldC0+bmV3KCVoQXR0cik7CisgICAgJG9Xa1MtPntfQm9va30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRvQm9vazsKKyAgICAkb1drUy0+e19TaGVldE5vfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJG9Cb29rLT57U2hlZXRDb3VudH07CisgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57U2hlZXRDb3VudH0gXSA9ICRvV2tTOworICAgICRvQm9vay0+e1NoZWV0Q291bnR9Kys7CisgICAgcmV0dXJuICRvV2tTOyAgICAjJG9Cb29rLT57U2hlZXRDb3VudH0gLSAxOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZEZvbnQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2spCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgQWRkRm9udCB7CisgICAgbXkgKCAkb0Jvb2ssICVoQXR0ciApID0gQF87CisgICAgJGhBdHRye05hbWV9ICAgICAgfHw9ICdBcmlhbCc7CisgICAgJGhBdHRye0hlaWdodH0gICAgfHw9IDEwOworICAgICRoQXR0cntCb2xkfSAgICAgIHx8PSAwOworICAgICRoQXR0cntJdGFsaWN9ICAgIHx8PSAwOworICAgICRoQXR0cntVbmRlcmxpbmV9IHx8PSAwOworICAgICRoQXR0cntTdHJpa2VvdXR9IHx8PSAwOworICAgICRoQXR0cntTdXBlcn0gICAgIHx8PSAwOworICAgIHB1c2ggQHsgJG9Cb29rLT57Rm9udH0gfSwgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZvbnQtPm5ldyglaEF0dHIpOworICAgIHJldHVybiAkI3sgJG9Cb29rLT57Rm9udH0gfTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGRGb3JtYXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2spCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgQWRkRm9ybWF0IHsKKyAgICBteSAoICRvQm9vaywgJWhBdHRyICkgPSBAXzsKKyAgICAkaEF0dHJ7RmlsbH0gICAgIHx8PSBbIDAsIDAsIDAgXTsKKyAgICAkaEF0dHJ7QmRyU3R5bGV9IHx8PSBbIDAsIDAsIDAsIDAgXTsKKyAgICAkaEF0dHJ7QmRyQ29sb3J9IHx8PSBbIDAsIDAsIDAsIDAgXTsKKyAgICAkaEF0dHJ7QWxpZ25IfSAgICB8fD0gMDsKKyAgICAkaEF0dHJ7QWxpZ25WfSAgICB8fD0gMDsKKyAgICAkaEF0dHJ7Um90YXRlfSAgICB8fD0gMDsKKyAgICAkaEF0dHJ7TGFuZHNjYXBlfSB8fD0gMDsKKyAgICAkaEF0dHJ7Rm10SWR4fSAgICB8fD0gMDsKKworICAgIGlmICggIWRlZmluZWQoICRoQXR0cntGb250fSApICkgeworICAgICAgICBteSAkb0ZvbnQ7CisgICAgICAgIGlmICggZGVmaW5lZCAkaEF0dHJ7Rm9udE5vfSApIHsKKyAgICAgICAgICAgICRvRm9udCA9ICRvQm9vay0+e0ZvbnR9WyAkaEF0dHJ7Rm9udE5vfSBdOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggIWRlZmluZWQgJG9Gb250ICkgeworICAgICAgICAgICAgaWYgKCAkI3sgJG9Cb29rLT57Rm9udH0gfSA+PSAwICkgeworICAgICAgICAgICAgICAgICRvRm9udCA9ICRvQm9vay0+e0ZvbnR9WzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbXkgJGlObyA9ICRvQm9vay0+QWRkRm9udDsKKyAgICAgICAgICAgICAgICAkb0ZvbnQgPSAkb0Jvb2stPntGb250fVskaU5vXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkaEF0dHJ7Rm9udH0gPSAkb0ZvbnQ7CisgICAgfQorICAgIHB1c2ggQHsgJG9Cb29rLT57Rm9ybWF0fSB9LCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9ybWF0LT5uZXcoJWhBdHRyKTsKKyAgICByZXR1cm4gJCN7ICRvQm9vay0+e0Zvcm1hdH0gfTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGRDZWxsIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIEFkZENlbGwgeworICAgIG15ICggJG9Cb29rLCAkaVNoZWV0LCAkaVIsICRpQywgJHNWYWwsICRvQ2VsbCwgJHNDb2RlICkgPSBAXzsKKyAgICBteSAlcmhLZXk7CisgICAgJG9DZWxsIHx8PSAwOworICAgIG15ICRpRm10ID0KKyAgICAgICggVU5JVkVSU0FMOjppc2EoICRvQ2VsbCwgJ1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpDZWxsJyApICkKKyAgICAgID8gJG9DZWxsLT57Rm9ybWF0Tm99CisgICAgICA6ICggcmVmKCRvQ2VsbCkgKSA/IDAKKyAgICAgIDogICAgICAgICAgICAgICAgICAgJG9DZWxsICsgMDsKKyAgICAkcmhLZXl7Rm9ybWF0Tm99ICAgID0gJGlGbXQ7CisgICAgJHJoS2V5e0Zvcm1hdH0gICAgICA9ICRvQm9vay0+e0Zvcm1hdH1bJGlGbXRdOworICAgICRyaEtleXtWYWx9ICAgICAgICAgPSAkc1ZhbDsKKyAgICAkcmhLZXl7Q29kZX0gICAgICAgID0gJHNDb2RlIHx8ICdfbmF0aXZlXyc7CisgICAgJG9Cb29rLT57X0N1clNoZWV0fSA9ICRpU2hlZXQ7CisgICAgbXkgJG9OZXdDZWxsID0KKyAgICAgIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpfTmV3Q2VsbCggJG9Cb29rLCAkaVIsICRpQywgJXJoS2V5ICk7CisgICAgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Ol9TZXREaW1lbnNpb24oICRvQm9vaywgJGlSLCAkaUMsICRpQyApOworICAgIHJldHVybiAkb05ld0NlbGw7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2sgLSBBIGNsYXNzIGZvciBTYXZlUGFyc2VyIFdvcmtib29rcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworTWFpbnRhaW5lciAwLjQwKzogSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworTWFpbnRhaW5lciAwLjI3LTAuMzM6IEdhYm9yIFN6YWJvIHN6YWJnYWJAY3Bhbi5vcmcKKworT3JpZ2luYWwgYXV0aG9yOiBLYXdhaSBUYWthbm9yaSBrd2l0a25yQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSm9obiBNY05hbWFyYQorCitDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9TYXZlUGFyc2VyL1dvcmtzaGVldC5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvU2F2ZVBhcnNlci9Xb3Jrc2hlZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlOGZhNAotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvU2F2ZVBhcnNlci9Xb3Jrc2hlZXQucG0KQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya3NoZWV0OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOjpXb3Jrc2hlZXQgLSBBIGNsYXNzIGZvciBTYXZlUGFyc2VyIFdvcmtzaGVldHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya3NoZWV0CisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3VzZSBiYXNlICdTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6V29ya3NoZWV0JzsKK291ciAkVkVSU0lPTiA9ICcwLjU5JzsKKworc3ViIG5ldyB7CisgICAgbXkgKCAkc0NsYXNzLCAlcmhJbmkgKSA9IEBfOworICAgICRzQ2xhc3MtPlNVUEVSOjpuZXcoJXJoSW5pKTsgICAgIyByZXR1cm5zIG9iamVjdAorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZENlbGwgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya3NoZWV0KQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIEFkZENlbGwgeworICAgIG15ICggJG9TZWxmLCAkaVIsICRpQywgJHNWYWwsICRvQ2VsbCwgJHNDb2RlICkgPSBAXzsKKyAgICAkb1NlbGYtPntfQm9va30KKyAgICAgIC0+QWRkQ2VsbCggJG9TZWxmLT57X1NoZWV0Tm99LCAkaVIsICRpQywgJHNWYWwsICRvQ2VsbCwgJHNDb2RlICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvdGVjdCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOjpXb3Jrc2hlZXQpCisjICAtIFBhc3N3b3JkID0gdW5kZWYgICAtPiAgTm8gcHJvdGVjdAorIyAgLSBQYXNzd29yZCA9ICcnICAgICAgLT4gIFByb3RlY3RlZC4gTm8gcGFzc3dvcmQKKyMgIC0gUGFzc3dvcmQgPSAkcHdkICAgIC0+ICBQcm90ZWN0ZWQuIFBhc3N3b3JkID0gJHB3ZAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIFByb3RlY3QgeworICAgIG15ICggJG9TZWxmLCAkc1Bhc3N3b3JkICkgPSBAXzsKKyAgICAkb1NlbGYtPntQcm90ZWN0fSA9ICRzUGFzc3dvcmQ7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya3NoZWV0IC0gQSBjbGFzcyBmb3IgU2F2ZVBhcnNlciBXb3Jrc2hlZXRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIEFVVEhPUgorCitNYWludGFpbmVyIDAuNDArOiBKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCitNYWludGFpbmVyIDAuMjctMC4zMzogR2Fib3IgU3phYm8gc3phYmdhYkBjcGFuLm9yZworCitPcmlnaW5hbCBhdXRob3I6IEthd2FpIFRha2Fub3JpIGt3aXRrbnJAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBKb2huIE1jTmFtYXJhCisKK0NvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisKK0NvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1lvdSBtYXkgZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgQXJ0aXN0aWMgTGljZW5zZSwgYXMgc3BlY2lmaWVkIGluIHRoZSBQZXJsIFJFQURNRSBmaWxlLgorCis9Y3V0CmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1V0aWxpdHkucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1V0aWxpdHkucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViMDllNwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvVXRpbGl0eS5wbQpAQCAtMCwwICsxLDE2MTUgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHk7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkgLSBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgUGFyc2VFeGNlbC4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKb2huIE1jTmFtYXJhCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisjIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCityZXF1aXJlIEV4cG9ydGVyOwordXNlIHZhcnMgcXcoQElTQSBARVhQT1JUX09LKTsKK0BJU0EgICAgICAgPSBxdyhFeHBvcnRlcik7CitARVhQT1JUX09LID0gcXcoRXhjZWxGbXQgTG9jYWx0aW1lRXhjZWwgRXhjZWxMb2NhbHRpbWUKKyAgY29sMmludCBpbnQyY29sIHNoZWV0UmVmIHhsczJjc3YpOworCitvdXIgJFZFUlNJT04gPSAnMC41OSc7CisKK215ICRxck5VTUJFUiA9IHFyLyheWystXT9cZCsoXC5cZCspPyQpfCheWystXT9cZCtcLj8oXGQqKVtlRV1bKy1dKFxkKykpJC87CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRXhjZWxGbXQoKQorIworIyBUaGlzIGZ1bmN0aW9uIHRha2VzIGFuIEV4Y2VsIHN0eWxlIG51bWJlciBmb3JtYXQgYW5kIGNvbnZlcnRzIGEgbnVtYmVyIGludG8KKyMgdGhhdCBmb3JtYXQuIGZvciBleGFtcGxlOiAnaGg6bW06c3MgQU0vUE0nICsgMC4wMTAyMzE0OCA9ICcxMjoxNDo0NCBBTScuCisjCisjIEl0IGRvZXMgdGhpcyB3aXRoIGEgdHlwZSBvZiB0ZW1wbGF0aW5nIG1lY2hhbmlzbS4gVGhlIGZvcm1hdCBzdHJpbmcgaXMgcGFyc2VkCisjIHRvIGlkZW50aWZ5IHRva2VucyB0aGF0IG5lZWQgdG8gYmUgcmVwbGFjZWQgYW5kIHRoZWlyIHBvc2l0aW9uIHdpdGhpbiB0aGUKKyMgc3RyaW5nIGlzIHJlY29yZGVkLiBUaGVzZSBjYW4gYmUgdGhvdWdodCBvZiBhcyBwbGFjZWhvbGRlcnMuIFRoZSBudW1iZXIgaXMKKyMgdGhlbiBjb252ZXJ0ZWQgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdHMgYW5kIHN1YnN0aXR1dGVkIGludG8gdGhlIHBsYWNlaG9sZGVycy4KKyMKKyMgSW50ZXJlc3RlZCBwYXJ0aWVzIHNob3VsZCByZWZlciB0byB0aGUgRXhjZWwgZG9jdW1lbnRhdGlvbiBvbiBjZWxsIGZvcm1hdHMgZm9yCisjIG1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9vZmZpY2UubWljcm9zb2Z0LmNvbS9lbi11cy9leGNlbC9IUDA1MTk5NTAwMTAzMy5hc3B4CisjIFRoZSBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEV4Y2VsIEJpbmFyeSBGaWxlIEZvcm1hdCwgW01TLVhMU10ucGRmLAorIyBhbHNvIGNvbnRhaW5zIGEgQUJORiBncmFtbWFyIGZvciBudW1iZXIgZm9ybWF0IHN0cmluZ3MuCisjCisjIE1haW50YWluZXJzIG5vdGVzOgorIyA9PT09PT09PT09PT09PT09PT0KKyMKKyMgTm90ZSBvbiBmb3JtYXQgc3Vic2VjdGlvbnM6CisjIEEgZm9ybWF0IHN0cmluZyBjYW4gY29udGFpbiA0IHBvc3NpYmxlIHN1Yi1zZWN0aW9ucyBzZXBhcmF0ZWQgYnkgc2VtaS1jb2xvbnM6CisjIFBvc2l0aXZlIG51bWJlcnMsIG5lZ2F0aXZlIG51bWJlcnMsIHplcm8gdmFsdWVzLCBhbmQgdGV4dC4KKyMgRm9yIGV4YW1wbGU6IF8oKiAjLCMjMF8pO18oKiAoIywjIzApO18oKiAiLSJfKTtfKEBfKQorIworIyBOb3RlIG9uIGNvbmRpdGlvbmFsIGZvcm1hdHMuCisjIEEgbnVtYmVyIGZvcm1hdCBpbiBFeGNlbCBjYW4gaGF2ZSBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gc3VjaCBhczoKKyMgICAgIFs+OTk5OTk5OV0oMDAwKTAwMC0wMDAwOzAwMC0wMDAwCisjIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIGluIFBlcmw6CisjICAgICAkZm9ybWF0ID0gJG51bWJlciA+IDk5OTk5OTkgPyAnKDAwMCkwMDAtMDAwMCcgOiAnMDAwLTAwMDAnOworIyBOZXN0ZWQgY29uZGl0aW9uYWxzIGFyZSBhbHNvIHBvc3NpYmxlIGJ1dCB3ZSBkb24ndCBzdXBwb3J0IHRoZW0uCisjCisjIEVmZmljaWVuY3k6IFRoZSBleGNlc3NpdmUgdXNlIG9mIHN1YnN0cigpIGlzbid0IHZlcnkgZWZmaWNpZW50LiBIb3dldmVyLAorIyBpdCBwcm9iYWJseSBkb2Vzbid0IG1lcml0IHJld3JpdGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggYSBwYXJzZXIgb3IgcmVndWxhcgorIyBleHByZXNzaW9ucyBhbmQgXEcuCisjCisjIFRPRE86IEkgdGhpbmsgdGhlIHNpbmdsZSBxdW90ZSBoYW5kbGluZyBtYXkgbm90IGJlIHJlcXVpcmVkLiBDaGVjay4KKyMKK3N1YiBFeGNlbEZtdCB7CisKKyAgICBteSAoICRmb3JtYXRfc3RyLCAkbnVtYmVyLCAkaXNfMTkwNCwgJG51bWJlcl90eXBlLCAkd2FudF9zdWJmb3JtYXRzICkgPSBAXzsKKworICAgICMgUmV0dXJuIHRleHQgc3RyaW5ncyB3aXRob3V0IGZ1cnRoZXIgZm9ybWF0dGluZy4KKyAgICByZXR1cm4gJG51bWJlciB1bmxlc3MgJG51bWJlciA9fiAkcXJOVU1CRVI7CisKKyAgICAjIEhhbmRsZSBPcGVuT2ZmaWNlLm9yZyBHRU5FUkFMIGZvcm1hdC4KKyAgICAkZm9ybWF0X3N0ciA9ICdAJyBpZiB1YygkZm9ybWF0X3N0cikgZXEgIkdFTkVSQUwiOworCisgICAgIyBDaGVjayBmb3IgYSBjb25kaXRpb25hbCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZvcm1hdC4gU2VlIG5vdGVzIGFib3ZlLgorICAgIG15ICRjb25kaXRpb25hbDsKKyAgICBpZiAoICRmb3JtYXRfc3RyID1+IC9eXFsoWzw+PV1bXlxdXSspXF0oLiopJC8gKSB7CisgICAgICAgICRjb25kaXRpb25hbCA9ICQxOworICAgICAgICAkZm9ybWF0X3N0ciAgPSAkMjsKKyAgICB9CisKKyAgICAjIElnbm9yZSB0aGUgdW5kZXJzY29yZSB0b2tlbiB3aGljaCBpcyB1c2VkIHRvIGluZGljYXRlIGEgcGFkZGluZyBzcGFjZS4KKyAgICAkZm9ybWF0X3N0ciA9fiBzL18vIC9nOworCisgICAgIyBTcGxpdCB0aGUgZm9ybWF0IHN0cmluZyBpbnRvIDQgcG9zc2libGUgc3ViLXNlY3Rpb25zOiBwb3NpdGl2ZSBudW1iZXJzLAorICAgICMgbmVnYXRpdmUgbnVtYmVycywgemVybyB2YWx1ZXMsIGFuZCB0ZXh0LiBTZWUgbm90ZXMgYWJvdmUuCisgICAgbXkgQGZvcm1hdHM7CisgICAgbXkgJHNlY3Rpb24gICAgICA9IDA7CisgICAgbXkgJGRvdWJsZV9xdW90ZSA9IDA7CisgICAgbXkgJHNpbmdsZV9xdW90ZSA9IDA7CisKKyAgICAjIEluaXRpYWwgcGFyc2luZyBvZiB0aGUgZm9ybWF0IHN0cmluZyB0byByZW1vdmUgZXNjYXBlIGNoYXJhY3RlcnMuIFRoaXMKKyAgICAjIGFsc28gaGFuZGxlcyBxdW90ZWQgc3RyaW5ncy4gU2VlIG5vdGUgYWJvdXQgc2luZ2xlIHF1b3RlcyBhYm92ZS4KKyAgQ0hBUkFDVEVSOgorICAgIGZvciBteSAkY2hhciAoIHNwbGl0IC8vLCAkZm9ybWF0X3N0ciApIHsKKworICAgICAgICBpZiAoICRkb3VibGVfcXVvdGUgb3IgJHNpbmdsZV9xdW90ZSApIHsKKyAgICAgICAgICAgICRmb3JtYXRzWyRzZWN0aW9uXSAuPSAkY2hhcjsKKyAgICAgICAgICAgICRkb3VibGVfcXVvdGUgPSAwIGlmICRjaGFyIGVxICciJzsKKyAgICAgICAgICAgICRzaW5nbGVfcXVvdGUgPSAwOworICAgICAgICAgICAgbmV4dCBDSEFSQUNURVI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICRjaGFyIGVxICc7JyApIHsKKyAgICAgICAgICAgICRzZWN0aW9uKys7CisgICAgICAgICAgICBuZXh0IENIQVJBQ1RFUjsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRjaGFyIGVxICciJyApIHsKKyAgICAgICAgICAgICRkb3VibGVfcXVvdGUgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggJGNoYXIgZXEgJyEnICkgeworICAgICAgICAgICAgJHNpbmdsZV9xdW90ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkY2hhciBlcSAnXFwnICkgeworICAgICAgICAgICAgJHNpbmdsZV9xdW90ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkY2hhciBlcSAnKCcgKSB7CisgICAgICAgICAgICBuZXh0IENIQVJBQ1RFUjsgICAgIyBJZ25vcmUuCisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkY2hhciBlcSAnKScgKSB7CisgICAgICAgICAgICBuZXh0IENIQVJBQ1RFUjsgICAgIyBJZ25vcmUuCisgICAgICAgIH0KKworICAgICAgICAjIENvbnZlcnQgdXBwZXIgY2FzZSBPcGVuT2ZmaWNlLm9yZyBkYXRlL3RpbWUgZm9ybWF0cyB0byBsb3dlcmNhc2UuLgorICAgICAgICAkY2hhciA9IGxjKCRjaGFyKSBpZiAkY2hhciA9fiAvW0RNWUhTXS87CisKKyAgICAgICAgJGZvcm1hdHNbJHNlY3Rpb25dIC49ICRjaGFyOworICAgIH0KKworICAgICMgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgZnJvbSB0aGUgNCBwb3NzaWJsZSBzdWItc2VjdGlvbnM6CisgICAgIyBwb3NpdGl2ZSBudW1iZXJzLCBuZWdhdGl2ZSBudW1iZXJzLCB6ZXJvIHZhbHVlcywgYW5kIHRleHQuCisgICAgIyBXZSBpZ25vcmUgdGhlIFRleHQgc2VjdGlvbiBzaW5jZSBub24tbnVtZXJpYyB2YWx1ZXMgYXJlIHJldHVybmVkCisgICAgIyB1bmZvcm1hdHRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLgorICAgIG15ICRmb3JtYXQ7CisgICAgJHNlY3Rpb24gPSAwOworCisgICAgaWYgKCBAZm9ybWF0cyA9PSAxICkgeworICAgICAgICAkc2VjdGlvbiA9IDA7CisgICAgfQorICAgIGVsc2lmICggQGZvcm1hdHMgPT0gMiApIHsKKyAgICAgICAgaWYgKCAkbnVtYmVyIDwgMCApIHsKKyAgICAgICAgICAgICRzZWN0aW9uID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRzZWN0aW9uID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNpZiAoIEBmb3JtYXRzID09IDMgKSB7CisgICAgICAgIGlmICggJG51bWJlciA9PSAwICkgeworICAgICAgICAgICAgJHNlY3Rpb24gPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggJG51bWJlciA8IDAgKSB7CisgICAgICAgICAgICAkc2VjdGlvbiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkc2VjdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWN0aW9uID0gMDsKKyAgICB9CisKKyAgICAjIE92ZXJyaWRlIHRoZSBwcmV2aW91cyBjaG9pY2UgaWYgdGhlIGZvcm1hdCBpcyBjb25kaXRpb25hbC4KKyAgICBpZiAoJGNvbmRpdGlvbmFsKSB7CisKKyAgICAgICAgIyBUT0RPLiBSZXBsYWNlIHN0cmluZyBldmFsIHdpdGggYSBmdW5jdGlvbi4KKyAgICAgICAgJHNlY3Rpb24gPSBldmFsICIkbnVtYmVyICRjb25kaXRpb25hbCIgPyAwIDogMTsKKyAgICB9CisKKyAgICAjIFdlIG5vdyBoYXZlIHRoZSByZXF1aXJlZCBmb3JtYXQuCisgICAgJGZvcm1hdCA9ICRmb3JtYXRzWyRzZWN0aW9uXTsKKworICAgICMgVGhlIGZvcm1hdCBzdHJpbmcgY2FuIGNvbnRhaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY29sb3VyczoKKyAgICAjIFtCbGFja10gW0JsdWVdIFtDeWFuXSBbR3JlZW5dIFtNYWdlbnRhXSBbUmVkXSBbV2hpdGVdIFtZZWxsb3ddCisgICAgIyBvciB0aGUgc3RyaW5nIFtDb2xvclhdIHdoZXJlIHggaXMgYSBjb2xvdXIgaW5kZXggZnJvbSAxIHRvIDU2LgorICAgICMgV2UgZG9uJ3QgdXNlIHRoZSBjb2xvdXIgYnV0IHdlIHJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorICAgICMKKyAgICBteSAkY29sb3IgPSAnJzsKKyAgICBpZiAoICRmb3JtYXQgPX4gcy9eKFxbW0EtWl1bYS16XXsyLH0oXGR7MSwyfSk/XF0pLy8gKSB7CisgICAgICAgICRjb2xvciA9ICQxOworICAgIH0KKworICAgICMgUmVtb3ZlIHRoZSBsb2NhbGUsIHN1Y2ggYXMgWyQtNDA5XSwgZnJvbSB0aGUgZm9ybWF0IHN0cmluZy4KKyAgICBteSAkbG9jYWxlID0gJyc7CisgICAgaWYgKCAkZm9ybWF0ID1+IHMvXihcW1wkPy1cZCtcXSkvLyApIHsKKyAgICAgICAgJGxvY2FsZSA9ICQxOworICAgIH0KKworICAgICMgUmVwbGFjZSBjdXJyZW5jeSBsb2NhbGUsIHN1Y2ggYXMgWyQkLTQwOV0sIHdpdGggJCBpbiB0aGUgZm9ybWF0IHN0cmluZy4KKyAgICAjIFNlZSB0aGUgUlQjNjA1NDcgdGVzdCBjYXNlcyBpbiAyMV9udW1iZXJfZm9ybWF0X3VzZXIudC4KKyAgICBpZiAoICRmb3JtYXQgPX4gcy8oXFtcJChbXi1dKykoLVxkKyk/XF0pLyQyL3MgKSB7CisgICAgICAgICRsb2NhbGUgPSAkMTsKKyAgICB9CisKKworICAgICMgUmVtb3ZlIGxlYWRpbmcgIyBmcm9tICcjID8vPycsICcjID8/Lz8/JyBmcmFjdGlvbiBmb3JtYXRzLgorICAgICRmb3JtYXQgPX4gc3sjIFw/fXs/fWc7CisKKyAgICAjIFBhcnNlIHRoZSBmb3JtYXQgc3RyaW5nIGFuZCBjcmVhdGUgYW4gQW9BIG9mIHBsYWNlaG9sZGVycyB0aGF0IGNvbnRhaW4KKyAgICAjIHRoZSBwYXJ0cyBvZiB0aGUgc3RyaW5nIHRvIGJlIHJlcGxhY2VkLiBUaGUgZm9ybWF0IG9mIHRoZSBpbmZvcm1hdGlvbgorICAgICMgc3RvcmVkIGlzOiBbICR0b2tlbiwgJHN0YXJ0X3BvcywgJGVuZF9wb3MsICRvcHRpb25faW5mbyBdLgorICAgICMKKyAgICBteSAkZm9ybWF0X21vZGUgID0gJyc7ICAgICMgRWl0aGVyOiAnJywgJ251bWJlcicsICdkYXRlJworICAgIG15ICRwb3MgICAgICAgICAgPSAwOyAgICAgIyBDaGFyYWN0ZXIgcG9zaXRpb24gd2l0aGluIGZvcm1hdCBzdHJpbmcuCisgICAgbXkgQHBsYWNlaG9sZGVycyA9ICgpOyAgICAjIEFyZWZzIHdpdGggcGFydHMgb2YgdGhlIGZvcm1hdCB0byBiZSByZXBsYWNlZC4KKyAgICBteSAkdG9rZW4gICAgICAgID0gJyc7ICAgICMgVGhlIGFjdHVhbCBmb3JtYXQgZXh0cmFjdGVkIGZyb20gdGhlIHRvdGFsIHN0ci4KKyAgICBteSAkc3RhcnRfcG9zOyAgICAgICAgICAgICMgQSBwb3NpdGlvbiB2YXJpYWJsZS4gSW5pdGlhbCBwYXJzZXIgcG9zaXRpb24uCisgICAgbXkgJHRva2VuX3N0YXJ0ID0gLTE7ICAgICAjIEEgcG9zaXRpb24gdmFyaWFibGUuCisgICAgbXkgJGRlY2ltYWxfcG9zID0gLTE7ICAgICAjIFBvc2l0aW9uIG9mIHRoZSBwdW5jdHVhdGlvbiBjaGFyICIuIiBvciAiLCIuCisgICAgbXkgJGNvbW1hX2NvdW50ID0gMDsgICAgICAjIENvdW50IG9mIHRoZSBjb21tYXMgaW4gdGhlIGZvcm1hdC4KKyAgICBteSAkaXNfZnJhY3Rpb24gPSAwOyAgICAgICMgTnVtYmVyIGZvcm1hdCBpcyBhIGZyYWN0aW9uLgorICAgIG15ICRpc19jdXJyZW5jeSA9IDA7ICAgICAgIyBOdW1iZXIgZm9ybWF0IGlzIGEgY3VycmVuY3kuCisgICAgbXkgJGlzX3BlcmNlbnQgID0gMDsgICAgICAjIE51bWJlciBmb3JtYXQgaXMgYSBwZXJjZW50YWdlLgorICAgIG15ICRpc18xMl9ob3VyICA9IDA7ICAgICAgIyBUaW1lIGZvcm1hdCBpcyB1c2luZyAxMiBob3VyIGNsb2NrLgorICAgIG15ICRzZWVuX2RvdCAgICA9IDA7ICAgICAgIyBUcmVhdCBvbmx5IHRoZSBmaXJzdCAiLiIgYXMgdGhlIGRlY2ltYWwgcG9pbnQuCisKKyAgICAjIFBhcnNlIHRoZSBmb3JtYXQuCisgIFBBUlNFUjoKKyAgICB3aGlsZSAoICRwb3MgPCBsZW5ndGggJGZvcm1hdCApIHsKKyAgICAgICAgJHN0YXJ0X3BvcyA9ICRwb3M7CisgICAgICAgIG15ICRjaGFyID0gc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICk7CisKKyAgICAgICAgIyBJZ25vcmUgY29udHJvbCBmb3JtYXQgY2hhcmFjdGVycyBzdWNoIGFzICcjMCstLj9lRSwlJy4gSG93ZXZlciwKKyAgICAgICAgIyBvbmx5IGlnbm9yZSAnLicgaWYgaXQgaXMgdGhlIGZpcnN0IG9uZSBlbmNvdW50ZXJlZC4gUlQgNDU1MDIuCisgICAgICAgIGlmICggKCAhJHNlZW5fZG90ICYmICRjaGFyICF+IC9bIzBcK1wtXC5cP2VFXCxcJV0vICkKKyAgICAgICAgICAgIHx8ICRjaGFyICF+IC9bIzBcK1wtXD9lRVwsXCVdLyApCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYgKCAkdG9rZW5fc3RhcnQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLAorICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRmb3JtYXQsICR0b2tlbl9zdGFydCwgJHBvcyAtICR0b2tlbl9zdGFydCApLAorICAgICAgICAgICAgICAgICAgICAkZGVjaW1hbF9wb3MsICRwb3MgLSAkdG9rZW5fc3RhcnQKKyAgICAgICAgICAgICAgICAgIF07CisgICAgICAgICAgICAgICAgJHRva2VuX3N0YXJ0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjIFByb2Nlc3NpbmcgZm9yIHF1b3RlZCBzdHJpbmdzIHdpdGhpbiB0aGUgZm9ybWF0LiBTZWUgbm90ZXMgYWJvdmUuCisgICAgICAgIGlmICggJGNoYXIgZXEgJyInICkgeworICAgICAgICAgICAgJGRvdWJsZV9xdW90ZSA9ICRkb3VibGVfcXVvdGUgPyAwIDogMTsKKyAgICAgICAgICAgICRwb3MrKzsKKyAgICAgICAgICAgIG5leHQgUEFSU0VSOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggJGNoYXIgZXEgJyEnICkgeworICAgICAgICAgICAgJHNpbmdsZV9xdW90ZSA9IDE7CisgICAgICAgICAgICAkcG9zKys7CisgICAgICAgICAgICBuZXh0IFBBUlNFUjsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRjaGFyIGVxICdcXCcgKSB7CisgICAgICAgICAgICBpZiAoICRzaW5nbGVfcXVvdGUgIT0gMSApIHsKKyAgICAgICAgICAgICAgICAkc2luZ2xlX3F1b3RlID0gMTsKKyAgICAgICAgICAgICAgICAkcG9zKys7CisgICAgICAgICAgICAgICAgbmV4dCBQQVJTRVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoICAgKCBkZWZpbmVkKCRkb3VibGVfcXVvdGUpIGFuZCAoJGRvdWJsZV9xdW90ZSkgKQorICAgICAgICAgICAgb3IgKCBkZWZpbmVkKCRzaW5nbGVfcXVvdGUpIGFuZCAoJHNpbmdsZV9xdW90ZSkgKQorICAgICAgICAgICAgb3IgKCAkc2Vlbl9kb3QgJiYgJGNoYXIgZXEgJy4nICkgKQorICAgICAgICB7CisgICAgICAgICAgICAkc2luZ2xlX3F1b3RlID0gMDsKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAoICRmb3JtYXRfbW9kZSBuZSAnZGF0ZScgKQorICAgICAgICAgICAgICAgIGFuZCAoICAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICJceDgxXHhBMiIgKQorICAgICAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICJceDgxXHhBMyIgKQorICAgICAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICJceEEyXHhBNCIgKQorICAgICAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICJceEEyXHhBNSIgKSApCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICMgVGhlIGFib3ZlIG1hdGNoZXMgYXJlIGN1cnJlbmN5IHN5bWJvbHMuCisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLAorICAgICAgICAgICAgICAgICAgWyBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDIgKSwgbGVuZ3RoKCR0b2tlbiksIDIgXTsKKyAgICAgICAgICAgICAgICAkaXNfY3VycmVuY3kgPSAxOworICAgICAgICAgICAgICAgICRwb3MgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICRwb3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoCisgICAgICAgICAgICAoICRjaGFyID1+IC9bIzBcK1wuXD9lRVwsXCVdLyApCisgICAgICAgICAgICB8fCAoICAgICggJGZvcm1hdF9tb2RlIG5lICdkYXRlJyApCisgICAgICAgICAgICAgICAgYW5kICggKCAkY2hhciBlcSAnLScgKSB8fCAoICRjaGFyIGVxICcoJyApIHx8ICggJGNoYXIgZXEgJyknICkgKQorICAgICAgICAgICAgKQorICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgJGZvcm1hdF9tb2RlID0gJ251bWJlcicgdW5sZXNzICRmb3JtYXRfbW9kZTsKKyAgICAgICAgICAgIGlmICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICkgPX4gL1sjMF0vICkgeworICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkZm9ybWF0LCAkcG9zICkgPX4KKyAgICAgICAgICAgICAgICAgICAgL14oWyMwXStbXC5dP1swI10qW2VFXVtcK1wtXVswI10rKS8gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICQxLCAkcG9zLCBsZW5ndGgoJDEpIF07CisgICAgICAgICAgICAgICAgICAgICRwb3MgKz0gbGVuZ3RoKCQxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggJHRva2VuX3N0YXJ0ID09IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHRva2VuX3N0YXJ0ID0gJHBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgICRkZWNpbWFsX3BvcyA9IGxlbmd0aCgkdG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSBlcSAnPycgKSB7CisKKyAgICAgICAgICAgICAgICAjIExvb2sgZm9yIGEgZnJhY3Rpb24gZm9ybWF0IGxpa2UgPy8/IG9yID8/Lz8/CisgICAgICAgICAgICAgICAgaWYgKCAkdG9rZW5fc3RhcnQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdCwgJHRva2VuX3N0YXJ0LCAkcG9zIC0gJHRva2VuX3N0YXJ0ICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICRkZWNpbWFsX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICRwb3MgLSAkdG9rZW5fc3RhcnQgKyAxCisgICAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHRva2VuX3N0YXJ0ID0gJHBvczsKKworICAgICAgICAgICAgICAgICMgRmluZCB0aGUgZW5kIG9mIHRoZSBmcmFjdGlvbiBmb3JtYXQuCisgICAgICAgICAgICAgIEZSQUNUSU9OOgorICAgICAgICAgICAgICAgIHdoaWxlICggJHBvcyA8IGxlbmd0aCgkZm9ybWF0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSBlcSAnLycgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkaXNfZnJhY3Rpb24gPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2lmICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICkgZXEgJz8nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHBvcysrOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGUkFDVElPTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJGlzX2ZyYWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSA9fiAvWzAtOV0vICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBDb3VsZCBpbnZlcnQgaWYoKSBsb2dpYyBhbmQgcmVtb3ZlIHRoaXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBvcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRlJBQ1RJT047CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IEZSQUNUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICRwb3MrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHBvcy0tOworCisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLAorICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRmb3JtYXQsICR0b2tlbl9zdGFydCwgJHBvcyAtICR0b2tlbl9zdGFydCArIDEgKSwKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKCR0b2tlbiksICRwb3MgLSAkdG9rZW5fc3RhcnQgKyAxCisgICAgICAgICAgICAgICAgICBdOworICAgICAgICAgICAgICAgICR0b2tlbl9zdGFydCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDMgKSA9fiAvXltlRV1bXCtcLV1bMCNdJC8gKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MgKSA9fiAvKFtlRV1bXCtcLV1bMCNdKykvICkgeworICAgICAgICAgICAgICAgICAgICBwdXNoIEBwbGFjZWhvbGRlcnMsIFsgJDEsICRwb3MsIGxlbmd0aCgkMSkgXTsKKyAgICAgICAgICAgICAgICAgICAgJHBvcyArPSBsZW5ndGgoJDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkdG9rZW5fc3RhcnQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggJHRva2VuX3N0YXJ0ICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICBwdXNoIEBwbGFjZWhvbGRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkZm9ybWF0LCAkdG9rZW5fc3RhcnQsICRwb3MgLSAkdG9rZW5fc3RhcnQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICRkZWNpbWFsX3BvcywgJHBvcyAtICR0b2tlbl9zdGFydAorICAgICAgICAgICAgICAgICAgICAgIF07CisgICAgICAgICAgICAgICAgICAgICR0b2tlbl9zdGFydCA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApID1+IC9bXCtcLV0vICkgeworICAgICAgICAgICAgICAgICAgICBwdXNoIEBwbGFjZWhvbGRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgWyBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSwgbGVuZ3RoKCR0b2tlbiksIDEgXTsKKyAgICAgICAgICAgICAgICAgICAgJGlzX2N1cnJlbmN5ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSBlcSAnLicgKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICAgICAgICAgICAgICBbIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApLCBsZW5ndGgoJHRva2VuKSwgMSBdOworICAgICAgICAgICAgICAgICAgICAkc2Vlbl9kb3QgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICcsJyApIHsKKyAgICAgICAgICAgICAgICAgICAgJGNvbW1hX2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICAgICAgICAgICAgICBbIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApLCBsZW5ndGgoJHRva2VuKSwgMSBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICclJyApIHsKKyAgICAgICAgICAgICAgICAgICAgJGlzX3BlcmNlbnQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSBlcSAnKCcgKQorICAgICAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICcpJyApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICAgICAgICAgICAgICBbIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApLCBsZW5ndGgoJHRva2VuKSwgMSBdOworICAgICAgICAgICAgICAgICAgICAkaXNfY3VycmVuY3kgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRwb3MrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRjaGFyID1+IC9beW1kaHNhcGddL2kgKSB7CisgICAgICAgICAgICAkZm9ybWF0X21vZGUgPSAnZGF0ZScgdW5sZXNzICRmb3JtYXRfbW9kZTsKKyAgICAgICAgICAgIGlmICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCA1ICkgPX4gL2FtXC9wbS9pICkgeworICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywgWyAnYW0vcG0nLCBsZW5ndGgoJHRva2VuKSwgNSBdOworICAgICAgICAgICAgICAgICRpc18xMl9ob3VyID0gMTsKKyAgICAgICAgICAgICAgICAkcG9zICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMyApID1+IC9hXC9wL2kgKSB7CisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICdhL3AnLCBsZW5ndGgoJHRva2VuKSwgMyBdOworICAgICAgICAgICAgICAgICRpc18xMl9ob3VyID0gMTsKKyAgICAgICAgICAgICAgICAkcG9zICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgNSApIGVxICdtbW1tbScgKSB7CisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICdtbW1tbScsIGxlbmd0aCgkdG9rZW4pLCA1IF07CisgICAgICAgICAgICAgICAgJHBvcyArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCA0ICkgZXEgJ21tbW0nICkKKyAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgNCApIGVxICdkZGRkJyApCisgICAgICAgICAgICAgICAgfHwgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDQgKSBlcSAneXl5eScgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCA0ICkgZXEgJ2dnZ2UnICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICAgICAgICAgIFsgc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCA0ICksIGxlbmd0aCgkdG9rZW4pLCA0IF07CisgICAgICAgICAgICAgICAgJHBvcyArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAzICkgZXEgJ2RkZCcgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAzICkgZXEgJ21tbScgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAzICkgZXEgJ3l5eScgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLAorICAgICAgICAgICAgICAgICAgWyBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDMgKSwgbGVuZ3RoKCR0b2tlbiksIDMgXTsKKyAgICAgICAgICAgICAgICAkcG9zICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDIgKSBlcSAneXknICkKKyAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICdtbScgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAyICkgZXEgJ2RkJyApCisgICAgICAgICAgICAgICAgfHwgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDIgKSBlcSAnaGgnICkKKyAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICdzcycgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAyICkgZXEgJ2dlJyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAyICkgZXEgJ21tJyApCisgICAgICAgICAgICAgICAgICAgICYmIChAcGxhY2Vob2xkZXJzKQorICAgICAgICAgICAgICAgICAgICAmJiAoICAgKCAkcGxhY2Vob2xkZXJzWy0xXS0+WzBdIGVxICdoJyApCisgICAgICAgICAgICAgICAgICAgICAgICBvciAoICRwbGFjZWhvbGRlcnNbLTFdLT5bMF0gZXEgJ2hoJyApICkKKyAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgIyBGb3IgdGhpcyBjYXNlICdtJyBpcyBtaW51dGVzIG5vdCBtb250aHMuCisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywgWyAnbW0nLCBsZW5ndGgoJHRva2VuKSwgMiwgJ21pbnV0ZXMnIF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwdXNoIEBwbGFjZWhvbGRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgWyBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDIgKSwgbGVuZ3RoKCR0b2tlbiksIDIgXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCAgICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAyICkgZXEgJ3NzJyApCisgICAgICAgICAgICAgICAgICAgICYmICggQHBsYWNlaG9sZGVycyA+IDEgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKCAkcGxhY2Vob2xkZXJzWy0yXS0+WzBdIGVxICdtJyApCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoICRwbGFjZWhvbGRlcnNbLTJdLT5bMF0gZXEgJ21tJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICAjIEZvciB0aGlzIGNhc2UgJ20nIGlzIG1pbnV0ZXMgbm90IG1vbnRocy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goIEB7ICRwbGFjZWhvbGRlcnNbLTJdIH0sICdtaW51dGVzJyApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRwb3MgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICdtJyApCisgICAgICAgICAgICAgICAgfHwgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSBlcSAnZCcgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICkgZXEgJ2gnICkKKyAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICdzJyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICkgZXEgJ20nICkKKyAgICAgICAgICAgICAgICAgICAgJiYgKEBwbGFjZWhvbGRlcnMpCisgICAgICAgICAgICAgICAgICAgICYmICggICAoICRwbGFjZWhvbGRlcnNbLTFdLT5bMF0gZXEgJ2gnICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yICggJHBsYWNlaG9sZGVyc1stMV0tPlswXSBlcSAnaGgnICkgKQorICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAjIEZvciB0aGlzIGNhc2UgJ20nIGlzIG1pbnV0ZXMgbm90IG1vbnRocy4KKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICdtJywgbGVuZ3RoKCR0b2tlbiksIDEsICdtaW51dGVzJyBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLAorICAgICAgICAgICAgICAgICAgICAgIFsgc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICksIGxlbmd0aCgkdG9rZW4pLCAxIF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggICAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICdzJyApCisgICAgICAgICAgICAgICAgICAgICYmICggQHBsYWNlaG9sZGVycyA+IDEgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKCAkcGxhY2Vob2xkZXJzWy0yXS0+WzBdIGVxICdtJyApCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoICRwbGFjZWhvbGRlcnNbLTJdLT5bMF0gZXEgJ21tJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICAjIEZvciB0aGlzIGNhc2UgJ20nIGlzIG1pbnV0ZXMgbm90IG1vbnRocy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goIEB7ICRwbGFjZWhvbGRlcnNbLTJdIH0sICdtaW51dGVzJyApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRwb3MgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAzICkgZXEgJ1toXScgKSApIHsKKyAgICAgICAgICAgICRmb3JtYXRfbW9kZSA9ICdkYXRlJyB1bmxlc3MgJGZvcm1hdF9tb2RlOworICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICdbaF0nLCBsZW5ndGgoJHRva2VuKSwgMyBdOworICAgICAgICAgICAgJHBvcyArPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDQgKSBlcSAnW21tXScgKSApIHsKKyAgICAgICAgICAgICRmb3JtYXRfbW9kZSA9ICdkYXRlJyB1bmxlc3MgJGZvcm1hdF9tb2RlOworICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICdbbW1dJywgbGVuZ3RoKCR0b2tlbiksIDQgXTsKKyAgICAgICAgICAgICRwb3MgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRjaGFyIGVxICdAJyApIHsKKyAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywgWyAnQCcsIGxlbmd0aCgkdG9rZW4pLCAxIF07CisgICAgICAgICAgICAkcG9zKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkY2hhciBlcSAnKicgKSB7CisgICAgICAgICAgICBwdXNoIEBwbGFjZWhvbGRlcnMsCisgICAgICAgICAgICAgIFsgc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICksIGxlbmd0aCgkdG9rZW4pLCAxIF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkcG9zKys7CisgICAgICAgIH0KKyAgICAgICAgJHBvcysrIGlmICggJHBvcyA9PSAkc3RhcnRfcG9zICk7ICAgICNObyBGb3JtYXQgbWF0Y2gKKyAgICAgICAgJHRva2VuIC49IHN1YnN0ciggJGZvcm1hdCwgJHN0YXJ0X3BvcywgJHBvcyAtICRzdGFydF9wb3MgKTsKKworICAgIH0gICAgIyBFbmQgb2YgcGFyc2luZy4KKworICAgICMgQ29weSB0aGUgbG9jYXRlZCBmb3JtYXQgc3RyaW5nIHRvIGEgcmVzdWx0IHN0cmluZyB0aGF0IHdlIHdpbGwgcGVyZm9ybQorICAgICMgdGhlIHN1YnN0aXR1dGlvbnMgb24gYW5kIHJldHVybiB0byB0aGUgdXNlci4KKyAgICBteSAkcmVzdWx0ID0gJHRva2VuOworCisgICAgIyBBZGQgYSBwbGFjZWhvbGRlciBiZXR3ZWVuIHRoZSBkZWNpbWFsL2NvbW1hIGFuZCBlbmQgb2YgdGhlIHRva2VuLCBpZiBhbnkuCisgICAgaWYgKCAkdG9rZW5fc3RhcnQgIT0gLTEgKSB7CisgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICBbCisgICAgICAgICAgICBzdWJzdHIoICRmb3JtYXQsICR0b2tlbl9zdGFydCwgJHBvcyAtICR0b2tlbl9zdGFydCArIDEgKSwKKyAgICAgICAgICAgICRkZWNpbWFsX3BvcywgJHBvcyAtICR0b2tlbl9zdGFydCArIDEKKyAgICAgICAgICBdOworICAgIH0KKworICAgICMKKyAgICAjIEluIHRoZSBuZXh0IHNlY3Rpb25zIHdlIHByb2Nlc3MgZGF0ZSwgbnVtYmVyIGFuZCB0ZXh0IGZvcm1hdHMuIFdlIHRha2UgYQorICAgICMgZm9ybWF0IHN1Y2ggYXMgeXl5eS9tbS9kZCBhbmQgcmVwbGFjZSBpdCB3aXRoIHNvbWV0aGluZyBsaWtlIDIwMDgvMTIvMjUuCisgICAgIworICAgIGlmICggKCAkZm9ybWF0X21vZGUgZXEgJ2RhdGUnICkgJiYgKCAkbnVtYmVyID1+ICRxck5VTUJFUiApICkgeworCisgICAgICAgICMgVGhlIG1heGltdW0gYWxsb3dhYmxlIGRhdGUgaW4gRXhjZWwgaXMgOTk5OS0xMi0zMVQyMzo1OTo1OS4wMDAgd2hpY2gKKyAgICAgICAgIyBlcXVhdGVzIHRvIDI5NTg0NjUuOTk5KyBpbiB0aGUgMTkwMCBlcG9jaCBhbmQgMjk1NzAwMy45OTkrIGluIHRoZQorICAgICAgICAjIDE5MDQgZXBvY2guIFdlIHVzZSAwIGFzIHRoZSBtaW5pbXVtIGluIGJvdGggZXBvY2hzLiBUaGUgMTkwNCBzeXN0ZW0KKyAgICAgICAgIyBhY3R1YWxseSBzdXBwb3J0cyBuZWdhdGl2ZSBudW1iZXJzIGJ1dCB0aGF0IGlzbid0IHdvcnRoIHRoZSBlZmZvcnQuCisgICAgICAgIG15ICRtaW5fZGF0ZSA9IDA7CisgICAgICAgIG15ICRtYXhfZGF0ZSA9IDI5NTg0NjY7CisgICAgICAgICRtYXhfZGF0ZSA9IDI5NTcwMDQgaWYgJGlzXzE5MDQ7CisKKyAgICAgICAgaWYgKCAkbnVtYmVyIDwgJG1pbl9kYXRlIHx8ICRudW1iZXIgPj0gJG1heF9kYXRlICkgeworICAgICAgICAgICAgcmV0dXJuICRudW1iZXI7ICAgICMgUmV0dXJuIHVuZm9ybWF0dGVkIG51bWJlci4KKyAgICAgICAgfQorCisgICAgICAgICMgUHJvY2VzcyBkYXRlIGZvcm1hdHMuCisgICAgICAgIG15IEB0aW1lID0gRXhjZWxMb2NhbHRpbWUoICRudW1iZXIsICRpc18xOTA0ICk7CisKKyAgICAgICAgIyAgICAwICAgICAxICAgICAyICAgICAgMyAgICAgNCAgICAgICA1ICAgICAgNiAgICAgIDcKKyAgICAgICAgbXkgKCAkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciwgJHdkYXksICRtc2VjICkgPSBAdGltZTsKKworICAgICAgICAkbW9udGgrKzsgICAgICAgICAgICAgICMgbG9jYWx0aW1lKCkgemVybyBpbmRleGVkIG1vbnRoLgorICAgICAgICAkeWVhciArPSAxOTAwOyAgICAgICAgICMgbG9jYWx0aW1lKCkgeWVhci4KKworICAgICAgICBteSBAZnVsbF9tb250aF9uYW1lID0gcXcoCisgICAgICAgICAgTm9uZSBKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkKKyAgICAgICAgICBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIKKyAgICAgICAgKTsKKyAgICAgICAgbXkgQHNob3J0X21vbnRoX25hbWUgPSBxdygKKyAgICAgICAgICBOb25lIEphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjCisgICAgICAgICk7CisgICAgICAgIG15IEBmdWxsX2RheV9uYW1lID0gcXcoCisgICAgICAgICAgU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkKKyAgICAgICAgKTsKKyAgICAgICAgbXkgQHNob3J0X2RheV9uYW1lID0gcXcoCisgICAgICAgICAgU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0CisgICAgICAgICk7CisKKyAgICAgICAgIyBSZXBsYWNlIHRoZSBwbGFjZWhvbGRlcnMgaW4gdGhlIHRlbXBsYXRlIHN1Y2ggYXMgeXl5eSBtbSBkZCB3aXRoCisgICAgICAgICMgYWN0dWFsIG51bWJlcnMgb3Igc3RyaW5ncy4KKyAgICAgICAgbXkgJHJlcGxhY2VtZW50OworICAgICAgICBmb3IgKCBteSAkaSA9IEBwbGFjZWhvbGRlcnMgLSAxIDsgJGkgPj0gMCA7ICRpLS0gKSB7CisgICAgICAgICAgICBteSAkcGxhY2Vob2xkZXIgPSAkcGxhY2Vob2xkZXJzWyRpXTsKKworICAgICAgICAgICAgaWYgKCAkcGxhY2Vob2xkZXItPlstMV0gZXEgJ21pbnV0ZXMnICkgeworCisgICAgICAgICAgICAgICAgIyBGb3IgdGhpcyBjYXNlICdtL21tJyBpcyBtaW51dGVzIG5vdCBtb250aHMuCisgICAgICAgICAgICAgICAgaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnbW0nICkgeworICAgICAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSBzcHJpbnRmKCAiJTAyZCIsICRtaW4gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IHNwcmludGYoICIlZCIsICRtaW4gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICd5eXl5JyApIHsKKworICAgICAgICAgICAgICAgICMgNCBkaWdpdCBZZWFyLiAyMDAwIC0+IDIwMDAuCisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyUwNGQnLCAkeWVhciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAneXknICkgeworCisgICAgICAgICAgICAgICAgIyAyIGRpZ2l0IFllYXIuIDIwMDAgLT4gMDAuCisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyUwMmQnLCAkeWVhciAlIDEwMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnbW1tbW0nICkgeworCisgICAgICAgICAgICAgICAgIyBGaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG1vbnRoIG5hbWUuIDEgLT4gSi4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSBzdWJzdHIoICRzaG9ydF9tb250aF9uYW1lWyRtb250aF0sIDAsIDEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ21tbW0nICkgeworCisgICAgICAgICAgICAgICAgIyBGdWxsIG1vbnRoIG5hbWUuIDEgLT4gSmFudWFyeS4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSAkZnVsbF9tb250aF9uYW1lWyRtb250aF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdtbW0nICkgeworCisgICAgICAgICAgICAgICAgIyBTaG9ydCBtb250aCBuYW1lLiAxIC0+IEphbi4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSAkc2hvcnRfbW9udGhfbmFtZVskbW9udGhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnbW0nICkgeworCisgICAgICAgICAgICAgICAgIyAyIGRpZ2l0IG1vbnRoLiAxIC0+IDAxLgorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IHNwcmludGYoICclMDJkJywgJG1vbnRoICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdtJyApIHsKKworICAgICAgICAgICAgICAgICMgMSBkaWdpdCBtb250aC4gMSAtPiAxLgorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IHNwcmludGYoICclZCcsICRtb250aCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnZGRkZCcgKSB7CisKKyAgICAgICAgICAgICAgICAjIEZ1bGwgZGF5IG5hbWUuIFdlZG5lc2RheSAoZm9yIGV4YW1wbGUuKQorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9ICRmdWxsX2RheV9uYW1lWyR3ZGF5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ2RkZCcgKSB7CisKKyAgICAgICAgICAgICAgICAjIFNob3J0IGRheSBuYW1lLiBXZWQgKGZvciBleGFtcGxlLikKKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSAkc2hvcnRfZGF5X25hbWVbJHdkYXldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnZGQnICkgeworCisgICAgICAgICAgICAgICAgIyAyIGRpZ2l0IGRheS4gMSAtPiAwMS4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSBzcHJpbnRmKCAnJTAyZCcsICRkYXkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ2QnICkgeworCisgICAgICAgICAgICAgICAgIyAxIGRpZ2l0IGRheS4gMSAtPiAxLgorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IHNwcmludGYoICclZCcsICRkYXkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ2hoJyApIHsKKworICAgICAgICAgICAgICAgICMgMiBkaWdpdCBob3VyLgorICAgICAgICAgICAgICAgIGlmICgkaXNfMTJfaG91cikgeworICAgICAgICAgICAgICAgICAgICBteSAkaG91cl90bXAgPSAkaG91ciAlIDEyOworICAgICAgICAgICAgICAgICAgICAkaG91cl90bXAgPSAxMiBpZiAkaG91ciAlIDEyID09IDA7CisgICAgICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IHNwcmludGYoICclZCcsICRob3VyX3RtcCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyUwMmQnLCAkaG91ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ2gnICkgeworCisgICAgICAgICAgICAgICAgIyAxIGRpZ2l0IGhvdXIuCisgICAgICAgICAgICAgICAgaWYgKCRpc18xMl9ob3VyKSB7CisgICAgICAgICAgICAgICAgICAgIG15ICRob3VyX3RtcCA9ICRob3VyICUgMTI7CisgICAgICAgICAgICAgICAgICAgICRob3VyX3RtcCA9IDEyIGlmICRob3VyICUgMTIgPT0gMDsKKyAgICAgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyUyZCcsICRob3VyX3RtcCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyVkJywgJGhvdXIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdzcycgKSB7CisKKyAgICAgICAgICAgICAgICAjIDIgZGlnaXQgc2Vjb25kcy4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSBzcHJpbnRmKCAnJTAyZCcsICRzZWMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ3MnICkgeworCisgICAgICAgICAgICAgICAgIyAxIGRpZ2l0IHNlY29uZHMuCisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyVkJywgJHNlYyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnYW0vcG0nICkgeworCisgICAgICAgICAgICAgICAgIyBBTS9QTS4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSAoICRob3VyID49IDEyICkgPyAnUE0nIDogJ0FNJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ2EvcCcgKSB7CisKKyAgICAgICAgICAgICAgICAjIEFNL1BNLgorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9ICggJGhvdXIgPj0gMTIgKSA/ICdQJyA6ICdBJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJy4nICkgeworCisgICAgICAgICAgICAgICAgIyBEZWNpbWFsIHBvaW50IGZvciBzZWNvbmRzLgorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gPX4gLyheMCskKS8gKSB7CisKKyAgICAgICAgICAgICAgICAjIE1pbGxpc2Vjb25kcy4gRm9yIGV4YW1wbGUgaDpzcy4wMDAuCisgICAgICAgICAgICAgICAgbXkgJGxlbmd0aCA9IGxlbmd0aCgkMSk7CisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0KKyAgICAgICAgICAgICAgICAgIHN1YnN0ciggc3ByaW50ZiggIiUuJHtsZW5ndGh9ZiIsICRtc2VjIC8gMTAwMCApLCAyLCAkbGVuZ3RoICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdbaF0nICkgeworCisgICAgICAgICAgICAgICAgIyBIb3VycyBtb2R1bHVzIDI0LiAyNSBkaXNwbGF5cyBhcyAyNSBub3QgYXMgMS4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSBzcHJpbnRmKCAnJWQnLCBpbnQoJG51bWJlcikgKiAyNCArICRob3VyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdbbW1dJyApIHsKKworICAgICAgICAgICAgICAgICMgTWlucyBtb2R1bHVzIDYwLiA3MiBkaXNwbGF5cyBhcyA3MiBub3QgYXMgMTIuCisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0KKyAgICAgICAgICAgICAgICAgIHNwcmludGYoICclZCcsICggaW50KCRudW1iZXIpICogMjQgKyAkaG91ciApICogNjAgKyAkbWluICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdnZScgKSB7CisgICAgICAgICAgICAgICAgcmVxdWlyZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW47CisgICAgICAgICAgICAgICAgIyBKYXBhbmVzZSBOZW5nbyAoYWthIEdlbmdvKSBpbiBpbml0aWFsaXNtIChhYmJyLiBuYW1lKQorICAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPQorICAgICAgICAgICAgICAgICAgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuOjpDbnZOZW5nbyggYWJicl9uYW1lID0+IEB0aW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdnZ2dlJyApIHsKKyAgICAgICAgICAgICAgICByZXF1aXJlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRKYXBhbjsKKyAgICAgICAgICAgICAgICAjIEphcGFuZXNlIE5lbmdvIChha2EgR2VuZ28pIGluIEthbmppIChmdWxsIG5hbWUpCisgICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9CisgICAgICAgICAgICAgICAgICBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW46OkNudk5lbmdvKCBuYW1lID0+IEB0aW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdAJyApIHsKKworICAgICAgICAgICAgICAgICMgVGV4dCBmb3JtYXQuCisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gJG51bWJlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBTdWJzdGl0dXRlIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgYmFjayBpbnRvIHRoZSB0ZW1wbGF0ZS4KKyAgICAgICAgICAgIHN1YnN0ciggJHJlc3VsdCwgJHBsYWNlaG9sZGVyLT5bMV0sICRwbGFjZWhvbGRlci0+WzJdLAorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2lmICggKCAkZm9ybWF0X21vZGUgZXEgJ251bWJlcicgKSAmJiAoICRudW1iZXIgPX4gJHFyTlVNQkVSICkgKSB7CisKKyAgICAgICAgIyBQcm9jZXNzIG5vbiBkYXRlIGZvcm1hdHMuCisgICAgICAgIGlmIChAcGxhY2Vob2xkZXJzKSB7CisgICAgICAgICAgICB3aGlsZSAoICRwbGFjZWhvbGRlcnNbLTFdLT5bMF0gZXEgJywnICkgeworICAgICAgICAgICAgICAgICRjb21tYV9jb3VudC0tOworICAgICAgICAgICAgICAgIHN1YnN0cigKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgJHBsYWNlaG9sZGVyc1stMV0tPlsxXSwKKyAgICAgICAgICAgICAgICAgICAgJHBsYWNlaG9sZGVyc1stMV0tPlsyXSwgJycKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICRudW1iZXIgLz0gMTAwMDsKKyAgICAgICAgICAgICAgICBwb3AgQHBsYWNlaG9sZGVyczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbXkgJG51bWJlcl9mb3JtYXQgPSBqb2luKCAnJywgbWFwIHsgJF8tPlswXSB9IEBwbGFjZWhvbGRlcnMgKTsKKyAgICAgICAgICAgIG15ICRudW1iZXJfcmVzdWx0OworICAgICAgICAgICAgbXkgJHN0cl9sZW5ndGggICAgPSAwOworICAgICAgICAgICAgbXkgJGVuZ2luZWVyaW5nICAgPSAwOworICAgICAgICAgICAgbXkgJGlzX2RlY2ltYWwgICAgPSAwOworICAgICAgICAgICAgbXkgJGlzX2ludGVnZXIgICAgPSAwOworICAgICAgICAgICAgbXkgJGFmdGVyX2RlY2ltYWwgPSB1bmRlZjsKKworICAgICAgICAgICAgZm9yIG15ICR0b2tlbiAoIHNwbGl0IC8vLCAkbnVtYmVyX2Zvcm1hdCApIHsKKyAgICAgICAgICAgICAgICBpZiAoICR0b2tlbiBlcSAnLicgKSB7CisgICAgICAgICAgICAgICAgICAgICRzdHJfbGVuZ3RoKys7CisgICAgICAgICAgICAgICAgICAgICRpc19kZWNpbWFsID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCAoICR0b2tlbiBlcSAnRScgKSB8fCAoICR0b2tlbiBlcSAnZScgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVuZ2luZWVyaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCAkdG9rZW4gZXEgJzAnICkgeworICAgICAgICAgICAgICAgICAgICAkc3RyX2xlbmd0aCsrOworICAgICAgICAgICAgICAgICAgICAkYWZ0ZXJfZGVjaW1hbCsrIGlmICRpc19kZWNpbWFsOworICAgICAgICAgICAgICAgICAgICAkaXNfaW50ZWdlciA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJHRva2VuIGVxICcjJyApIHsKKyAgICAgICAgICAgICAgICAgICAgJGFmdGVyX2RlY2ltYWwrKyBpZiAkaXNfZGVjaW1hbDsKKyAgICAgICAgICAgICAgICAgICAgJGlzX2ludGVnZXIgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoICR0b2tlbiBlcSAnPycgKSB7CisgICAgICAgICAgICAgICAgICAgICRhZnRlcl9kZWNpbWFsKysgaWYgJGlzX2RlY2ltYWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkbnVtYmVyICo9IDEwMC4wIGlmICRpc19wZXJjZW50OworCisgICAgICAgICAgICBteSAkZGF0YSA9ICgkaXNfY3VycmVuY3kpID8gYWJzKCRudW1iZXIpIDogJG51bWJlciArIDA7CisKKyAgICAgICAgICAgIGlmICgkaXNfZnJhY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAkbnVtYmVyX3Jlc3VsdCA9IHNwcmludGYoICIlMCR7c3RyX2xlbmd0aH1kIiwgaW50KCRkYXRhKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCRpc19kZWNpbWFsKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRhZnRlcl9kZWNpbWFsICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJG51bWJlcl9yZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICIlMCR7c3RyX2xlbmd0aH0uJHthZnRlcl9kZWNpbWFsfWYiLCAkZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRudW1iZXJfcmVzdWx0ID0gc3ByaW50ZiAiJTAke3N0cl9sZW5ndGh9ZiIsICRkYXRhOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIyBGaXggZm9yIFBlcmwgYW5kIHNwcmludGYgbm90IHJvdW5kaW5nIHVwIGxpa2UgRXhjZWwuCisgICAgICAgICAgICAgICAgICAgICMgaHR0cDovL3J0LmNwYW4ub3JnL1B1YmxpYy9CdWcvRGlzcGxheS5odG1sP2lkPTQ1NjI2CisgICAgICAgICAgICAgICAgICAgIGlmICggJGRhdGEgPX4gL14ke251bWJlcl9yZXN1bHR9NS8gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkbnVtYmVyX3Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgIiUwJHtzdHJfbGVuZ3RofS4ke2FmdGVyX2RlY2ltYWx9ZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICRkYXRhIC4gJzEnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkbnVtYmVyX3Jlc3VsdCA9IHNwcmludGYoICIlMCR7c3RyX2xlbmd0aH0uMGYiLCAkZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJG51bWJlcl9yZXN1bHQgPSBBZGRDb21tYSgkbnVtYmVyX3Jlc3VsdCkgaWYgJGNvbW1hX2NvdW50ID4gMDsKKworICAgICAgICAgICAgbXkgJG51bWJlcl9sZW5ndGggPSBsZW5ndGgoJG51bWJlcl9yZXN1bHQpOworICAgICAgICAgICAgbXkgJGRlY2ltYWxfcG9zICAgPSAtMTsKKyAgICAgICAgICAgIG15ICRyZXBsYWNlbWVudDsKKworICAgICAgICAgICAgZm9yICggbXkgJGkgPSBAcGxhY2Vob2xkZXJzIC0gMSA7ICRpID49IDAgOyAkaS0tICkgeworICAgICAgICAgICAgICAgIG15ICRwbGFjZWhvbGRlciA9ICRwbGFjZWhvbGRlcnNbJGldOworCisgICAgICAgICAgICAgICAgaWYgKCAkcGxhY2Vob2xkZXItPlswXSA9fgorICAgICAgICAgICAgICAgICAgICAvKFsjMF0qKShbXC5dPykoWzAjXSopKFtlRV0pKFtcK1wtXSkoWzAjXSspLyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRyZXN1bHQsICRwbGFjZWhvbGRlci0+WzFdLCAkcGxhY2Vob2xkZXItPlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VFKCAkcGxhY2Vob2xkZXItPlswXSwgJG51bWJlciApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gPX4gL1wvLyApIHsKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkcmVzdWx0LCAkcGxhY2Vob2xkZXItPlsxXSwgJHBsYWNlaG9sZGVyLT5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBNYWtlRnJhY3Rpb24oICRwbGFjZWhvbGRlci0+WzBdLCAkbnVtYmVyLCAkaXNfaW50ZWdlciApCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJy4nICkgeworICAgICAgICAgICAgICAgICAgICAkbnVtYmVyX2xlbmd0aC0tOworICAgICAgICAgICAgICAgICAgICAkZGVjaW1hbF9wb3MgPSAkbnVtYmVyX2xlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnKycgKSB7CisgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJHJlc3VsdCwgJHBsYWNlaG9sZGVyLT5bMV0sICRwbGFjZWhvbGRlci0+WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgKCAkbnVtYmVyID4gMCApCisgICAgICAgICAgICAgICAgICAgICAgICA/ICcrJworICAgICAgICAgICAgICAgICAgICAgICAgOiAoICggJG51bWJlciA9PSAwICkgPyAnKycgOiAnLScgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICctJyApIHsKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkcmVzdWx0LCAkcGxhY2Vob2xkZXItPlsxXSwgJHBsYWNlaG9sZGVyLT5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAoICRudW1iZXIgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gJycKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKCAoICRudW1iZXIgPT0gMCApID8gJycgOiAnLScgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdAJyApIHsKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkcmVzdWx0LCAkcGxhY2Vob2xkZXItPlsxXSwgJHBsYWNlaG9sZGVyLT5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAkbnVtYmVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJyonICkgeworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRyZXN1bHQsICRwbGFjZWhvbGRlci0+WzFdLCAkcGxhY2Vob2xkZXItPlsyXSwgJycgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCggJHBsYWNlaG9sZGVyLT5bMF0gZXEgIlx4QTJceEE0IiApCisgICAgICAgICAgICAgICAgICAgIG9yICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgIlx4QTJceEE1IiApCisgICAgICAgICAgICAgICAgICAgIG9yICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgIlx4ODFceEEyIiApCisgICAgICAgICAgICAgICAgICAgIG9yICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgIlx4ODFceEEzIiApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1YnN0cigKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQsICAgICAgICAgICAkcGxhY2Vob2xkZXItPlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICRwbGFjZWhvbGRlci0+WzJdLCAkcGxhY2Vob2xkZXItPlswXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnKCcgKQorICAgICAgICAgICAgICAgICAgICBvciAoICRwbGFjZWhvbGRlci0+WzBdIGVxICcpJyApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1YnN0cigKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQsICAgICAgICAgICAkcGxhY2Vob2xkZXItPlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICRwbGFjZWhvbGRlci0+WzJdLCAkcGxhY2Vob2xkZXItPlswXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkbnVtYmVyX2xlbmd0aCA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRpIDw9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJG51bWJlcl9yZXN1bHQsIDAsICRudW1iZXJfbGVuZ3RoICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG51bWJlcl9sZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJHJlYWxfcGFydF9sZW5ndGggPSBsZW5ndGgoICRwbGFjZWhvbGRlci0+WzBdICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkZGVjaW1hbF9wb3MgPj0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJGZvcm1hdCA9ICRwbGFjZWhvbGRlci0+WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0ID1+IHMvXiMrLy87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsX3BhcnRfbGVuZ3RoID0gbGVuZ3RoICRmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsX3BhcnRfbGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRudW1iZXJfbGVuZ3RoIDw9ICRyZWFsX3BhcnRfbGVuZ3RoICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICRudW1iZXJfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAkcmVhbF9wYXJ0X2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsX3BhcnRfbGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRudW1iZXJfbGVuZ3RoIDw9ICRyZWFsX3BhcnRfbGVuZ3RoICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICRudW1iZXJfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAkcmVhbF9wYXJ0X2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJG51bWJlcl9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRudW1iZXJfbGVuZ3RoIC0gJHJlYWxfcGFydF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsX3BhcnRfbGVuZ3RoICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG51bWJlcl9sZW5ndGggLT0gJHJlYWxfcGFydF9sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSAnJzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRyZXN1bHQsICRwbGFjZWhvbGRlci0+WzFdLCAkcGxhY2Vob2xkZXItPlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJceDAwIiAuICRyZXBsYWNlbWVudCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRyZXBsYWNlbWVudCA9CisgICAgICAgICAgICAgICggJG51bWJlcl9sZW5ndGggPiAwICkKKyAgICAgICAgICAgICAgPyBzdWJzdHIoICRudW1iZXJfcmVzdWx0LCAwLCAkbnVtYmVyX2xlbmd0aCApCisgICAgICAgICAgICAgIDogJyc7CisgICAgICAgICAgICAkcmVzdWx0ID1+IHMvXHgwMC8kcmVwbGFjZW1lbnQvOworICAgICAgICAgICAgJHJlc3VsdCA9fiBzL1x4MDAvL2c7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgIyBQcm9jZXNzIHRleHQgZm9ybWF0cworICAgICAgICBteSAkaXNfdGV4dCA9IDA7CisgICAgICAgIGZvciAoIG15ICRpID0gQHBsYWNlaG9sZGVycyAtIDEgOyAkaSA+PSAwIDsgJGktLSApIHsKKyAgICAgICAgICAgIG15ICRwbGFjZWhvbGRlciA9ICRwbGFjZWhvbGRlcnNbJGldOworICAgICAgICAgICAgaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnQCcgKSB7CisgICAgICAgICAgICAgICAgc3Vic3RyKCAkcmVzdWx0LCAkcGxhY2Vob2xkZXItPlsxXSwgJHBsYWNlaG9sZGVyLT5bMl0sCisgICAgICAgICAgICAgICAgICAgICRudW1iZXIgKTsKKyAgICAgICAgICAgICAgICAkaXNfdGV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3Vic3RyKCAkcmVzdWx0LCAkcGxhY2Vob2xkZXItPlsxXSwgJHBsYWNlaG9sZGVyLT5bMl0sICcnICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAkcmVzdWx0ID0gJG51bWJlciB1bmxlc3MgJGlzX3RleHQ7CisKKyAgICB9ICAgICMgRW5kIG9mIHBsYWNlaG9sZGVyIHN1YnN0aXR1dGlvbnMuCisKKyAgICAjIFRyaW0gdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgcmVzdWx0cy4KKyAgICAkcmVzdWx0ID1+IHMvXlxzKy8vOworICAgICRyZXN1bHQgPX4gcy9ccyskLy87CisKKyAgICAjIEZpeCBmb3IgbmVnYXRpdmUgY3VycmVuY3kuCisgICAgJHJlc3VsdCA9fiBzL15cJFwtL1wtXCQvOworICAgICRyZXN1bHQgPX4gcy9eXCQgXC0vXC1cJCAvOworCisgICAgIyBSZXR1cm4gY29sb3IgYW5kIGxvY2FsZSBzdHJpbmdzIGlmIHJlcXVpcmVkLgorICAgIGlmICgkd2FudF9zdWJmb3JtYXRzKSB7CisgICAgICAgIHJldHVybiAoICRyZXN1bHQsICRjb2xvciwgJGxvY2FsZSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZENvbW1hIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgQWRkQ29tbWEgeworICAgIG15ICgkc051bSkgPSBAXzsKKworICAgIGlmICggJHNOdW0gPX4gL14oW15cZF0qKShcZFxkXGRcZCspKFwuKi4qKSQvICkgeworICAgICAgICBteSAoICRzUHJlLCAkc09iaiwgJHNBZnQgKSA9ICggJDEsICQyLCAkMyApOworICAgICAgICBmb3IgKCBteSAkaSA9IGxlbmd0aCgkc09iaikgLSAzIDsgJGkgPiAwIDsgJGkgLT0gMyApIHsKKyAgICAgICAgICAgIHN1YnN0ciggJHNPYmosICRpLCAwLCAnLCcgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJHNQcmUgLiAkc09iaiAuICRzQWZ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuICRzTnVtOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWtlRnJhY3Rpb24gKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBNYWtlRnJhY3Rpb24geworICAgIG15ICggJHNGbXQsICRpRGF0YSwgJGlGbGcgKSA9IEBfOworICAgIG15ICRpQnVuYm87CisgICAgbXkgJGlTaG91OworCisgICAgIzEuIEluaXQKKyAgICAjIHByaW50ICJGTEc6ICRpRmxnXG4iOworICAgIGlmICgkaUZsZykgeworICAgICAgICAkaVNob3UgPSAkaURhdGEgLSBpbnQoJGlEYXRhKTsKKyAgICAgICAgcmV0dXJuICcnIGlmICggJGlTaG91ID09IDAgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRpU2hvdSA9ICRpRGF0YTsKKyAgICB9CisgICAgJGlTaG91ID0gYWJzKCRpU2hvdSk7CisgICAgbXkgJHNTV2s7CisKKyAgICAjMi5DYWxjIEJVTkJPCisgICAgIzIuMSBCVU5CTyBkZWZpbmVkCisgICAgaWYgKCAkc0ZtdCA9fiAvXC8oXGQrKSQvICkgeworICAgICAgICAkaUJ1bmJvID0gJDE7CisgICAgICAgIHJldHVybiBzcHJpbnRmKCAiJWQvJWQiLCAkaVNob3UgKiAkaUJ1bmJvLCAkaUJ1bmJvICk7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgICMyLjIgQ2FsYyBCVU5CTworICAgICAgICAkc0ZtdCA9fiAvXC8oXD8rKSQvOworICAgICAgICBteSAkaUtldGEgPSBsZW5ndGgoJDEpOworICAgICAgICBteSAkaVNXayAgPSAxOworICAgICAgICBteSAkc1NXayAgPSAnJzsKKyAgICAgICAgbXkgJGlCdW5zaTsKKyAgICAgICAgZm9yICggbXkgJGlCdW5ibyA9IDIgOyAkaUJ1bmJvIDwgMTAqKiRpS2V0YSA7ICRpQnVuYm8rKyApIHsKKyAgICAgICAgICAgICRpQnVuc2kgPSBpbnQoICRpU2hvdSAqICRpQnVuYm8gKyAwLjUgKTsKKyAgICAgICAgICAgIG15ICRpQ21wID0gYWJzKCAkaVNob3UgLSAoICRpQnVuc2kgLyAkaUJ1bmJvICkgKTsKKyAgICAgICAgICAgIGlmICggJGlDbXAgPCAkaVNXayApIHsKKyAgICAgICAgICAgICAgICAkaVNXayA9ICRpQ21wOworICAgICAgICAgICAgICAgICRzU1drID0gc3ByaW50ZiggIiVkLyVkIiwgJGlCdW5zaSwgJGlCdW5ibyApOworICAgICAgICAgICAgICAgIGxhc3QgaWYgKCAkaVNXayA9PSAwICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICRzU1drOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWtlRSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpVdGlsaXR5KQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIE1ha2VFIHsKKyAgICBteSAoICRzRm10LCAkaURhdGEgKSA9IEBfOworCisgICAgJHNGbXQgPX4gLygoWyMwXSopW1wuXT9bIzBdKikoW2VFXSkoW1wrXC1dWzAjXSspLzsKKyAgICBteSAoICRzS2FyaSwgJGlLZXRhLCAkc0UsICRzU2lzdSApID0gKCAkMSwgbGVuZ3RoKCQyKSwgJDMsICQ0ICk7CisgICAgJGlLZXRhID0gMSBpZiAoICRpS2V0YSA8PSAwICk7CisKKyAgICBteSAkaUxvZzEwID0gMDsKKyAgICAkaUxvZzEwID0gKCAkaURhdGEgPT0gMCApID8gMCA6ICggbG9nKCBhYnMoJGlEYXRhKSApIC8gbG9nKDEwKSApOworICAgICRpTG9nMTAgPSAoCisgICAgICAgIGludCggJGlMb2cxMCAvICRpS2V0YSApICsKKyAgICAgICAgICAoICggKCAkaUxvZzEwIC0gaW50KCAkaUxvZzEwIC8gJGlLZXRhICkgKSA8IDAgKSA/IC0xIDogMCApICkgKiAkaUtldGE7CisKKyAgICBteSAkc1VlID0gRXhjZWxGbXQoICRzS2FyaSwgJGlEYXRhICogKCAxMCoqKCAkaUxvZzEwICogLTEgKSApLCAwICk7CisgICAgbXkgJHNTaGl0YSA9IEV4Y2VsRm10KCAkc1Npc3UsICRpTG9nMTAsIDAgKTsKKyAgICByZXR1cm4gJHNVZSAuICRzRSAuICRzU2hpdGE7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGVhcFllYXIgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBMZWFwWWVhciB7CisgICAgbXkgKCRpWWVhcikgPSBAXzsKKyAgICByZXR1cm4gMSBpZiAoICRpWWVhciA9PSAxOTAwICk7ICAgICNTcGVjaWFsIGZvciBFeGNlbAorICAgIHJldHVybiAoICggKCAkaVllYXIgJSA0ICkgPT0gMCApCisgICAgICAgICAgJiYgKCAoICRpWWVhciAlIDEwMCApIHx8ICggJGlZZWFyICUgNDAwICkgPT0gMCApICkKKyAgICAgID8gMQorICAgICAgOiAwOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvY2FsdGltZUV4Y2VsIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgTG9jYWx0aW1lRXhjZWwgeworICAgIG15ICggJGlTZWMsICRpTWluLCAkaUhvdXIsICRpRGF5LCAkaU1vbiwgJGlZZWFyLCAkaXdEYXksICRpTVNlYywgJGZsZzE5MDQgKQorICAgICAgPSBAXzsKKworICAgICMwLiBJbml0CisgICAgJGlNb24rKzsKKyAgICAkaVllYXIgKz0gMTkwMDsKKworICAgICMxLiBDYWxjIFRpbWUKKyAgICBteSAkaVRpbWU7CisgICAgJGlUaW1lID0gJGlIb3VyOworICAgICRpVGltZSAqPSA2MDsKKyAgICAkaVRpbWUgKz0gJGlNaW47CisgICAgJGlUaW1lICo9IDYwOworICAgICRpVGltZSArPSAkaVNlYzsKKyAgICAkaVRpbWUgKz0gJGlNU2VjIC8gMTAwMC4wIGlmICggZGVmaW5lZCgkaU1TZWMpICk7CisgICAgJGlUaW1lIC89IDg2NDAwLjA7ICAgICMzNjAwKjI0KDFkYXkgaW4gc2Vjb25kcykKKyAgICBteSAkaVk7CisgICAgbXkgJGlZRGF5czsKKworICAgICMyLiBDYWxjIERheXMKKyAgICBpZiAoJGZsZzE5MDQpIHsKKyAgICAgICAgJGlZID0gMTkwNDsKKyAgICAgICAgJGlUaW1lLS07ICAgICAgICAgI1N0YXJ0IGZyb20gSmFuIDFzdAorICAgICAgICAkaVlEYXlzID0gMzY2OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGlZICAgICA9IDE5MDA7CisgICAgICAgICRpWURheXMgPSAzNjY7ICAgICNJbiBFeGNlbCAxOTAwIGlzIGxlYXAgeWVhciAoVGhhdCdzIG5vdCBUUlVFISkKKyAgICB9CisgICAgd2hpbGUgKCAkaVkgPCAkaVllYXIgKSB7CisgICAgICAgICRpVGltZSArPSAkaVlEYXlzOworICAgICAgICAkaVkrKzsKKyAgICAgICAgJGlZRGF5cyA9ICggTGVhcFllYXIoJGlZKSApID8gMzY2IDogMzY1OworICAgIH0KKyAgICBmb3IgKCBteSAkaU0gPSAxIDsgJGlNIDwgJGlNb24gOyAkaU0rKyApIHsKKyAgICAgICAgaWYgKCAgICRpTSA9PSAxCisgICAgICAgICAgICB8fCAkaU0gPT0gMworICAgICAgICAgICAgfHwgJGlNID09IDUKKyAgICAgICAgICAgIHx8ICRpTSA9PSA3CisgICAgICAgICAgICB8fCAkaU0gPT0gOAorICAgICAgICAgICAgfHwgJGlNID09IDEwCisgICAgICAgICAgICB8fCAkaU0gPT0gMTIgKQorICAgICAgICB7CisgICAgICAgICAgICAkaVRpbWUgKz0gMzE7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaU0gPT0gNCB8fCAkaU0gPT0gNiB8fCAkaU0gPT0gOSB8fCAkaU0gPT0gMTEgKSB7CisgICAgICAgICAgICAkaVRpbWUgKz0gMzA7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaU0gPT0gMiApIHsKKyAgICAgICAgICAgICRpVGltZSArPSAoIExlYXBZZWFyKCRpWWVhcikgKSA/IDI5IDogMjg7CisgICAgICAgIH0KKyAgICB9CisgICAgJGlUaW1lICs9ICRpRGF5OworICAgIHJldHVybiAkaVRpbWU7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhjZWxMb2NhbHRpbWUgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBFeGNlbExvY2FsdGltZSB7CisKKyAgICBteSAoICRkT2JqLCAkZmxnMTkwNCApID0gQF87CisgICAgbXkgKCAkaVNlYywgJGlNaW4sICRpSG91ciwgJGlEYXksICRpTW9uLCAkaVllYXIsICRpd0RheSwgJGlNU2VjICk7CisgICAgbXkgKCAkaUR0LCAkaVRpbWUsICRpWURheXMgKTsKKworICAgICRpRHQgICA9IGludCgkZE9iaik7CisgICAgJGlUaW1lID0gJGRPYmogLSAkaUR0OworCisgICAgIzEuIENhbGMgRGF5cworICAgIGlmICgkZmxnMTkwNCkgeworICAgICAgICAkaVllYXIgPSAxOTA0OworICAgICAgICAkaUR0Kys7ICAgICNTdGFydCBmcm9tIEphbiAxc3QKKyAgICAgICAgJGlZRGF5cyA9IDM2NjsKKyAgICAgICAgJGl3RGF5ID0gKCAoICRpRHQgKyA0ICkgJSA3ICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkaVllYXIgID0gMTkwMDsKKyAgICAgICAgJGlZRGF5cyA9IDM2NjsgICAgI0luIEV4Y2VsIDE5MDAgaXMgbGVhcCB5ZWFyIChUaGF0J3Mgbm90IFRSVUUhKQorICAgICAgICAkaXdEYXkgPSAoICggJGlEdCArIDYgKSAlIDcgKTsKKyAgICB9CisgICAgd2hpbGUgKCAkaUR0ID4gJGlZRGF5cyApIHsKKyAgICAgICAgJGlEdCAtPSAkaVlEYXlzOworICAgICAgICAkaVllYXIrKzsKKyAgICAgICAgJGlZRGF5cyA9CisgICAgICAgICAgKCAgICAgICggKCAkaVllYXIgJSA0ICkgPT0gMCApCisgICAgICAgICAgICAgICYmICggKCAkaVllYXIgJSAxMDAgKSB8fCAoICRpWWVhciAlIDQwMCApID09IDAgKSApID8gMzY2IDogMzY1OworICAgIH0KKyAgICAkaVllYXIgLT0gMTkwMDsgICAgICAgIyBMb2NhbHRpbWUgeWVhciBpcyByZWxhdGl2ZSB0byAxOTAwLgorCisgICAgZm9yICggJGlNb24gPSAxIDsgJGlNb24gPCAxMiA7ICRpTW9uKysgKSB7CisgICAgICAgIG15ICRpTUQ7CisgICAgICAgIGlmICggICAkaU1vbiA9PSAxCisgICAgICAgICAgICB8fCAkaU1vbiA9PSAzCisgICAgICAgICAgICB8fCAkaU1vbiA9PSA1CisgICAgICAgICAgICB8fCAkaU1vbiA9PSA3CisgICAgICAgICAgICB8fCAkaU1vbiA9PSA4CisgICAgICAgICAgICB8fCAkaU1vbiA9PSAxMAorICAgICAgICAgICAgfHwgJGlNb24gPT0gMTIgKQorICAgICAgICB7CisgICAgICAgICAgICAkaU1EID0gMzE7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaU1vbiA9PSA0IHx8ICRpTW9uID09IDYgfHwgJGlNb24gPT0gOSB8fCAkaU1vbiA9PSAxMSApIHsKKyAgICAgICAgICAgICRpTUQgPSAzMDsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRpTW9uID09IDIgKSB7CisgICAgICAgICAgICAkaU1EID0gKCAoICRpWWVhciAlIDQgKSA9PSAwICkgPyAyOSA6IDI4OworICAgICAgICB9CisgICAgICAgIGxhc3QgaWYgKCAkaUR0IDw9ICRpTUQgKTsKKyAgICAgICAgJGlEdCAtPSAkaU1EOworICAgIH0KKworICAgICRpTW9uIC09IDE7ICAgICMgTG9jYWx0aW1lIG1vbnRoIGlzIDAgYmFzZWQuCisKKyAgICAjMi4gQ2FsYyBUaW1lCisgICAgJGlEYXkgPSAkaUR0OworICAgICRpVGltZSArPSAoIDAuMDAwNSAvIDg2NDAwLjAgKTsKKyAgICAkaVRpbWUgKj0gMjQuMDsKKyAgICAkaUhvdXIgPSBpbnQoJGlUaW1lKTsKKyAgICAkaVRpbWUgLT0gJGlIb3VyOworICAgICRpVGltZSAqPSA2MC4wOworICAgICRpTWluID0gaW50KCRpVGltZSk7CisgICAgJGlUaW1lIC09ICRpTWluOworICAgICRpVGltZSAqPSA2MC4wOworICAgICRpU2VjID0gaW50KCRpVGltZSk7CisgICAgJGlUaW1lIC09ICRpU2VjOworICAgICRpVGltZSAqPSAxMDAwLjA7CisgICAgJGlNU2VjID0gaW50KCRpVGltZSk7CisKKyAgICByZXR1cm4gKCAkaVNlYywgJGlNaW4sICRpSG91ciwgJGlEYXksICRpTW9uLCAkaVllYXIsICRpd0RheSwgJGlNU2VjICk7Cit9CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29sMmludCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpVdGlsaXR5KQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb252ZXJ0cyBhIGV4Y2VsIHJvdyBsZXR0ZXIgaW50byBhbiBpbnQgZm9yIHVzZSBpbiBhbiBhcnJheQorc3ViIGNvbDJpbnQgeworICAgIG15ICRyZXN1bHQgPSAwOworICAgIG15ICRzdHIgICAgPSBzaGlmdDsKKyAgICBteSAkaW5jciAgID0gMDsKKworICAgIGZvciAoIG15ICRpID0gbGVuZ3RoKCRzdHIpIDsgJGkgPiAwIDsgJGktLSApIHsKKyAgICAgICAgbXkgJGNoYXIgPSBzdWJzdHIoICRzdHIsICRpIC0gMSApOworICAgICAgICBteSAkY3VyciArPSBvcmQoIGxjKCRjaGFyKSApIC0gb3JkKCdhJykgKyAxOworICAgICAgICAkY3VyciAqPSAkaW5jciBpZiAoJGluY3IpOworICAgICAgICAkcmVzdWx0ICs9ICRjdXJyOworICAgICAgICAkaW5jciAgICs9IDI2OworICAgIH0KKworICAgICMgdGhpcyBpcyBvbmUgb3V0IGFzIHdlIHJhbmdlIDAuLngtMSBub3QgMS4ueAorICAgICRyZXN1bHQtLTsKKworICAgIHJldHVybiAkcmVzdWx0OworfQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGludDJjb2wgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIyBpbnQyY29sCisjIGNvbnZlcnQgYSBjb2x1bW4gbnVtYmVyIGludG8gY29sdW1uIGxldHRlcnMKKyMgQG5vdGUgdGhpcyBpcyBxdWl0ZSBhIGJydXRlIGZvcmNlIGNvYXJzZSBtZXRob2QKKyMgICBkb2VzIG5vdCBtYW5hZ2UgdmFsdWVzIG92ZXIgNzAxIChaWikKKyMgQGFyZyBudW1iZXIsIHRvIGNvbnZlcnQKKyMgQHJldHVybnMgc3RyaW5nLCBjb2x1bW4gbmFtZQorIworc3ViIGludDJjb2wgeworICAgIG15ICRvdXQgPSAiIjsKKyAgICBteSAkdmFsID0gc2hpZnQ7CisKKyAgICBkbyB7CisgICAgICAgICRvdXQgLj0gY2hyKCAoICR2YWwgJSAyNiApICsgb3JkKCdBJykgKTsKKyAgICAgICAgJHZhbCA9IGludCggJHZhbCAvIDI2ICkgLSAxOworICAgIH0gd2hpbGUgKCAkdmFsID49IDAgKTsKKworICAgIHJldHVybiBzY2FsYXIgcmV2ZXJzZSAkb3V0OworfQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHNoZWV0UmVmIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyMgc2hlZXRSZWYKKyMgY29udmVydCBhbiBleGNlbCBsZXR0ZXItbnVtYmVyIGFkZHJlc3MgaW50byBhIHVzZWZ1bCBhcnJheSBhZGRyZXNzCisjIEBub3RlIHRoYXQgYWxzbyBFeGNlbCB1c2VzIFgtWSBub3RhdGlvbiwgd2Ugbm9ybWFsbHkgdXNlIFktWCBpbiBhcnJheXMKKyMgQGFyZ3MgJHN0ciwgZXhjZWwgY29vcmQgZWcuIEEyCisjIEByZXR1cm5zIGFuIGFycmF5IC0gMiBlbGVtZW50cyAtIGNvbHVtbiwgcm93LCBvciB1bmRlZmluZWQKKyMKK3N1YiBzaGVldFJlZiB7CisgICAgbXkgJHN0ciA9IHNoaWZ0OworICAgIG15IEByZXQ7CisKKyAgICAkc3RyID1+IG0vXihcRCspKFxkKykkLzsKKworICAgIGlmICggJDEgJiYgJDIgKSB7CisgICAgICAgIHB1c2goIEByZXQsICQyIC0gMSwgY29sMmludCgkMSkgKTsKKyAgICB9CisgICAgaWYgKCAkcmV0WzBdIDwgMCApIHsKKyAgICAgICAgdW5kZWYgQHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gQHJldDsKK30KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB4bHMyY3N2IChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyMgeGxzMmNzdgorIyBjb252ZXJ0IGEgY2h1bmsgb2YgYW4gZXhjZWwgZmlsZSBpbnRvIGNzdiB0ZXh0IGNodW5rCisjIEBhcmdzICRwYXJhbSwgc2hlZXQtY29scm93OmNvbHJvdyAoMS1BMTpCMiBvciBBMTpCMiBmb3Igc2hlZXQgMQorIyBAYXJncyAkcm90YXRlLCAwIG9yIDEgZGVjaWRlcyBpZiBvdXRwdXQgc2hvdWxkIGJlIHJvdGF0ZWQgb3Igbm90CisjIEByZXR1cm5zIHN0cmluZyBjb250YWluaW5nIGEgY2h1bmsgb2YgY3N2CisjCitzdWIgeGxzMmNzdiB7CisgICAgbXkgKCAkZmlsZW5hbWUsICRyZWdpb25zLCAkcm90YXRlICkgPSBAXzsKKyAgICBteSAkc2hlZXQgPSAwOworCisgICAgIyBXZSBuZWVkIFRleHQ6OkNTVl9YUyBmb3IgcHJvcGVyIENTViBoYW5kbGluZy4KKyAgICByZXF1aXJlIFRleHQ6OkNTVl9YUzsKKworICAgICMgZXh0cmFjdCBhbnkgc2hlZXQgbnVtYmVyIGZyb20gdGhlIHJlZ2lvbiBzdHJpbmcKKyAgICAkcmVnaW9ucyA9fiBtL14oXGQrKS0oLiopLzsKKworICAgIGlmICgkMikgeworICAgICAgICAkc2hlZXQgICA9ICQxIC0gMTsKKyAgICAgICAgJHJlZ2lvbnMgPSAkMjsKKyAgICB9CisKKyAgICAjIG5vdyBleHRyYWN0IHRoZSBzdGFydCBhbmQgZW5kIHJlZ2lvbnMKKyAgICAkcmVnaW9ucyA9fiBtLyguKik6KC4qKS87CisKKyAgICBpZiAoICEkMSB8fCAhJDIgKSB7CisgICAgICAgIHByaW50IFNUREVSUiAiQmFkIFBhcmFtcyI7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBteSBAc3RhcnQgPSBzaGVldFJlZigkMSk7CisgICAgbXkgQGVuZCAgID0gc2hlZXRSZWYoJDIpOworICAgIGlmICggIUBzdGFydCApIHsKKyAgICAgICAgcHJpbnQgU1RERVJSICJCYWQgY29vcmluYXRlcyAtICQxIjsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBpZiAoICFAZW5kICkgeworICAgICAgICBwcmludCBTVERFUlIgIkJhZCBjb29yaW5hdGVzIC0gJDIiOworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgaWYgKCAkc3RhcnRbMV0gPiAkZW5kWzFdICkgeworICAgICAgICBwcmludCBTVERFUlIgIkJhZCBDT0xVTU4gb3JkZXJpbmdcbiI7CisgICAgICAgIHByaW50IFNUREVSUiAiU3RhcnQgY29sdW1uICIgLiBpbnQyY29sKCAkc3RhcnRbMV0gKTsKKyAgICAgICAgcHJpbnQgU1RERVJSICIgYWZ0ZXIgZW5kIGNvbHVtbiAiIC4gaW50MmNvbCggJGVuZFsxXSApIC4gIlxuIjsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBpZiAoICRzdGFydFswXSA+ICRlbmRbMF0gKSB7CisgICAgICAgIHByaW50IFNUREVSUiAiQmFkIFJPVyBvcmRlcmluZ1xuIjsKKyAgICAgICAgcHJpbnQgU1RERVJSICJTdGFydCByb3cgIiAuICggJHN0YXJ0WzBdICsgMSApOworICAgICAgICBwcmludCBTVERFUlIgIiBhZnRlciBlbmQgcm93ICIgLiAoICRlbmRbMF0gKyAxICkgLiAiXG4iOworICAgICAgICBleGl0OworICAgIH0KKworICAgICMgc3RhcnQgdGhlIGV4Y2VsIG9iamVjdCBub3cKKyAgICBteSAkb0V4Y2VsID0gbmV3IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOworICAgIG15ICRvQm9vayAgPSAkb0V4Y2VsLT5QYXJzZSgkZmlsZW5hbWUpOworCisgICAgIyBvcGVuIHRoZSBzaGVldAorICAgIG15ICRvV2tTID0gJG9Cb29rLT57V29ya3NoZWV0fVskc2hlZXRdOworCisgICAgIyBub3cgY2hlY2sgdGhhdCB0aGUgcmVnaW9uIGV4aXN0cyBpbiB0aGUgZmlsZQorICAgICMgaWYgbm90IHRydW5jYXRlIHRvIHRoZSBwb3NzaWJsZSByZWdpb24KKyAgICAjIG91dHB1dCBhIHdhcm5pbmcgbXNnCisgICAgaWYgKCAkc3RhcnRbMV0gPCAkb1drUy0+e01pbkNvbH0gKSB7CisgICAgICAgIHByaW50IFNUREVSUiBpbnQyY29sKCAkc3RhcnRbMV0gKQorICAgICAgICAgIC4gIiA8IG1pbiBjb2wgIgorICAgICAgICAgIC4gaW50MmNvbCggJG9Xa1MtPntNaW5Db2x9ICkKKyAgICAgICAgICAuICIgUmVzZXR0aW5nXG4iOworICAgICAgICAkc3RhcnRbMV0gPSAkb1drUy0+e01pbkNvbH07CisgICAgfQorICAgIGlmICggJGVuZFsxXSA+ICRvV2tTLT57TWF4Q29sfSApIHsKKyAgICAgICAgcHJpbnQgU1RERVJSIGludDJjb2woICRlbmRbMV0gKQorICAgICAgICAgIC4gIiA+IG1heCBjb2wgIgorICAgICAgICAgIC4gaW50MmNvbCggJG9Xa1MtPntNYXhDb2x9ICkKKyAgICAgICAgICAuICIgUmVzZXR0aW5nXG4iOworICAgICAgICAkZW5kWzFdID0gJG9Xa1MtPntNYXhDb2x9OworICAgIH0KKyAgICBpZiAoICRzdGFydFswXSA8ICRvV2tTLT57TWluUm93fSApIHsKKyAgICAgICAgcHJpbnQgU1RERVJSICIiCisgICAgICAgICAgLiAoICRzdGFydFswXSArIDEgKQorICAgICAgICAgIC4gIiA8IG1pbiByb3cgIgorICAgICAgICAgIC4gKCAkb1drUy0+e01pblJvd30gKyAxICkKKyAgICAgICAgICAuICIgUmVzZXR0aW5nXG4iOworICAgICAgICAkc3RhcnRbMF0gPSAkb1drUy0+e01pbkNvbH07CisgICAgfQorICAgIGlmICggJGVuZFswXSA+ICRvV2tTLT57TWF4Um93fSApIHsKKyAgICAgICAgcHJpbnQgU1RERVJSICIiCisgICAgICAgICAgLiAoICRlbmRbMF0gKyAxICkKKyAgICAgICAgICAuICIgPiBtYXggcm93ICIKKyAgICAgICAgICAuICggJG9Xa1MtPntNYXhSb3d9ICsgMSApCisgICAgICAgICAgLiAiIFJlc2V0dGluZ1xuIjsKKyAgICAgICAgJGVuZFswXSA9ICRvV2tTLT57TWF4Um93fTsKKworICAgIH0KKworICAgIG15ICR4MSA9ICRzdGFydFsxXTsKKyAgICBteSAkeTEgPSAkc3RhcnRbMF07CisgICAgbXkgJHgyID0gJGVuZFsxXTsKKyAgICBteSAkeTIgPSAkZW5kWzBdOworCisgICAgbXkgQGNlbGxfZGF0YTsKKyAgICBteSAkcm93ID0gMDsKKworICAgIGlmICggISRyb3RhdGUgKSB7CisgICAgICAgIGZvciAoIG15ICR5ID0gJHkxIDsgJHkgPD0gJHkyIDsgJHkrKyApIHsKKyAgICAgICAgICAgIGZvciAoIG15ICR4ID0gJHgxIDsgJHggPD0gJHgyIDsgJHgrKyApIHsKKyAgICAgICAgICAgICAgICBteSAkY2VsbCA9ICRvV2tTLT57Q2VsbHN9WyR5XVskeF07CisKKyAgICAgICAgICAgICAgICBteSAkdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRjZWxsICkgeworICAgICAgICAgICAgICAgICAgICAkdmFsdWUgLj0gJGNlbGwtPnZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAnJzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdXNoIEB7ICRjZWxsX2RhdGFbJHJvd10gfSwgJHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHJvdysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKCBteSAkeCA9ICR4MSA7ICR4IDw9ICR4MiA7ICR4KysgKSB7CisgICAgICAgICAgICBmb3IgKCBteSAkeSA9ICR5MSA7ICR5IDw9ICR5MiA7ICR5KysgKSB7CisgICAgICAgICAgICAgICAgbXkgJGNlbGwgPSAkb1drUy0+e0NlbGxzfVskeV1bJHhdOworCisgICAgICAgICAgICAgICAgbXkgJHZhbHVlOworICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkY2VsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgJHZhbHVlIC49ICRjZWxsLT52YWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJyc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVzaCBAeyAkY2VsbF9kYXRhWyRyb3ddIH0sICR2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRyb3crKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgQ3JlYXRlIHRoZSBDU1Ygb3V0cHV0IHN0cmluZy4KKyAgICBteSAkY3N2ID0gVGV4dDo6Q1NWX1hTLT5uZXcoIHsgYmluYXJ5ID0+IDEsIGVvbCA9PiAkLyB9ICk7CisgICAgbXkgJG91dHB1dCA9ICIiOworCisgICAgZm9yIG15ICRyb3cgKEBjZWxsX2RhdGEpIHsKKyAgICAgICAgJGNzdi0+Y29tYmluZShAJHJvdyk7CisgICAgICAgICRvdXRwdXQgLj0gJGNzdi0+c3RyaW5nKCk7CisgICAgfQorCisgICAgcmV0dXJuICRvdXRwdXQ7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSAtIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkgcXcoRXhjZWxGbXQgRXhjZWxMb2NhbHRpbWUgTG9jYWx0aW1lRXhjZWwpOworCisgICAgIyBDb252ZXJ0IGxvY2FsdGltZSB0byBFeGNlbCB0aW1lCisgICAgbXkgJGRhdGV0aW1lID0gTG9jYWx0aW1lRXhjZWwoMTEsIDEwLCAxMiwgMjMsIDIsIDY0KTsgIyAxOTY0LTMtMjMgMTI6MTA6MTEKKworICAgIHByaW50ICRkYXRldGltZSwgIlxuIjsgIyAyMzQ1OS41MDcwNzE3NTkzIChFeGNlbCBkYXRlL3RpbWUgZm9ybWF0KQorCisgICAgIyBDb252ZXJ0IEV4Y2VsIFRpbWUgdG8gbG9jYWx0aW1lCisgICAgbXkgQHRpbWUgPSBFeGNlbExvY2FsdGltZSgkZGF0ZXRpbWUpOworICAgIHByaW50IGpvaW4oIjoiLCBAdGltZSksICJcbiI7ICAgIyAxMToxMDoxMjoyMzoyOjY0OjE6MAorCisgICAgIyBGb3JtYXR0aW5nCisgICAgcHJpbnQgRXhjZWxGbXQoJ3l5eXktbW0tZGQnLCAkZGF0ZXRpbWUpLCAiXG4iOyAjIDE5NjQtMy0yMworICAgIHByaW50IEV4Y2VsRm10KCdtLWQteXknLCAgICAgJGRhdGV0aW1lKSwgIlxuIjsgIyAzLTIzLTY0CisgICAgcHJpbnQgRXhjZWxGbXQoJyMsIyMwJywgICAgICAkZGF0ZXRpbWUpLCAiXG4iOyAjIDIzLDQ2MAorICAgIHByaW50IEV4Y2VsRm10KCcjLCMjMC4wMCcsICAgJGRhdGV0aW1lKSwgIlxuIjsgIyAyMyw0NTkuNTEKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpVdGlsaXR5PiBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBQYXJzZUV4Y2VsIGFuZCBFeGNlbCBkYXRhLgorCis9aGVhZDEgRnVuY3Rpb25zCisKK0M8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHk+IGNhbiBleHBvcnQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisKKyAgICBFeGNlbEZtdAorICAgIEV4Y2VsTG9jYWx0aW1lCisgICAgTG9jYWx0aW1lRXhjZWwKKyAgICBjb2wyaW50CisgICAgaW50MmNvbAorICAgIHNoZWV0UmVmCisgICAgeGxzMmNzdgorCitUaGVzZSBmdW5jdGlvbnMgbXVzdCBiZSBpbXBvcnRlZCBpbXBsaWNpdGx5OgorCisgICAgIyBKdXN0IG9uZSBmdW5jdGlvbi4KKyAgICB1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkgJ2NvbDJpbnQnOworCisgICAgIyBNb3JlIHRoYW4gb25lLgorICAgIHVzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSBxdyhFeGNlbEZtdCBFeGNlbExvY2FsdGltZSBMb2NhbHRpbWVFeGNlbCk7CisKKworPWhlYWQyIEV4Y2VsRm10KCRmb3JtYXRfc3RyaW5nLCAkbnVtYmVyLCAkaXNfMTkwNCkKKworRXhjZWwgc3RvcmVzIGRhdGEgc3VjaCBhcyBkYXRlcyBhbmQgY3VycmVuY3kgdmFsdWVzIGFzIG51bWJlcnMuIFRoZSB3YXkgdGhlc2UgbnVtYmVycyBhcmUgZGlzcGxheWVkIGlzIGNvbnRyb2xsZWQgYnkgdGhlIG51bWJlciBmb3JtYXQgc3RyaW5nIGZvciB0aGUgY2VsbC4gRm9yIGV4YW1wbGUgYSBjZWxsIHdpdGggYSBudW1iZXIgZm9ybWF0IG9mIEM8JyQjLCMjMC4wMCc+IGZvciBjdXJyZW5jeSBhbmQgYSB2YWx1ZSBvZiAxMjM0LjU2NyB3b3VsZCBiZSBkaXNwbGF5ZWQgYXMgZm9sbG93czoKKworICAgICckIywjIzAuMDAnICsgMTIzNC41NjcgPSAnJDEsMjM0LjU3Jy4KKworVGhlIEM8RXhjZWxGbXQoKT4gZnVuY3Rpb24gdHJpZXMgdG8gZW11bGF0ZSB0aGlzIGZvcm1hdHRpbmcgc28gdGhhdCB0aGUgdXNlciBjYW4gY29udmVydCByYXcgbnVtYmVycyByZXR1cm5lZCBieSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4ZWw+IHRvIGEgZGVzaXJlZCBmb3JtYXQuIEZvciBleGFtcGxlOgorCisgICAgcHJpbnQgRXhjZWxGbXQoJyQjLCMjMC4wMCcsIDEyMzQuNTY3KTsgIyAkMSwyMzQuNTcuCisKK1RoZSBzeW50YXggb2YgdGhlIGZ1bmN0aW9uIGlzOgorCisgICAgbXkgJHRleHQgPSBFeGNlbEZtdCgkZm9ybWF0X3N0cmluZywgJG51bWJlciwgJGlzXzE5MDQpOworCitXaGVyZSBDPCRmb3JtYXRfc3RyaW5nPiBpcyBhbiBFeGNlbCBudW1iZXIgZm9ybWF0IHN0cmluZywgQzwkbnVtYmVyPiBpcyBhIHJlYWwgb3IgaW50ZWdlciBudW1iZXIgYW5kIEM8aXNfMTkwND4gaXMgYW4gb3B0aW9uYWwgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGRhdGVzIHNob3VsZCB1c2UgRXhjZWwncyAxOTA0IGVwb2NoIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMTkwMCBlcG9jaC4KKworQzxFeGNlbEZtdCgpPiBpcyBhbHNvIHVzZWQgaW50ZXJuYWxseSB0byBjb252ZXJ0IG51bWJlcnMgcmV0dXJuZWQgYnkgdGhlIEM8Q2VsbDo6dW5mb3JtYXR0ZWQoKT4gbWV0aG9kIHRvIHRoZSBmb3JtYXR0ZWQgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIEM8Q2VsbDo6dmFsdWUoKT4gbWV0aG9kOgorCisKKyAgICBteSAkY2VsbCA9ICR3b3Jrc2hlZXQtPmdldF9jZWxsKCAwLCAwICk7CisKKyAgICBwcmludCAkY2VsbC0+dW5mb3JtYXR0ZWQoKSwgIlxuIjsgIyAxMjM0LjU2NworICAgIHByaW50ICRjZWxsLT52YWx1ZSgpLCAgICAgICAiXG4iOyAjICQxLDIzNC41NworCitUaGUgbW9zdCBjb21tb24gdXNhZ2UgZm9yIEM8RXhjZWxGbXQ+IGlzIHRvIGNvbnZlcnQgbnVtYmVycyB0byBkYXRlcy4gRGF0ZXMgYW5kIHRpbWVzIGluIEV4Y2VsIGFyZSByZXByZXNlbnRlZCBieSByZWFsIG51bWJlcnMsIGZvciBleGFtcGxlICIxIEphbiAyMDAxIDEyOjMwIFBNIiBpcyByZXByZXNlbnRlZCBieSB0aGUgbnVtYmVyIDM2ODkyLjUyMS4gVGhlIGludGVnZXIgcGFydCBvZiB0aGUgbnVtYmVyIHN0b3JlcyB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGVwb2NoIGFuZCB0aGUgZnJhY3Rpb25hbCBwYXJ0IHN0b3JlcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgZGF5LiBCeSBhcHBseWluZyBhbiBFeGNlbCBudW1iZXIgZm9ybWF0IHRoZSBudW1iZXIgaXMgY29udmVydGVkIHRvIHRoZSBkZXNpcmVkIHN0cmluZyByZXByZXNlbnRhdGlvbjoKKworICAgIHByaW50IEV4Y2VsRm10KCdkIG1tbSB5eXl5IGg6bW0gQU0vUE0nLCAzNjg5Mi41MjEpOyAgIyAxIEphbiAyMDAxIDEyOjMwIFBNCisKK0M8JGlzXzE5MDQ+IGlzIGFuIG9wdGlvbmFsIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBkYXRlcyBzaG91bGQgdXNlIEV4Y2VsJ3MgMTkwNCBlcG9jaCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDE5MDAgZXBvY2guIEV4Y2VsIGZvciBXaW5kb3dzIGdlbmVyYWxseSB1c2VzIDE5MDAgYW5kIEV4Y2VsIGZvciBNYWMgT1MgdXNlcyAxOTA0LiBUaGUgQzwkaXMxOTA0PiBmbGFnIGlzbid0IHJlcXVpcmVkIHZlcnkgb2Z0ZW4gYnkgYSBjYXN1YWwgdXNlciBhbmQgY2FuIHVzdWFsbHkgYmUgaWdub3JlZC4KKworCis9aGVhZDIgRXhjZWxMb2NhbHRpbWUoJGV4Y2VsX2RhdGV0aW1lLCAkaXNfMTkwNCkKKworVGhlIEM8RXhjZWxMb2NhbHRpbWUoKT4gZnVuY3Rpb24gY29udmVydHMgZnJvbSBhbiBFeGNlbCBkYXRlL3RpbWUgbnVtYmVyIHRvIGEgQzxsb2NhbHRpbWUoKT4tbGlrZSBhcnJheSBvZiB2YWx1ZXM6CisKKyAgICAgICAgbXkgQHRpbWUgPSBFeGNlbExvY2FsdGltZSgkZXhjZWxfZGF0ZXRpbWUpOworCisgICAgICAgICMgICAgMCAgICAgMSAgICAgMiAgICAgIDMgICAgIDQgICAgICAgNSAgICAgIDYgICAgICA3CisgICAgICAgIG15ICggJHNlYywgJG1pbiwgJGhvdXIsICRkYXksICRtb250aCwgJHllYXIsICR3ZGF5LCAkbXNlYyApID0gQHRpbWU7CisKK1RoZSBhcnJheSBlbGVtZW50cyBmcm9tIEM8KDAgLi4gNik+IGFyZSB0aGUgc2FtZSBhcyBQZXJsJ3MgQzxsb2NhbHRpbWUoKT4uIFRoZSBsYXN0IGVsZW1lbnQgQzwkbXNlYz4gaXMgbWlsbGlzZWNvbmRzLiBJbiBwYXJ0aWN1bGFyIGl0IHNob3VsZCBiZSBub3RlZCB0aGF0LCBpbiBjb21tb24gd2l0aCBDPGxvY2FsdGltZSgpPiwgdGhlIG1vbnRoIGlzIHplcm8gaW5kZXhlZCBhbmQgdGhlIHllYXIgaXMgdGhlIG51bWJlciBvZiB5ZWFycyBzaW5jZSAxOTAwLiBUaGlzIG1lYW5zIHRoYXQgeW91IHdpbGwgdXN1YWxseSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgICAgJG1vbnRoKys7CisgICAgICAgICR5ZWFyICs9IDE5MDA7CisKK1NlZSBhbHNvIFBlcmwncyBkb2N1bWVudGF0aW9uIGZvciBMPGxvY2FsdGltZSgpfHBlcmxmdW5jPjoKKworVGhlIEM8JGlzXzE5MDQ+IGZsYWcgaXMgYW4gb3B0aW9uYWwuIEl0IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBkYXRlcyBzaG91bGQgdXNlIEV4Y2VsJ3MgMTkwNCBlcG9jaCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDE5MDAgZXBvY2guCisKKz1oZWFkMiBMb2NhbHRpbWVFeGNlbCgkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciwgJHdkYXksICRtc2VjLCAkaXNfMTkwNCkKKworVGhlIEM8TG9jYWx0aW1lRXhjZWwoKT4gZnVuY3Rpb24gY29udmVydHMgZnJvbSBhIEM8bG9jYWx0aW1lKCk+LWxpa2UgYXJyYXkgb2YgdmFsdWVzIHRvIGFuIEV4Y2VsIGRhdGUvdGltZSBudW1iZXI6CisKKyAgICAkZXhjZWxfZGF0ZXRpbWUgPSBMb2NhbHRpbWVFeGNlbCgkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciwgJHdkYXksICRtc2VjKTsKKworVGhlIGFycmF5IGVsZW1lbnRzIGZyb20gQzwoMCAuLiA2KT4gYXJlIHRoZSBzYW1lIGFzIFBlcmwncyBDPGxvY2FsdGltZSgpPi4gVGhlIGxhc3QgZWxlbWVudCBDPCRtc2VjPiBpcyBtaWxsaXNlY29uZHMuIEluIHBhcnRpY3VsYXIgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQsIGluIGNvbW1vbiB3aXRoIEM8bG9jYWx0aW1lKCk+LCB0aGUgbW9udGggaXMgemVybyBpbmRleGVkIGFuZCB0aGUgeWVhciBpcyB0aGUgbnVtYmVyIG9mIHllYXJzIHNpbmNlIDE5MDAuIFNlZSBhbHNvIFBlcmwncyBkb2N1bWVudGF0aW9uIGZvciBMPGxvY2FsdGltZSgpfHBlcmxmdW5jPjoKKworVGhlIEM8JHdkYXk+IGFuZCBDPCRtc2VjPiBlbGVtZW50cyBhcmUgdXN1YWxseSBvcHRpb25hbC4gVGhpcyB0aW1lIGVsZW1lbnRzIGNhbiBhbHNvIGJlIHplcm9lZCBpZiB0aGV5IGFyZW4ndCBvZiBpbnRlcmVzdDoKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZWMsIG1pbiwgaG91ciwgZGF5LCBtb250aCwgeWVhcgorICAgICRleGNlbF9kYXRldGltZSA9IExvY2FsdGltZUV4Y2VsKCAwLCAgIDAsICAgMCwgICAgMSwgICAwLCAgICAgMTAxICk7CisKKyAgICBwcmludCBFeGNlbEZtdCgnZCBtbW0geXl5eScsICRleGNlbF9kYXRldGltZSk7ICAjIDEgSmFuIDIwMDEKKworVGhlIEM8JGlzXzE5MDQ+IGZsYWcgaXMgYWxzbyBvcHRpb25hbC4gSXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGRhdGVzIHNob3VsZCB1c2UgRXhjZWwncyAxOTA0IGVwb2NoIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMTkwMCBlcG9jaC4KKworCis9aGVhZDIgY29sMmludCgkY29sdW1uKQorCitUaGUgQzxjb2wyaW50KCk+IGZ1bmN0aW9uIGNvbnZlcnRzIGFuIEV4Y2VsIGNvbHVtbiBsZXR0ZXIgdG8gYW4gemVyby1pbmRleGVkIGNvbHVtbiBudW1iZXI6CisKKyAgICBwcmludCBjb2wyaW50KCdBJyk7ICAjIDAKKyAgICBwcmludCBjb2wyaW50KCdBQScpOyAjIDI2CisKK1RoaXMgZnVuY3Rpb24gd2FzIGNvbnRyaWJ1dGVkIGJ5IEtldmluIE11bGhvbGxhbmQuCisKKworPWhlYWQyIGludDJjb2woJGNvbHVtbl9udW1iZXIpCisKK1RoZSBDPGludDJjb2woKT4gZnVuY3Rpb24gY29udmVydHMgYW4gemVyby1pbmRleGVkIEV4Y2VsIGNvbHVtbiBudW1iZXIgdG8gYSBjb2x1bW4gbGV0dGVyOgorCisgICAgcHJpbnQgaW50MmNvbCgwKTsgICMgJ0EnCisgICAgcHJpbnQgaW50MmNvbCgyNik7ICMgJ0FBJworCitUaGlzIGZ1bmN0aW9uIHdhcyBjb250cmlidXRlZCBieSBLZXZpbiBNdWxob2xsYW5kLgorCisKKz1oZWFkMiBzaGVldFJlZigkY2VsbF9zdHJpbmcpCisKK1RoZSBDPHNoZWV0UmVmKCk+IGZ1bmN0aW9uIGNvbnZlcnRzIGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluICdBMScgbm90YXRpb24gdG8gYSB6ZXJvLWluZGV4ZWQgQzwocm93LCBjb2wpPiBwYWlyLgorCisgICAgbXkgKCRyb3csICRjb2wpID0gc2hlZXRSZWYoJ0ExJyk7ICMgKCAwLCAwICkKKyAgICBteSAoJHJvdywgJGNvbCkgPSBzaGVldFJlZignQzInKTsgIyAoIDEsIDIgKQorCitUaGlzIGZ1bmN0aW9uIHdhcyBjb250cmlidXRlZCBieSBLZXZpbiBNdWxob2xsYW5kLgorCisKKz1oZWFkMiB4bHMyY3N2KCRmaWxlbmFtZSwgJHJlZ2lvbiwgJHJvdGF0ZSkKKworVGhlIEM8eGxzMmNzdigpPiBmdW5jdGlvbiBjb252ZXJ0cyBhIHNlY3Rpb24gb2YgYW4gRXhjZWwgZmlsZSBpbnRvIGEgQ1NWIHRleHQgc3RyaW5nLgorCisgICAgJGNzdl90ZXh0ID0geGxzMmNzdigkZmlsZW5hbWUsICRyZWdpb24sICRyb3RhdGUpOworCitXaGVyZToKKworICAgICRyZWdpb24gPSAic2hlZXQtY29scm93OmNvbHJvdyIKKyAgICBGb3IgZXhhbXBsZSAnMS1BMTpCMicgbWVhbnMgJ0ExOkIyJyBmb3Igc2hlZXQgMS4KKworICAgIGFuZAorCisgICAgJHJvdGF0ZSAgPSAwIG9yIDEgKG91dHB1dCBpcyByb3RhdGVkL3RyYW5zcG9zZWQgb3Igbm90KQorCitUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIEM8VGV4dDo6Q1NWX1hTPiB0byBiZSBpbnN0YWxsZWQuIEl0IHdhcyBjb250cmlidXRlZCBieSBLZXZpbiBNdWxob2xsYW5kIGFsb25nIHdpdGggdGhlIEM8eGxzMmNzdj4gc2NyaXB0IGluIHRoZSBDPHNhbXBsZT4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK1NlZSBhbHNvIHRoZSBmb2xsb3dpbmcgeGxzMmNzdiB1dGlsaXRpZXM6IEtlbiBQcm93cycgQzx4bHMyY3N2PjogaHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+a2VuL3hsczJjc3Yvc2NyaXB0L3hsczJjc3YgYW5kIEguTWVyaWpuIEJyYW5kJ3MgQzx4bHMyY3N2PiAod2hpY2ggaXMgcGFydCBvZiBTcHJlYWRzaGVldDo6UmVhZCk6IGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfmhtYnJhbmQvU3ByZWFkc2hlZXQtUmVhZC8KKworCis9aGVhZDEgQVVUSE9SCisKK01haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkga3dpdGtuckBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBBcnRpc3RpYyBMaWNlbnNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIFBlcmwgUkVBRE1FIGZpbGUuCisKKz1jdXQKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvV29ya2Jvb2sucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1dvcmtib29rLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTAzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1dvcmtib29rLnBtCkBAIC0wLDAgKzEsMjk3IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3JrYm9vazsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6V29ya2Jvb2sgLSBBIGNsYXNzIGZvciBXb3JrYm9va3MuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjIENvbnN0cnVjdG9yLgorIworc3ViIG5ldyB7CisgICAgbXkgKCRjbGFzcykgPSBAXzsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd29ya3NoZWV0KCkKKyMKKyMgVGhpcyBtZXRob2QgcmV0dXJucyBhIHNpbmdsZSBXb3Jrc2hlZXQgb2JqZWN0IHVzaW5nIGVpdGhlciBpdHMgbmFtZSBvciBpbmRleC4KKyMKK3N1YiB3b3Jrc2hlZXQgeworICAgIG15ICggJG9Cb29rLCAkc05hbWUgKSA9IEBfOworICAgIG15ICRvV2tTOworICAgIGZvcmVhY2ggJG9Xa1MgKCBAeyAkb0Jvb2stPntXb3Jrc2hlZXR9IH0gKSB7CisgICAgICAgIHJldHVybiAkb1drUyBpZiAoICRvV2tTLT57TmFtZX0gZXEgJHNOYW1lICk7CisgICAgfQorICAgIGlmICggJHNOYW1lID1+IC9eXGQrJC8gKSB7CisgICAgICAgIHJldHVybiAkb0Jvb2stPntXb3Jrc2hlZXR9LT5bJHNOYW1lXTsKKyAgICB9CisgICAgcmV0dXJuIHVuZGVmOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdvcmtzaGVldHMoKQorIworIyBSZXR1cm5zIGFuIGFycmF5IG9mV29ya3NoZWV0IG9iamVjdHMuCisjCitzdWIgd29ya3NoZWV0cyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiBAeyAkc2VsZi0+e1dvcmtzaGVldH0gfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3b3Jrc2hlZXRfY291bnQoKQorIworIyBSZXR1cm5zIHRoZSBudW1iZXIgV29rc2hlZXQgb2JqZWN0cyBpbiB0aGUgV29ya2Jvb2suCisjCitzdWIgd29ya3NoZWV0X2NvdW50IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntTaGVldENvdW50fTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfZmlsZW5hbWUoKQorIworIyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBFeGNlbCBmaWxlIG9mIEM8dW5kZWY+IGlmIHRoZSBkYXRhIHdhcyByZWFkIGZyb20gYSBmaWxlaGFuZGxlIHJhdGhlciB0aGFuIGEgZmlsZS4KKyMKK3N1YiBnZXRfZmlsZW5hbWUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e0ZpbGV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9wcmludF9hcmVhcygpCisjCisjIFJldHVybnMgYW4gYXJyYXkgcmVmIG9mIHByaW50IGFyZWFzLgorIworIyBUT0RPLiBUaGlzIHNob3VsZCByZWFsbHkgYmUgYSBXb3Jrc2hlZXQgbWV0aG9kLgorIworc3ViIGdldF9wcmludF9hcmVhcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57UHJpbnRBcmVhfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfcHJpbnRfdGl0bGVzKCkKKyMKKyMgUmV0dXJucyBhbiBhcnJheSByZWYgb2YgcHJpbnQgdGl0bGUgaGFzaCByZWZzLgorIworIyBUT0RPLiBUaGlzIHNob3VsZCByZWFsbHkgYmUgYSBXb3Jrc2hlZXQgbWV0aG9kLgorIworc3ViIGdldF9wcmludF90aXRsZXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e1ByaW50VGl0bGV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHVzaW5nXzE5MDRfZGF0ZSgpCisjCisjIFJldHVybnMgdHJ1ZSBpZiB0aGUgRXhjZWwgZmlsZSBpcyB1c2luZyB0aGUgMTkwNCBkYXRlIGVwb2NoLgorIworc3ViIHVzaW5nXzE5MDRfZGF0ZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57RmxnMTkwNH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUGFyc2VBYm9ydCgpCisjCisjIFRvZG8KKyMKK3N1YiBQYXJzZUFib3J0IHsKKyAgICBteSAoICRzZWxmLCAkdmFsICkgPSBAXzsKKyAgICAkc2VsZi0+e19QYXJzZUFib3J0fSA9ICR2YWw7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUGFyc2UoKS4gRGVwcmVjYXRlZC4KKyMKKyMgU3ludGFjdGljIHdyYXBwZXIgYXJvdW5kIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpQYXJzZSgpLgorIyBUaGlzIG1ldGhvZCBpcyAqZGVwcmVjYXRlZCogc2luY2UgaXQgZG9lc24ndCBjb25mb3JtIHRvIHRoZSB0aGUgY3VycmVudAorIyBlcnJvciBoYW5kbGluZyBpbiB0aGUgUzo6UEUgUGFyc2UoKSBtZXRob2QuCisjCitzdWIgUGFyc2UgeworCisgICAgbXkgKCAkY2xhc3MsICRzb3VyY2UsICRmb3JtYXR0ZXIgKSA9IEBfOworICAgIG15ICRleGNlbCA9IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLT5uZXcoKTsKKyAgICBteSAkd29ya2Jvb2sgPSAkZXhjZWwtPlBhcnNlKCAkc291cmNlLCAkZm9ybWF0dGVyICk7CisgICAgJHdvcmtib29rLT57X0V4Y2VsfSA9ICRleGNlbDsKKyAgICByZXR1cm4gJHdvcmtib29rOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE1hcHBpbmcgYmV0d2VlbiBsZWdhY3kgbWV0aG9kIG5hbWVzIGFuZCBuZXcgbmFtZXMuCisjCit7CisgICAgbm8gd2FybmluZ3M7ICAgICMgSWdub3JlIHdhcm5pbmdzIGFib3V0IHZhcmlhYmxlcyB1c2VkIG9ubHkgb25jZS4KKyAgICAqV29ya3NoZWV0ID0gKndvcmtzaGVldDsKK30KKworMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3JrYm9vayAtIEEgY2xhc3MgZm9yIFdvcmtib29rcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgTDxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbD4uCisKKworPWhlYWQxIE1ldGhvZHMKKworVGhlIGZvbGxvd2luZyBXb3JrYm9vayBtZXRob2RzIGFyZSBhdmFpbGFibGU6CisKKyAgICAkd29ya2Jvb2stPndvcmtzaGVldHMoKQorICAgICR3b3JrYm9vay0+d29ya3NoZWV0KCkKKyAgICAkd29ya2Jvb2stPndvcmtzaGVldF9jb3VudCgpCisgICAgJHdvcmtib29rLT5nZXRfZmlsZW5hbWUoKQorICAgICR3b3JrYm9vay0+Z2V0X3ByaW50X2FyZWFzKCkKKyAgICAkd29ya2Jvb2stPmdldF9wcmludF90aXRsZXMoKQorICAgICR3b3JrYm9vay0+dXNpbmdfMTkwNF9kYXRlKCkKKworCis9aGVhZDIgd29ya3NoZWV0cygpCisKK1RoZSBDPHdvcmtzaGVldHMoKT4gbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgb2YgV29ya3NoZWV0IG9iamVjdHMuIFRoaXMgd2FzIG1vc3QgY29tbW9ubHkgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHdvcmtzaGVldHMgaW4gYSB3b3JrYm9vazoKKworICAgIGZvciBteSAkd29ya3NoZWV0ICggJHdvcmtib29rLT53b3Jrc2hlZXRzKCkgKSB7CisgICAgICAgIC4uLgorICAgIH0KKworCis9aGVhZDIgd29ya3NoZWV0KCkKKworVGhlIEM8d29ya3NoZWV0KCk+IG1ldGhvZCByZXR1cm5zIGEgc2luZ2xlIEM8V29ya3NoZWV0PiBvYmplY3QgdXNpbmcgZWl0aGVyIGl0cyBuYW1lIG9yIGluZGV4OgorCisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+d29ya3NoZWV0KCdTaGVldDEnKTsKKyAgICAkd29ya3NoZWV0ID0gJHdvcmtib29rLT53b3Jrc2hlZXQoMCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlIHNoZWV0IG5hbWUgb3IgaW5kZXggZG9lc24ndCBleGlzdC4KKworCis9aGVhZDIgd29ya3NoZWV0X2NvdW50KCkKKworVGhlIEM8d29ya3NoZWV0X2NvdW50KCk+IG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgV29rc2hlZXQgb2JqZWN0cyBpbiB0aGUgV29ya2Jvb2suCisKKyAgICBteSAkd29ya3NoZWV0X2NvdW50ID0gJHdvcmtib29rLT53b3Jrc2hlZXRfY291bnQoKTsKKworCis9aGVhZDIgZ2V0X2ZpbGVuYW1lKCkKKworVGhlIEM8Z2V0X2ZpbGVuYW1lKCk+IG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBFeGNlbCBmaWxlIG9mIEM8dW5kZWY+IGlmIHRoZSBkYXRhIHdhcyByZWFkIGZyb20gYSBmaWxlaGFuZGxlIHJhdGhlciB0aGFuIGEgZmlsZS4KKworICAgIG15ICRmaWxlbmFtZSA9ICR3b3JrYm9vay0+Z2V0X2ZpbGVuYW1lKCk7CisKKworPWhlYWQyIGdldF9wcmludF9hcmVhcygpCisKK1RoZSBDPGdldF9wcmludF9hcmVhcygpPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSByZWYgb2YgcHJpbnQgYXJlYXMuCisKKyAgICBteSAkcHJpbnRfYXJlYXMgPSAkd29ya2Jvb2stPmdldF9wcmludF9hcmVhcygpOworCitFYWNoIHByaW50IGFyZWEgaXMgYXMgZm9sbG93czoKKworICAgIFsgJHN0YXJ0X3JvdywgJHN0YXJ0X2NvbCwgJGVuZF9yb3csICRlbmRfY29sIF0KKworUmV0dXJucyB1bmRlZiBpZiB0aGVyZSBhcmUgbm8gcHJpbnQgYXJlYXMuCisKKworPWhlYWQyIGdldF9wcmludF90aXRsZXMoKQorCitUaGUgQzxnZXRfcHJpbnRfdGl0bGVzKCk+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHJlZiBvZiBwcmludCB0aXRsZSBoYXNoIHJlZnMuCisKKyAgICBteSAkcHJpbnRfdGl0bGVzID0gJHdvcmtib29rLT5nZXRfcHJpbnRfdGl0bGVzKCk7CisKK0VhY2ggcHJpbnQgdGl0bGUgYXJyYXkgcmVmIGlzIGFzIGZvbGxvd3M6CisKKyAgICB7CisgICAgICAgIFJvdyAgICA9PiBbICRzdGFydF9yb3csICRlbmRfcm93IF0sCisgICAgICAgIENvbHVtbiA9PiBbICRzdGFydF9jb2wsICRlbmRfY29sIF0sCisgICAgfQorCisKK1JldHVybnMgdW5kZWYgaWYgdGhlcmUgYXJlIG5vIHByaW50IHRpdGxlcy4KKworCis9aGVhZDIgdXNpbmdfMTkwNF9kYXRlKCkKKworVGhlIEM8dXNpbmdfMTkwNF9kYXRlKCk+IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIEV4Y2VsIGZpbGUgaXMgdXNpbmcgdGhlIDE5MDQgZGF0ZSBlcG9jaCBpbnN0ZWFkIG9mIHRoZSAxOTAwIGVwb2NoLgorCisgICAgbXkgJHVzaW5nXzE5MDRfZGF0ZSA9ICR3b3JrYm9vay0+dXNpbmdfMTkwNF9kYXRlKCk7CisKKyBUaGUgV2luZG93cyB2ZXJzaW9uIG9mIEV4Y2VsIGdlbmVyYWxseSB1c2VzIHRoZSAxOTAwIGVwb2NoIHdoaWxlIHRoZSBNYWMgdmVyc2lvbiBvZiBFeGNlbCBnZW5lcmFsbHkgdXNlcyB0aGUgMTkwNCBlcG9jaC4KKworUmV0dXJucyAwIGlmIHRoZSAxOTAwIGVwb2NoIGlzIGluIHVzZS4KKworCis9aGVhZDEgQVVUSE9SCisKK01haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkga3dpdGtuckBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBBcnRpc3RpYyBMaWNlbnNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIFBlcmwgUkVBRE1FIGZpbGUuCisKKz1jdXQKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvV29ya3NoZWV0LnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9Xb3Jrc2hlZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkMzJkNwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvV29ya3NoZWV0LnBtCkBAIC0wLDAgKzEsOTU1IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQ7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldCAtIEEgY2xhc3MgZm9yIFdvcmtzaGVldHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBTY2FsYXI6OlV0aWwgcXcod2Vha2VuKTsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCitzdWIgbmV3IHsKKworICAgIG15ICggJGNsYXNzLCAlcHJvcGVydGllcyApID0gQF87CisKKyAgICBteSAkc2VsZiA9IFwlcHJvcGVydGllczsKKworICAgIHdlYWtlbiAkc2VsZi0+e19Cb29rfTsKKworICAgICRzZWxmLT57Q2VsbHN9ICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntEZWZDb2xXaWR0aH0gPSA4LjQzOworCisgICAgcmV0dXJuIGJsZXNzICRzZWxmLCAkY2xhc3M7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2NlbGwoICRyb3csICRjb2wgKQorIworIyBSZXR1cm5zIHRoZSBDZWxsIG9iamVjdCBhdCByb3cgJHJvdyBhbmQgY29sdW1uICRjb2wsIGlmIGRlZmluZWQuCisjCitzdWIgZ2V0X2NlbGwgeworCisgICAgbXkgKCAkc2VsZiwgJHJvdywgJGNvbCApID0gQF87CisKKyAgICBpZiAoICAgIWRlZmluZWQgJHJvdworICAgICAgICB8fCAhZGVmaW5lZCAkY29sCisgICAgICAgIHx8ICFkZWZpbmVkICRzZWxmLT57TWF4Um93fQorICAgICAgICB8fCAhZGVmaW5lZCAkc2VsZi0+e01heENvbH0gKQorICAgIHsKKworICAgICAgICAjIFJldHVybiB1bmRlZiBpZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuIG9yIGlmIG5vIGNlbGxzIGFyZSBkZWZpbmVkLgorICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgfQorICAgIGVsc2lmICgkcm93IDwgJHNlbGYtPntNaW5Sb3d9CisgICAgICAgIHx8ICRyb3cgPiAkc2VsZi0+e01heFJvd30KKyAgICAgICAgfHwgJGNvbCA8ICRzZWxmLT57TWluQ29sfQorICAgICAgICB8fCAkY29sID4gJHNlbGYtPntNYXhDb2x9ICkKKyAgICB7CisKKyAgICAgICAgIyBSZXR1cm4gdW5kZWYgaWYgb3V0c2lkZSBhbGxvd2FibGUgcm93L2NvbCByYW5nZS4KKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAjIFJldHVybiB0aGUgQ2VsbCBvYmplY3QuCisgICAgICAgIHJldHVybiAkc2VsZi0+e0NlbGxzfS0+WyRyb3ddLT5bJGNvbF07CisgICAgfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHJvd19yYW5nZSgpCisjCisjIFJldHVybnMgYSB0d28tZWxlbWVudCBsaXN0ICgkbWluLCAkbWF4KSBjb250YWluaW5nIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtCisjIGRlZmluZWQgcm93cyBpbiB0aGUgd29ya3NoZWV0LgorIworIyBJZiB0aGVyZSBpcyBubyByb3cgZGVmaW5lZCAkbWF4IGlzIHNtYWxsZXIgdGhhbiAkbWluLgorIworc3ViIHJvd19yYW5nZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJG1pbiA9ICRzZWxmLT57TWluUm93fSB8fCAwOworICAgIG15ICRtYXggPSBkZWZpbmVkKCAkc2VsZi0+e01heFJvd30gKSA/ICRzZWxmLT57TWF4Um93fSA6ICggJG1pbiAtIDEgKTsKKworICAgIHJldHVybiAoICRtaW4sICRtYXggKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjb2xfcmFuZ2UoKQorIworIyBSZXR1cm5zIGEgdHdvLWVsZW1lbnQgbGlzdCAoJG1pbiwgJG1heCkgY29udGFpbmluZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bQorIyBkZWZpbmVkIGNvbHMgaW4gdGhlIHdvcmtzaGVldC4KKyMKKyMgSWYgdGhlcmUgaXMgbm8gY29sdW1uIGRlZmluZWQgJG1heCBpcyBzbWFsbGVyIHRoYW4gJG1pbi4KKyMKK3N1YiBjb2xfcmFuZ2UgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRtaW4gPSAkc2VsZi0+e01pbkNvbH0gfHwgMDsKKyAgICBteSAkbWF4ID0gZGVmaW5lZCggJHNlbGYtPntNYXhDb2x9ICkgPyAkc2VsZi0+e01heENvbH0gOiAoICRtaW4gLSAxICk7CisKKyAgICByZXR1cm4gKCAkbWluLCAkbWF4ICk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X25hbWUoKQorIworIyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB3b3Jrc2hlZXQuCisjCitzdWIgZ2V0X25hbWUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e05hbWV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNoZWV0X251bSgpCisjCitzdWIgc2hlZXRfbnVtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntfU2hlZXROb307Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2hfcGFnZWJyZWFrcygpCisjCisjIFJldHVybnMgYW4gYXJyYXkgcmVmIG9mIHJvdyBudW1iZXJzIHdoZXJlIGEgaG9yaXpvbnRhbCBwYWdlIGJyZWFrIG9jY3Vycy4KKyMKK3N1YiBnZXRfaF9wYWdlYnJlYWtzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntIUGFnZUJyZWFrfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfdl9wYWdlYnJlYWtzKCkKKyMKKyMgUmV0dXJucyBhbiBhcnJheSByZWYgb2YgY29sdW1uIG51bWJlcnMgd2hlcmUgYSB2ZXJ0aWNhbCBwYWdlIGJyZWFrIG9jY3Vycy4KKyMKK3N1YiBnZXRfdl9wYWdlYnJlYWtzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntWUGFnZUJyZWFrfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfbWVyZ2VkX2FyZWFzKCkKKyMKKyMgUmV0dXJucyBhbiBhcnJheSByZWYgb2YgY2VsbHMgdGhhdCBhcmUgbWVyZ2VkLgorIworc3ViIGdldF9tZXJnZWRfYXJlYXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e01lcmdlZEFyZWF9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9yb3dfaGVpZ2h0cygpCisjCisjIFJldHVybnMgYW4gYXJyYXlfcmVmIG9mIHJvdyBoZWlnaHRzLgorIworc3ViIGdldF9yb3dfaGVpZ2h0cyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIEB7ICRzZWxmLT57Um93SGVpZ2h0fSB9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9jb2xfd2lkdGhzKCkKKyMKKyMgUmV0dXJucyBhbiBhcnJheV9yZWYgb2YgY29sdW1uIHdpZHRocy4KKyMKK3N1YiBnZXRfY29sX3dpZHRocyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIEB7ICRzZWxmLT57Q29sV2lkdGh9IH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2RlZmF1bHRfcm93X2hlaWdodCgpCisjCisjIFJldHVybnMgdGhlIGRlZmF1bHQgcm93IGhlaWdodCBmb3IgdGhlIHdvcmtzaGVldC4gR2VuZXJhbGx5IDEyLjc1LgorIworc3ViIGdldF9kZWZhdWx0X3Jvd19oZWlnaHQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e0RlZlJvd0hlaWdodH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2RlZmF1bHRfY29sX3dpZHRoKCkKKyMKKyMgUmV0dXJucyB0aGUgZGVmYXVsdCBjb2x1bW4gd2lkdGggZm9yIHRoZSB3b3Jrc2hlZXQuIEdlbmVyYWxseSA4LjQzLgorIworc3ViIGdldF9kZWZhdWx0X2NvbF93aWR0aCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57RGVmQ29sV2lkdGh9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfcm93X3Byb3BlcnRpZXMoKQorIworIyBSZXR1cm5zIGFuIGFycmF5X3JlZiBvZiByb3cgcHJvcGVydGllcy4KKyMgVE9ETy4gVGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBhIGZ1dHVyZSBtZXRob2QuCisjCitzdWIgX2dldF9yb3dfcHJvcGVydGllcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Um93UHJvcGVydGllc307Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2dldF9jb2xfcHJvcGVydGllcygpCisjCisjIFJldHVybnMgYW4gYXJyYXlfcmVmIG9mIGNvbHVtbiBwcm9wZXJ0aWVzLgorIyBUT0RPLiBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGEgZnV0dXJlIG1ldGhvZC4KKyMKK3N1YiBfZ2V0X2NvbF9wcm9wZXJ0aWVzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntDb2xQcm9wZXJ0aWVzfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfaGVhZGVyKCkKKyMKKyMgUmV0dXJucyB0aGUgd29ya3NoZWV0IGhlYWRlciBzdHJpbmcuCisjCitzdWIgZ2V0X2hlYWRlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57SGVhZGVyfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfZm9vdGVyKCkKKyMKKyMgUmV0dXJucyB0aGUgd29ya3NoZWV0IGZvb3RlciBzdHJpbmcuCisjCitzdWIgZ2V0X2Zvb3RlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Rm9vdGVyfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfbWFyZ2luX2xlZnQoKQorIworIyBSZXR1cm5zIHRoZSBsZWZ0IG1hcmdpbiBvZiB0aGUgd29ya3NoZWV0IGluIGluY2hlcy4KKyMKK3N1YiBnZXRfbWFyZ2luX2xlZnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e0xlZnRNYXJnaW59OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9tYXJnaW5fcmlnaHQoKQorIworIyBSZXR1cm5zIHRoZSByaWdodCBtYXJnaW4gb2YgdGhlIHdvcmtzaGVldCBpbiBpbmNoZXMuCisjCitzdWIgZ2V0X21hcmdpbl9yaWdodCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57UmlnaHRNYXJnaW59OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9tYXJnaW5fdG9wKCkKKyMKKyMgUmV0dXJucyB0aGUgdG9wIG1hcmdpbiBvZiB0aGUgd29ya3NoZWV0IGluIGluY2hlcy4KKyMKK3N1YiBnZXRfbWFyZ2luX3RvcCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57VG9wTWFyZ2lufTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfbWFyZ2luX2JvdHRvbSgpCisjCisjIFJldHVybnMgdGhlIGJvdHRvbSBtYXJnaW4gb2YgdGhlIHdvcmtzaGVldCBpbiBpbmNoZXMuCisjCitzdWIgZ2V0X21hcmdpbl9ib3R0b20geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e0JvdHRvbU1hcmdpbn07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X21hcmdpbl9oZWFkZXIoKQorIworIyBSZXR1cm5zIHRoZSBoZWFkZXIgbWFyZ2luIG9mIHRoZSB3b3Jrc2hlZXQgaW4gaW5jaGVzLgorIworc3ViIGdldF9tYXJnaW5faGVhZGVyIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntIZWFkZXJNYXJnaW59OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9tYXJnaW5fZm9vdGVyKCkKKyMKKyMgUmV0dXJucyB0aGUgZm9vdGVyIG1hcmdpbiBvZiB0aGUgd29ya3NoZWV0IGluIGluY2hlcy4KKyMKK3N1YiBnZXRfbWFyZ2luX2Zvb3RlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Rm9vdGVyTWFyZ2lufTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfcGFwZXIoKQorIworIyBSZXR1cm5zIHRoZSBwcmludGVyIHBhcGVyIHNpemUuCisjCitzdWIgZ2V0X3BhcGVyIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntQYXBlclNpemV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9zdGFydF9wYWdlKCkKKyMKKyMgUmV0dXJucyB0aGUgcGFnZSBudW1iZXIgdGhhdCBwcmludGluZyB3aWxsIHN0YXJ0IGZyb20uCisjCitzdWIgZ2V0X3N0YXJ0X3BhZ2UgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgT25seSByZXR1cm4gdGhlIHBhZ2UgbnVtYmVyIGlmIHRoZSAiRmlyc3QgcGFnZSBudW1iZXIiIG9wdGlvbiBpcyBzZXQuCisgICAgaWYgKCAkc2VsZi0+e1VzZVBhZ2V9ICkgeworICAgICAgICByZXR1cm4gJHNlbGYtPntQYWdlU3RhcnR9OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9wcmludF9vcmRlcigpCisjCisjIFJldHVybnMgdGhlIFdvcmtzaGVldCBwYWdlIHByaW50aW5nIG9yZGVyLgorIworc3ViIGdldF9wcmludF9vcmRlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57TGVmdFRvUmlnaHR9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9wcmludF9zY2FsZSgpCisjCisjIFJldHVybnMgdGhlIHdvcmtib29rIHNjYWxlIGZvciBwcmludGluZy4KKyMKK3N1YiBnZXRfcHJpbnRfc2NhbGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e1NjYWxlfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfZml0X3RvX3BhZ2VzKCkKKyMKKyMgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdpZGUgYW5kIGhpZ2ggdGhhdCB0aGUgcHJpbnRlZCB3b3Jrc2hlZXQgcGFnZQorIyB3aWxsIGZpdCB0by4KKyMKK3N1YiBnZXRfZml0X3RvX3BhZ2VzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoICEkc2VsZi0+e1BhZ2VGaXR9ICkgeworICAgICAgICByZXR1cm4gKCAwLCAwICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gKCAkc2VsZi0+e0ZpdFdpZHRofSwgJHNlbGYtPntGaXRIZWlnaHR9ICk7CisgICAgfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGlzX3BvcnRyYWl0KCkKKyMKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgaGFzIGJlZW4gc2V0IGZvciBwcmludGluZyBpbiBwb3J0cmFpdCBtb2RlLgorIworc3ViIGlzX3BvcnRyYWl0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntMYW5kc2NhcGV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGlzX2NlbnRlcmVkX2hvcml6b250YWxseSgpCisjCisjIFJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IGhhcyBiZWVuIGNlbnRlcmVkIGhvcml6b250YWxseSBmb3IgcHJpbnRpbmcuCisjCitzdWIgaXNfY2VudGVyZWRfaG9yaXpvbnRhbGx5IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntIQ2VudGVyfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBpc19jZW50ZXJlZF92ZXJ0aWNhbGx5KCkKKyMKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgaGFzIGJlZW4gY2VudGVyZWQgdmVydGljYWxseSBmb3IgcHJpbnRpbmcuCisjCitzdWIgaXNfY2VudGVyZWRfdmVydGljYWxseSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57SENlbnRlcn07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgaXNfcHJpbnRfZ3JpZGxpbmVzKCkKKyMKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgcHJpbnQgImdyaWRsaW5lcyIgb3B0aW9uIGlzIHR1cm5lZCBvbi4KKyMKK3N1YiBpc19wcmludF9ncmlkbGluZXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e1ByaW50R3JpZH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgaXNfcHJpbnRfcm93X2NvbF9oZWFkZXJzKCkKKyMKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgcHJpbnQgInJvdyBhbmQgY29sdW1uIGhlYWRpbmdzIiBvcHRpb24gaXMgb24uCisjCitzdWIgaXNfcHJpbnRfcm93X2NvbF9oZWFkZXJzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntQcmludEhlYWRlcnN9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGlzX3ByaW50X2JsYWNrX2FuZF93aGl0ZSgpCisjCisjIFJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IHByaW50ICJibGFjayBhbmQgd2hpdGUiIG9wdGlvbiBpcyB0dXJuZWQgb24uCisjCitzdWIgaXNfcHJpbnRfYmxhY2tfYW5kX3doaXRlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntOb0NvbG9yfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBpc19wcmludF9kcmFmdCgpCisjCisjIFJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IHByaW50ICJkcmFmdCIgb3B0aW9uIGlzIHR1cm5lZCBvbi4KKyMKK3N1YiBpc19wcmludF9kcmFmdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57RHJhZnR9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGlzX3ByaW50X2NvbW1lbnRzKCkKKyMKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgcHJpbnQgImNvbW1lbnRzIiBvcHRpb24gaXMgdHVybmVkIG9uLgorIworc3ViIGlzX3ByaW50X2NvbW1lbnRzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntOb3Rlc307Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgTWFwcGluZyBiZXR3ZWVuIGxlZ2FjeSBtZXRob2QgbmFtZXMgYW5kIG5ldyBuYW1lcy4KKyMKK3sKKyAgICBubyB3YXJuaW5nczsgICAgIyBJZ25vcmUgd2FybmluZ3MgYWJvdXQgdmFyaWFibGVzIHVzZWQgb25seSBvbmNlLgorICAgICpzaGVldE5vICA9ICpzaGVldF9udW07CisgICAgKkNlbGwgICAgID0gKmdldF9jZWxsOworICAgICpSb3dSYW5nZSA9ICpyb3dfcmFuZ2U7CisgICAgKkNvbFJhbmdlID0gKmNvbF9yYW5nZTsKK30KKworMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQgLSBBIGNsYXNzIGZvciBXb3Jrc2hlZXRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBMPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsPi4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIE1ldGhvZHMKKworVGhlIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldD4gY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIEV4Y2VsIHdvcmtzaGVldC4gSXQgaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworICAgICR3b3Jrc2hlZXQtPmdldF9jZWxsKCkKKyAgICAkd29ya3NoZWV0LT5yb3dfcmFuZ2UoKQorICAgICR3b3Jrc2hlZXQtPmNvbF9yYW5nZSgpCisgICAgJHdvcmtzaGVldC0+Z2V0X25hbWUoKQorICAgICR3b3Jrc2hlZXQtPmdldF9oX3BhZ2VicmVha3MoKQorICAgICR3b3Jrc2hlZXQtPmdldF92X3BhZ2VicmVha3MoKQorICAgICR3b3Jrc2hlZXQtPmdldF9tZXJnZWRfYXJlYXMoKQorICAgICR3b3Jrc2hlZXQtPmdldF9yb3dfaGVpZ2h0cygpCisgICAgJHdvcmtzaGVldC0+Z2V0X2NvbF93aWR0aHMoKQorICAgICR3b3Jrc2hlZXQtPmdldF9kZWZhdWx0X3Jvd19oZWlnaHQoKQorICAgICR3b3Jrc2hlZXQtPmdldF9kZWZhdWx0X2NvbF93aWR0aCgpCisgICAgJHdvcmtzaGVldC0+Z2V0X2hlYWRlcigpCisgICAgJHdvcmtzaGVldC0+Z2V0X2Zvb3RlcigpCisgICAgJHdvcmtzaGVldC0+Z2V0X21hcmdpbl9sZWZ0KCkKKyAgICAkd29ya3NoZWV0LT5nZXRfbWFyZ2luX3JpZ2h0KCkKKyAgICAkd29ya3NoZWV0LT5nZXRfbWFyZ2luX3RvcCgpCisgICAgJHdvcmtzaGVldC0+Z2V0X21hcmdpbl9ib3R0b20oKQorICAgICR3b3Jrc2hlZXQtPmdldF9tYXJnaW5faGVhZGVyKCkKKyAgICAkd29ya3NoZWV0LT5nZXRfbWFyZ2luX2Zvb3RlcigpCisgICAgJHdvcmtzaGVldC0+Z2V0X3BhcGVyKCkKKyAgICAkd29ya3NoZWV0LT5nZXRfc3RhcnRfcGFnZSgpCisgICAgJHdvcmtzaGVldC0+Z2V0X3ByaW50X29yZGVyKCkKKyAgICAkd29ya3NoZWV0LT5nZXRfcHJpbnRfc2NhbGUoKQorICAgICR3b3Jrc2hlZXQtPmdldF9maXRfdG9fcGFnZXMoKQorICAgICR3b3Jrc2hlZXQtPmlzX3BvcnRyYWl0KCkKKyAgICAkd29ya3NoZWV0LT5pc19jZW50ZXJlZF9ob3Jpem9udGFsbHkoKQorICAgICR3b3Jrc2hlZXQtPmlzX2NlbnRlcmVkX3ZlcnRpY2FsbHkoKQorICAgICR3b3Jrc2hlZXQtPmlzX3ByaW50X2dyaWRsaW5lcygpCisgICAgJHdvcmtzaGVldC0+aXNfcHJpbnRfcm93X2NvbF9oZWFkZXJzKCkKKyAgICAkd29ya3NoZWV0LT5pc19wcmludF9ibGFja19hbmRfd2hpdGUoKQorICAgICR3b3Jrc2hlZXQtPmlzX3ByaW50X2RyYWZ0KCkKKyAgICAkd29ya3NoZWV0LT5pc19wcmludF9jb21tZW50cygpCisKKworPWhlYWQyIGdldF9jZWxsKCRyb3csICRjb2wpCisKK1JldHVybiB0aGUgTDwvQ2VsbD4gb2JqZWN0IGF0IHJvdyBDPCRyb3c+IGFuZCBjb2x1bW4gQzwkY29sPiBpZiBpdCBpcyBkZWZpbmVkLiBPdGhlcndpc2UgcmV0dXJucyB1bmRlZi4KKworICAgIG15ICRjZWxsID0gJHdvcmtzaGVldC0+Z2V0X2NlbGwoJHJvdywgJGNvbCk7CisKKz1oZWFkMiByb3dfcmFuZ2UoKQorCitSZXR1cm5zIGEgdHdvLWVsZW1lbnQgbGlzdCBDPCgkbWluLCAkbWF4KT4gY29udGFpbmluZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkZWZpbmVkIHJvd3MgaW4gdGhlIHdvcmtzaGVldC4gSWYgdGhlcmUgaXMgbm8gcm93IGRlZmluZWQgQzwkbWF4PiBpcyBzbWFsbGVyIHRoYW4gQzwkbWluPi4KKworICAgIG15ICggJHJvd19taW4sICRyb3dfbWF4ICkgPSAkd29ya3NoZWV0LT5yb3dfcmFuZ2UoKTsKKworPWhlYWQyIGNvbF9yYW5nZSgpCisKK1JldHVybnMgYSB0d28tZWxlbWVudCBsaXN0IEM8KCRtaW4sICRtYXgpPiBjb250YWluaW5nIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG9mIGRlZmluZWQgY29sdW1ucyBpbiB0aGUgd29ya3NoZWV0LiBJZiB0aGVyZSBpcyBubyBjb2x1bW4gZGVmaW5lZCBDPCRtYXg+IGlzIHNtYWxsZXIgdGhhbiBDPCRtaW4+LgorCisgICAgbXkgKCAkY29sX21pbiwgJGNvbF9tYXggKSA9ICR3b3Jrc2hlZXQtPmNvbF9yYW5nZSgpOworCisKKz1oZWFkMiBnZXRfbmFtZSgpCisKK1RoZSBDPGdldF9uYW1lKCk+IG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB3b3Jrc2hlZXQuCisKKyAgICBteSAkbmFtZSA9ICR3b3Jrc2hlZXQtPmdldF9uYW1lKCk7CisKKworPWhlYWQyIGdldF9oX3BhZ2VicmVha3MoKQorCitUaGUgQzxnZXRfaF9wYWdlYnJlYWtzKCk+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHJlZiBvZiByb3cgbnVtYmVycyB3aGVyZSBhIGhvcml6b250YWwgcGFnZSBicmVhayBvY2N1cnMuCisKKyAgICBteSAkaF9wYWdlYnJlYWtzID0gJHdvcmtzaGVldC0+Z2V0X2hfcGFnZWJyZWFrcygpOworCitSZXR1cm5zIEM8dW5kZWY+IGlmIHRoZXJlIGFyZSBubyBwYWdlYnJlYWtzLgorCisKKz1oZWFkMiBnZXRfdl9wYWdlYnJlYWtzKCkKKworVGhlIEM8Z2V0X3ZfcGFnZWJyZWFrcygpPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSByZWYgb2YgY29sdW1uIG51bWJlcnMgd2hlcmUgYSB2ZXJ0aWNhbCBwYWdlIGJyZWFrIG9jY3Vycy4KKworICAgIG15ICR2X3BhZ2VicmVha3MgPSAkd29ya3NoZWV0LT5nZXRfdl9wYWdlYnJlYWtzKCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlcmUgYXJlIG5vIHBhZ2VicmVha3MuCisKKworPWhlYWQyIGdldF9tZXJnZWRfYXJlYXMoKQorCitUaGUgQzxnZXRfbWVyZ2VkX2FyZWFzKCk+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHJlZiBvZiBjZWxscyB0aGF0IGFyZSBtZXJnZWQuCisKKyAgICBteSAkbWVyZ2VkX2FyZWFzID0gJHdvcmtzaGVldC0+Z2V0X21lcmdlZF9hcmVhcygpOworCitFYWNoIG1lcmdlZCBhcmVhIGlzIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6CisKKyAgICBbICRzdGFydF9yb3csICRzdGFydF9jb2wsICRlbmRfcm93LCAkZW5kX2NvbF0KKworUmV0dXJucyBDPHVuZGVmPiBpZiB0aGVyZSBhcmUgbm8gbWVyZ2VkIGFyZWFzLgorCisKKz1oZWFkMiBnZXRfcm93X2hlaWdodHMoKQorCitUaGUgQzxnZXRfcm93X2hlaWdodHMoKT4gbWV0aG9kIHJldHVybnMgYW4gYXJyYXlfcmVmIG9mIHJvdyBoZWlnaHRzLgorCisgICAgbXkgJHJvd19oZWlnaHRzID0gJHdvcmtzaGVldC0+Z2V0X3Jvd19oZWlnaHRzKCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlIHByb3BlcnR5IGlzbid0IHNldC4KKworCis9aGVhZDIgZ2V0X2NvbF93aWR0aHMoKQorCitUaGUgQzxnZXRfY29sX3dpZHRocygpPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheV9yZWYgb2YgY29sdW1uIHdpZHRocy4KKworICAgIG15ICRjb2xfd2lkdGhzID0gJHdvcmtzaGVldC0+Z2V0X2NvbF93aWR0aHMoKTsKKworUmV0dXJucyBDPHVuZGVmPiBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBnZXRfZGVmYXVsdF9yb3dfaGVpZ2h0KCkKKworVGhlIEM8Z2V0X2RlZmF1bHRfcm93X2hlaWdodCgpPiBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCByb3cgaGVpZ2h0IGZvciB0aGUgd29ya3NoZWV0LiBHZW5lcmFsbHkgMTIuNzUuCisKKyAgICBteSAkZGVmYXVsdF9yb3dfaGVpZ2h0ID0gJHdvcmtzaGVldC0+Z2V0X2RlZmF1bHRfcm93X2hlaWdodCgpOworCisKKz1oZWFkMiBnZXRfZGVmYXVsdF9jb2xfd2lkdGgoKQorCitUaGUgQzxnZXRfZGVmYXVsdF9jb2xfd2lkdGgoKT4gbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgY29sdW1uIHdpZHRoIGZvciB0aGUgd29ya3NoZWV0LiBHZW5lcmFsbHkgOC40My4KKworICAgIG15ICRkZWZhdWx0X2NvbF93aWR0aCA9ICR3b3Jrc2hlZXQtPmdldF9kZWZhdWx0X2NvbF93aWR0aCgpOworCisKKz1oZWFkMiBnZXRfaGVhZGVyKCkKKworVGhlIEM8Z2V0X2hlYWRlcigpPiBtZXRob2QgcmV0dXJucyB0aGUgd29ya3NoZWV0IGhlYWRlciBzdHJpbmcuIFRoaXMgc3RyaW5nIGNhbiBjb250YWluIGNvbnRyb2wgY29kZXMgZm9yIGFsaWdubWVudCBhbmQgZm9udCBwcm9wZXJ0aWVzLiBSZWZlciB0byB0aGUgRXhjZWwgb24tbGluZSBoZWxwIG9uIGhlYWRlcnMgYW5kIGZvb3RlcnMgb3IgdG8gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24gZm9yIHNldF9oZWFkZXIoKS4KKworICAgIG15ICRoZWFkZXIgPSAkd29ya3NoZWV0LT5nZXRfaGVhZGVyKCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlIHByb3BlcnR5IGlzbid0IHNldC4KKworCis9aGVhZDIgZ2V0X2Zvb3RlcigpCisKK1RoZSBDPGdldF9mb290ZXIoKT4gbWV0aG9kIHJldHVybnMgdGhlIHdvcmtzaGVldCBmb290ZXIgc3RyaW5nLiBUaGlzIHN0cmluZyBjYW4gY29udGFpbiBjb250cm9sIGNvZGVzIGZvciBhbGlnbm1lbnQgYW5kIGZvbnQgcHJvcGVydGllcy4gUmVmZXIgdG8gdGhlIEV4Y2VsIG9uLWxpbmUgaGVscCBvbiBoZWFkZXJzIGFuZCBmb290ZXJzIG9yIHRvIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uIGZvciBzZXRfaGVhZGVyKCkuCisKKyAgICBteSAkZm9vdGVyID0gJHdvcmtzaGVldC0+Z2V0X2Zvb3RlcigpOworCitSZXR1cm5zIEM8dW5kZWY+IGlmIHRoZSBwcm9wZXJ0eSBpc24ndCBzZXQuCisKKworPWhlYWQyIGdldF9tYXJnaW5fbGVmdCgpCisKK1RoZSBDPGdldF9tYXJnaW5fbGVmdCgpPiBtZXRob2QgcmV0dXJucyB0aGUgbGVmdCBtYXJnaW4gb2YgdGhlIHdvcmtzaGVldCBpbiBpbmNoZXMuCisKKyAgICBteSAkbWFyZ2luX2xlZnQgPSAkd29ya3NoZWV0LT5nZXRfbWFyZ2luX2xlZnQoKTsKKworUmV0dXJucyBDPHVuZGVmPiBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBnZXRfbWFyZ2luX3JpZ2h0KCkKKworVGhlIEM8Z2V0X21hcmdpbl9yaWdodCgpPiBtZXRob2QgcmV0dXJucyB0aGUgcmlnaHQgbWFyZ2luIG9mIHRoZSB3b3Jrc2hlZXQgaW4gaW5jaGVzLgorCisgICAgbXkgJG1hcmdpbl9yaWdodCA9ICR3b3Jrc2hlZXQtPmdldF9tYXJnaW5fcmlnaHQoKTsKKworUmV0dXJucyBDPHVuZGVmPiBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBnZXRfbWFyZ2luX3RvcCgpCisKK1RoZSBDPGdldF9tYXJnaW5fdG9wKCk+IG1ldGhvZCByZXR1cm5zIHRoZSB0b3AgbWFyZ2luIG9mIHRoZSB3b3Jrc2hlZXQgaW4gaW5jaGVzLgorCisgICAgbXkgJG1hcmdpbl90b3AgPSAkd29ya3NoZWV0LT5nZXRfbWFyZ2luX3RvcCgpOworCitSZXR1cm5zIEM8dW5kZWY+IGlmIHRoZSBwcm9wZXJ0eSBpc24ndCBzZXQuCisKKworPWhlYWQyIGdldF9tYXJnaW5fYm90dG9tKCkKKworVGhlIEM8Z2V0X21hcmdpbl9ib3R0b20oKT4gbWV0aG9kIHJldHVybnMgdGhlIGJvdHRvbSBtYXJnaW4gb2YgdGhlIHdvcmtzaGVldCBpbiBpbmNoZXMuCisKKyAgICBteSAkbWFyZ2luX2JvdHRvbSA9ICR3b3Jrc2hlZXQtPmdldF9tYXJnaW5fYm90dG9tKCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlIHByb3BlcnR5IGlzbid0IHNldC4KKworCis9aGVhZDIgZ2V0X21hcmdpbl9oZWFkZXIoKQorCitUaGUgQzxnZXRfbWFyZ2luX2hlYWRlcigpPiBtZXRob2QgcmV0dXJucyB0aGUgaGVhZGVyIG1hcmdpbiBvZiB0aGUgd29ya3NoZWV0IGluIGluY2hlcy4KKworICAgIG15ICRtYXJnaW5faGVhZGVyID0gJHdvcmtzaGVldC0+Z2V0X21hcmdpbl9oZWFkZXIoKTsKKworUmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgb2YgMC41IGlmIG5vdCBzZXQuCisKKworPWhlYWQyIGdldF9tYXJnaW5fZm9vdGVyKCkKKworVGhlIEM8Z2V0X21hcmdpbl9mb290ZXIoKT4gbWV0aG9kIHJldHVybnMgdGhlIGZvb3RlciBtYXJnaW4gb2YgdGhlIHdvcmtzaGVldCBpbiBpbmNoZXMuCisKKyAgICBteSAkbWFyZ2luX2Zvb3RlciA9ICR3b3Jrc2hlZXQtPmdldF9tYXJnaW5fZm9vdGVyKCk7CisKK1JldHVybnMgYSBkZWZhdWx0IHZhbHVlIG9mIDAuNSBpZiBub3Qgc2V0LgorCisKKz1oZWFkMiBnZXRfcGFwZXIoKQorCitUaGUgQzxnZXRfcGFwZXIoKT4gbWV0aG9kIHJldHVybnMgdGhlIHByaW50ZXIgcGFwZXIgc2l6ZS4KKworICAgIG15ICRwYXBlciA9ICR3b3Jrc2hlZXQtPmdldF9wYXBlcigpOworCitUaGUgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIGZvcm1hdHMgc2hvd24gYmVsb3c6CisKKyAgICBJbmRleCAgIFBhcGVyIGZvcm1hdCAgICAgICAgICAgIFBhcGVyIHNpemUKKyAgICA9PT09PSAgID09PT09PT09PT09PSAgICAgICAgICAgID09PT09PT09PT0KKyAgICAgIDAgICAgIFByaW50ZXIgZGVmYXVsdCAgICAgICAgIC0KKyAgICAgIDEgICAgIExldHRlciAgICAgICAgICAgICAgICAgIDggMS8yIHggMTEgaW4KKyAgICAgIDIgICAgIExldHRlciBTbWFsbCAgICAgICAgICAgIDggMS8yIHggMTEgaW4KKyAgICAgIDMgICAgIFRhYmxvaWQgICAgICAgICAgICAgICAgIDExIHggMTcgaW4KKyAgICAgIDQgICAgIExlZGdlciAgICAgICAgICAgICAgICAgIDE3IHggMTEgaW4KKyAgICAgIDUgICAgIExlZ2FsICAgICAgICAgICAgICAgICAgIDggMS8yIHggMTQgaW4KKyAgICAgIDYgICAgIFN0YXRlbWVudCAgICAgICAgICAgICAgIDUgMS8yIHggOCAxLzIgaW4KKyAgICAgIDcgICAgIEV4ZWN1dGl2ZSAgICAgICAgICAgICAgIDcgMS80IHggMTAgMS8yIGluCisgICAgICA4ICAgICBBMyAgICAgICAgICAgICAgICAgICAgICAyOTcgeCA0MjAgbW0KKyAgICAgIDkgICAgIEE0ICAgICAgICAgICAgICAgICAgICAgIDIxMCB4IDI5NyBtbQorICAgICAxMCAgICAgQTQgU21hbGwgICAgICAgICAgICAgICAgMjEwIHggMjk3IG1tCisgICAgIDExICAgICBBNSAgICAgICAgICAgICAgICAgICAgICAxNDggeCAyMTAgbW0KKyAgICAgMTIgICAgIEI0ICAgICAgICAgICAgICAgICAgICAgIDI1MCB4IDM1NCBtbQorICAgICAxMyAgICAgQjUgICAgICAgICAgICAgICAgICAgICAgMTgyIHggMjU3IG1tCisgICAgIDE0ICAgICBGb2xpbyAgICAgICAgICAgICAgICAgICA4IDEvMiB4IDEzIGluCisgICAgIDE1ICAgICBRdWFydG8gICAgICAgICAgICAgICAgICAyMTUgeCAyNzUgbW0KKyAgICAgMTYgICAgIC0gICAgICAgICAgICAgICAgICAgICAgIDEweDE0IGluCisgICAgIDE3ICAgICAtICAgICAgICAgICAgICAgICAgICAgICAxMXgxNyBpbgorICAgICAxOCAgICAgTm90ZSAgICAgICAgICAgICAgICAgICAgOCAxLzIgeCAxMSBpbgorICAgICAxOSAgICAgRW52ZWxvcGUgIDkgICAgICAgICAgICAgMyA3LzggeCA4IDcvOAorICAgICAyMCAgICAgRW52ZWxvcGUgMTAgICAgICAgICAgICAgNCAxLzggeCA5IDEvMgorICAgICAyMSAgICAgRW52ZWxvcGUgMTEgICAgICAgICAgICAgNCAxLzIgeCAxMCAzLzgKKyAgICAgMjIgICAgIEVudmVsb3BlIDEyICAgICAgICAgICAgIDQgMy80IHggMTEKKyAgICAgMjMgICAgIEVudmVsb3BlIDE0ICAgICAgICAgICAgIDUgeCAxMSAxLzIKKyAgICAgMjQgICAgIEMgc2l6ZSBzaGVldCAgICAgICAgICAgIC0KKyAgICAgMjUgICAgIEQgc2l6ZSBzaGVldCAgICAgICAgICAgIC0KKyAgICAgMjYgICAgIEUgc2l6ZSBzaGVldCAgICAgICAgICAgIC0KKyAgICAgMjcgICAgIEVudmVsb3BlIERMICAgICAgICAgICAgIDExMCB4IDIyMCBtbQorICAgICAyOCAgICAgRW52ZWxvcGUgQzMgICAgICAgICAgICAgMzI0IHggNDU4IG1tCisgICAgIDI5ICAgICBFbnZlbG9wZSBDNCAgICAgICAgICAgICAyMjkgeCAzMjQgbW0KKyAgICAgMzAgICAgIEVudmVsb3BlIEM1ICAgICAgICAgICAgIDE2MiB4IDIyOSBtbQorICAgICAzMSAgICAgRW52ZWxvcGUgQzYgICAgICAgICAgICAgMTE0IHggMTYyIG1tCisgICAgIDMyICAgICBFbnZlbG9wZSBDNjUgICAgICAgICAgICAxMTQgeCAyMjkgbW0KKyAgICAgMzMgICAgIEVudmVsb3BlIEI0ICAgICAgICAgICAgIDI1MCB4IDM1MyBtbQorICAgICAzNCAgICAgRW52ZWxvcGUgQjUgICAgICAgICAgICAgMTc2IHggMjUwIG1tCisgICAgIDM1ICAgICBFbnZlbG9wZSBCNiAgICAgICAgICAgICAxNzYgeCAxMjUgbW0KKyAgICAgMzYgICAgIEVudmVsb3BlICAgICAgICAgICAgICAgIDExMCB4IDIzMCBtbQorICAgICAzNyAgICAgTW9uYXJjaCAgICAgICAgICAgICAgICAgMy44NzUgeCA3LjUgaW4KKyAgICAgMzggICAgIEVudmVsb3BlICAgICAgICAgICAgICAgIDMgNS84IHggNiAxLzIgaW4KKyAgICAgMzkgICAgIEZhbmZvbGQgICAgICAgICAgICAgICAgIDE0IDcvOCB4IDExIGluCisgICAgIDQwICAgICBHZXJtYW4gU3RkIEZhbmZvbGQgICAgICA4IDEvMiB4IDEyIGluCisgICAgIDQxICAgICBHZXJtYW4gTGVnYWwgRmFuZm9sZCAgICA4IDEvMiB4IDEzIGluCisgICAgIDI1NiAgICBVc2VyIGRlZmluZWQKKworVGhlIHR3byBtb3N0IGNvbW1vbiBwYXBlciBzaXplcyBhcmUgQzwxID0gIlVTIExldHRlciI+IGFuZCBDPDkgPSBBND4uIFJldHVybnMgOSBieSBkZWZhdWx0LgorCisKKz1oZWFkMiBnZXRfc3RhcnRfcGFnZSgpCisKK1RoZSBDPGdldF9zdGFydF9wYWdlKCk+IG1ldGhvZCByZXR1cm5zIHRoZSBwYWdlIG51bWJlciB0aGF0IHByaW50aW5nIHdpbGwgc3RhcnQgZnJvbS4KKworICAgIG15ICRzdGFydF9wYWdlID0gJHdvcmtzaGVldC0+Z2V0X3N0YXJ0X3BhZ2UoKTsKKworUmV0dXJucyAwIGlmIHRoZSBwcm9wZXJ0eSBpc24ndCBzZXQuCisKKworPWhlYWQyIGdldF9wcmludF9vcmRlcigpCisKK1RoZSBDPGdldF9wcmludF9vcmRlcigpPiBtZXRob2QgcmV0dXJucyAwIGlmIHRoZSB3b3Jrc2hlZXQgcHJpbnQgInBhZ2Ugb3JkZXIiIGlzICJEb3duIHRoZW4gb3ZlciIgKHRoZSBkZWZhdWx0KSBvciAxIGlmIGl0IGlzICJPdmVyIHRoZW4gZG93biIuCisKKyAgICBteSAkcHJpbnRfb3JkZXIgPSAkd29ya3NoZWV0LT5nZXRfcHJpbnRfb3JkZXIoKTsKKworCis9aGVhZDIgZ2V0X3ByaW50X3NjYWxlKCkKKworVGhlIEM8Z2V0X3ByaW50X3NjYWxlKCk+IG1ldGhvZCByZXR1cm5zIHRoZSB3b3JrYm9vayBzY2FsZSBmb3IgcHJpbnRpbmcuIFRoZSBwcmludCBzY2FsZSBmY3RvciBjYW4gYmUgaW4gdGhlIHJhbmdlIDEwIC4uIDQwMC4KKworICAgIG15ICRwcmludF9zY2FsZSA9ICR3b3Jrc2hlZXQtPmdldF9wcmludF9zY2FsZSgpOworCitSZXR1cm5zIDEwMCBieSBkZWZhdWx0LgorCisKKz1oZWFkMiBnZXRfZml0X3RvX3BhZ2VzKCkKKworVGhlIEM8Z2V0X2ZpdF90b19wYWdlcygpPiBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdpZGUgYW5kIGhpZ2ggdGhhdCB0aGUgcHJpbnRlZCB3b3Jrc2hlZXQgcGFnZSB3aWxsIGZpdCB0by4KKworICAgIG15ICgkcGFnZXNfd2lkZSwgJHBhZ2VzX2hpZ2gpID0gJHdvcmtzaGVldC0+Z2V0X2ZpdF90b19wYWdlcygpOworCitSZXR1cm5zICgwLCAwKSBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBpc19wb3J0cmFpdCgpCisKK1RoZSBDPGlzX3BvcnRyYWl0KCk+IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHdvcmtzaGVldCBoYXMgYmVlbiBzZXQgZm9yIHByaW50aW5nIGluIHBvcnRyYWl0IG1vZGUuCisKKyAgICBteSAkaXNfcG9ydHJhaXQgPSAkd29ya3NoZWV0LT5pc19wb3J0cmFpdCgpOworCitSZXR1cm5zIDAgaWYgdGhlIHdvcmtzaGVldCBoYXMgYmVlbiBzZXQgZm9yIHByaW50aW5nIGluIGhvcml6b250YWwgbW9kZS4KKworCis9aGVhZDIgaXNfY2VudGVyZWRfaG9yaXpvbnRhbGx5KCkKKworVGhlIEM8aXNfY2VudGVyZWRfaG9yaXpvbnRhbGx5KCk+IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHdvcmtzaGVldCBoYXMgYmVlbiBjZW50ZXJlZCBob3Jpem9udGFsbHkgZm9yIHByaW50aW5nLgorCisgICAgbXkgJGlzX2NlbnRlcmVkX2hvcml6b250YWxseSA9ICR3b3Jrc2hlZXQtPmlzX2NlbnRlcmVkX2hvcml6b250YWxseSgpOworCitSZXR1cm5zIDAgaWYgdGhlIHByb3BlcnR5IGlzbid0IHNldC4KKworCis9aGVhZDIgaXNfY2VudGVyZWRfdmVydGljYWxseSgpCisKK1RoZSBDPGlzX2NlbnRlcmVkX3ZlcnRpY2FsbHkoKT4gbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IGhhcyBiZWVuIGNlbnRlcmVkIHZlcnRpY2FsbHkgZm9yIHByaW50aW5nLgorCisgICAgbXkgJGlzX2NlbnRlcmVkX3ZlcnRpY2FsbHkgPSAkd29ya3NoZWV0LT5pc19jZW50ZXJlZF92ZXJ0aWNhbGx5KCk7CisKK1JldHVybnMgMCBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBpc19wcmludF9ncmlkbGluZXMoKQorCitUaGUgQzxpc19wcmludF9ncmlkbGluZXMoKT4gbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IHByaW50ICJncmlkbGluZXMiIG9wdGlvbiBpcyB0dXJuZWQgb24uCisKKyAgICBteSAkaXNfcHJpbnRfZ3JpZGxpbmVzID0gJHdvcmtzaGVldC0+aXNfcHJpbnRfZ3JpZGxpbmVzKCk7CisKK1JldHVybnMgMCBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBpc19wcmludF9yb3dfY29sX2hlYWRlcnMoKQorCitUaGUgQzxpc19wcmludF9yb3dfY29sX2hlYWRlcnMoKT4gbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IHByaW50ICJyb3cgYW5kIGNvbHVtbiBoZWFkaW5ncyIgb3B0aW9uIGlzIHR1cm5lZCBvbi4KKworICAgIG15ICRpc19wcmludF9yb3dfY29sX2hlYWRlcnMgPSAkd29ya3NoZWV0LT5pc19wcmludF9yb3dfY29sX2hlYWRlcnMoKTsKKworUmV0dXJucyAwIGlmIHRoZSBwcm9wZXJ0eSBpc24ndCBzZXQuCisKKworPWhlYWQyIGlzX3ByaW50X2JsYWNrX2FuZF93aGl0ZSgpCisKK1RoZSBDPGlzX3ByaW50X2JsYWNrX2FuZF93aGl0ZSgpPiBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgcHJpbnQgImJsYWNrIGFuZCB3aGl0ZSIgb3B0aW9uIGlzIHR1cm5lZCBvbi4KKworICAgIG15ICRpc19wcmludF9ibGFja19hbmRfd2hpdGUgPSAkd29ya3NoZWV0LT5pc19wcmludF9ibGFja19hbmRfd2hpdGUoKTsKKworUmV0dXJucyAwIGlmIHRoZSBwcm9wZXJ0eSBpc24ndCBzZXQuCisKKworPWhlYWQyIGlzX3ByaW50X2RyYWZ0KCkKKworVGhlIEM8aXNfcHJpbnRfZHJhZnQoKT4gbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IHByaW50ICJkcmFmdCIgb3B0aW9uIGlzIHR1cm5lZCBvbi4KKworICAgIG15ICRpc19wcmludF9kcmFmdCA9ICR3b3Jrc2hlZXQtPmlzX3ByaW50X2RyYWZ0KCk7CisKK1JldHVybnMgMCBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBpc19wcmludF9jb21tZW50cygpCisKK1RoZSBDPGlzX3ByaW50X2NvbW1lbnRzKCk+IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHdvcmtzaGVldCBwcmludCAiY29tbWVudHMiIG9wdGlvbiBpcyB0dXJuZWQgb24uCisKKyAgICBteSAkaXNfcHJpbnRfY29tbWVudHMgPSAkd29ya3NoZWV0LT5pc19wcmludF9jb21tZW50cygpOworCitSZXR1cm5zIDAgaWYgdGhlIHByb3BlcnR5IGlzbid0IHNldC4KKworCis9aGVhZDEgQVVUSE9SCisKK01haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkga3dpdGtuckBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBBcnRpc3RpYyBMaWNlbnNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIFBlcmwgUkVBRE1FIGZpbGUuCisKKz1jdXQKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZmNkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsLnBtCkBAIC0wLDAgKzEsNTQzNiBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBXcml0ZUV4Y2VsLgorIworIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCAtIFdyaXRlIHRvIGEgY3Jvc3MtcGxhdGZvcm0gRXhjZWwgYmluYXJ5IGZpbGUuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3JrYm9vazsKKworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3JrYm9vayBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOyAjIFRoZSBMaWZlIFB1cnN1aXQKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMgQ29uc3RydWN0b3IuIFdyYXBwZXIgZm9yIGEgV29ya2Jvb2sgb2JqZWN0LgorIyB1c2VzOiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlcgorIyAgICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQKKyMgICAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6Ok9MRXdyaXRlcgorIyAgICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya2Jvb2sKKyMgICAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldAorIyAgICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0CisjICAgICAgIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtdWxhCisjICAgICAgIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpQcm9wZXJ0aWVzCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3JrYm9vay0+bmV3KEBfKTsKKworICAgICMgQ2hlY2sgZm9yIGZpbGUgY3JlYXRpb24gZmFpbHVyZXMgYmVmb3JlIHJlLWJsZXNzaW5nCisgICAgYmxlc3MgICRzZWxmLCAkY2xhc3MgaWYgZGVmaW5lZCAkc2VsZjsKKworICAgIHJldHVybiAkc2VsZjsKK30KKworCisxOworCisKK19fRU5EX18KKworCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIC0gV3JpdGUgdG8gYSBjcm9zcy1wbGF0Zm9ybSBFeGNlbCBiaW5hcnkgZmlsZS4KKworPWhlYWQxIFZFUlNJT04KKworVGhpcyBkb2N1bWVudCByZWZlcnMgdG8gdmVyc2lvbiAyLjM3IG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLCByZWxlYXNlZCBGZWJydWFyeSAyLCAyMDEwLgorCisKKworCis9aGVhZDEgU1lOT1BTSVMKKworVG8gd3JpdGUgYSBzdHJpbmcsIGEgZm9ybWF0dGVkIHN0cmluZywgYSBudW1iZXIgYW5kIGEgZm9ybXVsYSB0byB0aGUgZmlyc3Qgd29ya3NoZWV0IGluIGFuIEV4Y2VsIHdvcmtib29rIGNhbGxlZCBwZXJsLnhsczoKKworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgICMgQ3JlYXRlIGEgbmV3IEV4Y2VsIHdvcmtib29rCisgICAgbXkgJHdvcmtib29rID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygncGVybC54bHMnKTsKKworICAgICMgQWRkIGEgd29ya3NoZWV0CisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgIyAgQWRkIGFuZCBkZWZpbmUgYSBmb3JtYXQKKyAgICAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7ICMgQWRkIGEgZm9ybWF0CisgICAgJGZvcm1hdC0+c2V0X2JvbGQoKTsKKyAgICAkZm9ybWF0LT5zZXRfY29sb3IoJ3JlZCcpOworICAgICRmb3JtYXQtPnNldF9hbGlnbignY2VudGVyJyk7CisKKyAgICAjIFdyaXRlIGEgZm9ybWF0dGVkIGFuZCB1bmZvcm1hdHRlZCBzdHJpbmcsIHJvdyBhbmQgY29sdW1uIG5vdGF0aW9uLgorICAgICRjb2wgPSAkcm93ID0gMDsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAkY29sLCAnSGkgRXhjZWwhJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgICAgJGNvbCwgJ0hpIEV4Y2VsIScpOworCisgICAgIyBXcml0ZSBhIG51bWJlciBhbmQgYSBmb3JtdWxhIHVzaW5nIEExIG5vdGF0aW9uCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgMS4yMzQ1KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTQnLCAnPVNJTihQSSgpLzQpJyk7CisKKworCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgUGVybCBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgY3Jvc3MtcGxhdGZvcm0gRXhjZWwgYmluYXJ5IGZpbGUuIE11bHRpcGxlIHdvcmtzaGVldHMgY2FuIGJlIGFkZGVkIHRvIGEgd29ya2Jvb2sgYW5kIGZvcm1hdHRpbmcgY2FuIGJlIGFwcGxpZWQgdG8gY2VsbHMuIFRleHQsIG51bWJlcnMsIGZvcm11bGFzLCBoeXBlcmxpbmtzLCBpbWFnZXMgYW5kIGNoYXJ0cyBjYW4gYmUgd3JpdHRlbiB0byB0aGUgY2VsbHMuCisKK1RoZSBmaWxlIHByb2R1Y2VkIGJ5IHRoaXMgbW9kdWxlIGlzIGNvbXBhdGlibGUgd2l0aCBFeGNlbCA5NywgMjAwMCwgMjAwMiwgMjAwMyBhbmQgMjAwNy4KKworVGhlIG1vZHVsZSB3aWxsIHdvcmsgb24gdGhlIG1ham9yaXR5IG9mIFdpbmRvd3MsIFVOSVggYW5kIE1hYyBwbGF0Zm9ybXMuIEdlbmVyYXRlZCBmaWxlcyBhcmUgYWxzbyBjb21wYXRpYmxlIHdpdGggdGhlIExpbnV4L1VOSVggc3ByZWFkc2hlZXQgYXBwbGljYXRpb25zIEdudW1lcmljIGFuZCBPcGVuT2ZmaWNlLm9yZy4KKworVGhpcyBtb2R1bGUgY2Fubm90IGJlIHVzZWQgdG8gd3JpdGUgdG8gYW4gZXhpc3RpbmcgRXhjZWwgZmlsZSAoU2VlIEw8TU9ESUZZSU5HIEFORCBSRVdSSVRJTkcgRVhDRUwgRklMRVM+KS4KKworCisKKworPWhlYWQxIFFVSUNLIFNUQVJUCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRyaWVzIHRvIHByb3ZpZGUgYW4gaW50ZXJmYWNlIHRvIGFzIG1hbnkgb2YgRXhjZWwncyBmZWF0dXJlcyBhcyBwb3NzaWJsZS4gQXMgYSByZXN1bHQgdGhlcmUgaXMgYSBsb3Qgb2YgZG9jdW1lbnRhdGlvbiB0byBhY2NvbXBhbnkgdGhlIGludGVyZmFjZSBhbmQgaXQgY2FuIGJlIGRpZmZpY3VsdCBhdCBmaXJzdCBnbGFuY2UgdG8gc2VlIHdoYXQgaXQgaW1wb3J0YW50IGFuZCB3aGF0IGlzIG5vdC4gU28gZm9yIHRob3NlIG9mIHlvdSB3aG8gcHJlZmVyIHRvIGFzc2VtYmxlIElrZWEgZnVybml0dXJlIGZpcnN0IGFuZCB0aGVuIHJlYWQgdGhlIGluc3RydWN0aW9ucywgaGVyZSBhcmUgdGhyZWUgZWFzeSBzdGVwczoKKworMS4gQ3JlYXRlIGEgbmV3IEV4Y2VsIEk8d29ya2Jvb2s+IChpLmUuIGZpbGUpIHVzaW5nIEM8bmV3KCk+LgorCisyLiBBZGQgYSBJPHdvcmtzaGVldD4gdG8gdGhlIG5ldyB3b3JrYm9vayB1c2luZyBDPGFkZF93b3Jrc2hlZXQoKT4uCisKKzMuIFdyaXRlIHRvIHRoZSB3b3Jrc2hlZXQgdXNpbmcgQzx3cml0ZSgpPi4KKworTGlrZSB0aGlzOgorCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDAKKworICAgIG15ICR3b3JrYm9vayA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ3BlcmwueGxzJyk7ICMgU3RlcCAxCisgICAgJHdvcmtzaGVldCAgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7ICAgICAgICAgICAgICAgIyBTdGVwIDIKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnSGkgRXhjZWwhJyk7ICAgICAgICAgICAgICAgICAgICAjIFN0ZXAgMworCitUaGlzIHdpbGwgY3JlYXRlIGFuIEV4Y2VsIGZpbGUgY2FsbGVkIEM8cGVybC54bHM+IHdpdGggYSBzaW5nbGUgd29ya3NoZWV0IGFuZCB0aGUgdGV4dCBDPCdIaSBFeGNlbCEnPiBpbiB0aGUgcmVsZXZhbnQgY2VsbC4gQW5kIHRoYXQncyBpdC4gT2theSwgc28gdGhlcmUgaXMgYWN0dWFsbHkgYSB6ZXJvdGggc3RlcCBhcyB3ZWxsLCBidXQgQzx1c2UgbW9kdWxlPiBnb2VzIHdpdGhvdXQgc2F5aW5nLiBUaGVyZSBhcmUgYWxzbyBtb3JlIHRoYW4gODAgZXhhbXBsZXMgdGhhdCBjb21lIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiBhbmQgd2hpY2ggeW91IGNhbiB1c2UgdG8gZ2V0IHlvdSBzdGFydGVkLiBTZWUgTDxFWEFNUExFUz4uCisKK1Rob3NlIG9mIHlvdSB3aG8gcmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGZpcnN0IGFuZCBhc3NlbWJsZSB0aGUgZnVybml0dXJlIGFmdGVyd2FyZHMgd2lsbCBrbm93IGhvdyB0byBwcm9jZWVkLiA7LSkKKworCisKKworPWhlYWQxIFdPUktCT09LIE1FVEhPRFMKKworVGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSBwcm92aWRlcyBhbiBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlIHRvIGEgbmV3IEV4Y2VsIHdvcmtib29rLiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0aHJvdWdoIGEgbmV3IHdvcmtib29rLgorCisgICAgbmV3KCkKKyAgICBhZGRfd29ya3NoZWV0KCkKKyAgICBhZGRfZm9ybWF0KCkKKyAgICBhZGRfY2hhcnQoKQorICAgIGFkZF9jaGFydF9leHQoKQorICAgIGNsb3NlKCkKKyAgICBjb21wYXRpYmlsaXR5X21vZGUoKQorICAgIHNldF9wcm9wZXJ0aWVzKCkKKyAgICBkZWZpbmVfbmFtZSgpCisgICAgc2V0X3RlbXBkaXIoKQorICAgIHNldF9jdXN0b21fY29sb3IoKQorICAgIHNoZWV0cygpCisgICAgc2V0XzE5MDQoKQorICAgIHNldF9jb2RlcGFnZSgpCisKK0lmIHlvdSBhcmUgdW5mYW1pbGlhciB3aXRoIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2VzIG9yIHRoZSB3YXkgdGhhdCB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpbiBQZXJsIGhhdmUgYSBsb29rIGF0IEM8cGVybG9iaj4gYW5kIEM8cGVybHRvb3Q+IGluIHRoZSBtYWluIFBlcmwgZG9jdW1lbnRhdGlvbi4KKworCisKKworPWhlYWQyIG5ldygpCisKK0EgbmV3IEV4Y2VsIHdvcmtib29rIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIEM8bmV3KCk+IGNvbnN0cnVjdG9yIHdoaWNoIGFjY2VwdHMgZWl0aGVyIGEgZmlsZW5hbWUgb3IgYSBmaWxlaGFuZGxlIGFzIGEgcGFyYW1ldGVyLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhIG5ldyBFeGNlbCBmaWxlIGJhc2VkIG9uIGEgZmlsZW5hbWU6CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZmlsZW5hbWUueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdIaSBFeGNlbCEnKTsKKworSGVyZSBhcmUgc29tZSBvdGhlciBleGFtcGxlcyBvZiB1c2luZyBDPG5ldygpPiB3aXRoIGZpbGVuYW1lczoKKworICAgIG15ICR3b3JrYm9vazEgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCRmaWxlbmFtZSk7CisgICAgbXkgJHdvcmtib29rMiA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJy90bXAvZmlsZW5hbWUueGxzJyk7CisgICAgbXkgJHdvcmtib29rMyA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImM6XFx0bXBcXGZpbGVuYW1lLnhscyIpOworICAgIG15ICR3b3JrYm9vazQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdjOlx0bXBcZmlsZW5hbWUueGxzJyk7CisKK1RoZSBsYXN0IHR3byBleGFtcGxlcyBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBhIGZpbGUgb24gRE9TIG9yIFdpbmRvd3Mgd2hlcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGVpdGhlciBlc2NhcGUgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IgQzxcPiBvciB0byB1c2Ugc2luZ2xlIHF1b3RlcyB0byBlbnN1cmUgdGhhdCBpdCBpc24ndCBpbnRlcnBvbGF0ZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uICBzZWUgQzxwZXJsZmFxNTogV2h5IGNhbid0IEkgdXNlICJDOlx0ZW1wXGZvbyIgaW4gRE9TIHBhdGhzPz4uCisKK1RoZSBDPG5ldygpPiBjb25zdHJ1Y3RvciByZXR1cm5zIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgb2JqZWN0IHRoYXQgeW91IGNhbiB1c2UgdG8gYWRkIHdvcmtzaGVldHMgYW5kIHN0b3JlIGRhdGEuIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGFsdGhvdWdoIEM8bXk+IGlzIG5vdCBzcGVjaWZpY2FsbHkgcmVxdWlyZWQgaXQgZGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIG5ldyB3b3JrYm9vayB2YXJpYWJsZSBhbmQsIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcywgZW5zdXJlcyB0aGF0IHRoZSB3b3JrYm9vayBpcyBjbG9zZWQgcHJvcGVybHkgd2l0aG91dCBleHBsaWNpdGx5IGNhbGxpbmcgdGhlIEM8Y2xvc2UoKT4gbWV0aG9kLgorCitJZiB0aGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgZHVlIHRvIGZpbGUgcGVybWlzc2lvbnMgb3Igc29tZSBvdGhlciByZWFzb24sICBDPG5ldz4gd2lsbCByZXR1cm4gQzx1bmRlZj4uIFRoZXJlZm9yZSwgaXQgaXMgZ29vZCBwcmFjdGljZSB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIEM8bmV3PiBiZWZvcmUgcHJvY2VlZGluZy4gQXMgdXN1YWwgdGhlIFBlcmwgdmFyaWFibGUgQzwkIT4gd2lsbCBiZSBzZXQgaWYgdGhlcmUgaXMgYSBmaWxlIGNyZWF0aW9uIGVycm9yLiBZb3Ugd2lsbCBhbHNvIHNlZSBvbmUgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgZGV0YWlsZWQgaW4gTDxESUFHTk9TVElDUz46CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygncHJvdGVjdGVkLnhscycpOworICAgIGRpZSAiUHJvYmxlbXMgY3JlYXRpbmcgbmV3IEV4Y2VsIGZpbGU6ICQhIiB1bmxlc3MgZGVmaW5lZCAkd29ya2Jvb2s7CisKK1lvdSBjYW4gYWxzbyBwYXNzIGEgdmFsaWQgZmlsZWhhbmRsZSB0byB0aGUgQzxuZXcoKT4gY29uc3RydWN0b3IuIEZvciBleGFtcGxlIGluIGEgQ0dJIHByb2dyYW0geW91IGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6CisKKyAgICBiaW5tb2RlKFNURE9VVCk7CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoXCpTVERPVVQpOworCitUaGUgcmVxdWlyZW1lbnQgZm9yIEM8YmlubW9kZSgpPiBpcyBleHBsYWluZWQgYmVsb3cuCisKK0ZvciBDR0kgcHJvZ3JhbXMgeW91IGNhbiBhbHNvIHVzZSB0aGUgc3BlY2lhbCBQZXJsIGZpbGVuYW1lIEM8Jy0nPiB3aGljaCB3aWxsIHJlZGlyZWN0IHRoZSBvdXRwdXQgdG8gU1RET1VUOgorCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJy0nKTsKKworU2VlIGFsc28sIHRoZSBDPGNnaS5wbD4gcHJvZ3JhbSBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK0hvd2V2ZXIsIHRoaXMgc3BlY2lhbCBjYXNlIHdpbGwgbm90IHdvcmsgaW4gQzxtb2RfcGVybD4gcHJvZ3JhbXMgd2hlcmUgeW91IHdpbGwgaGF2ZSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgorCisgICAgIyBtb2RfcGVybCAxCisgICAgLi4uCisgICAgdGllICpYTFMsICdBcGFjaGUnOworICAgIGJpbm1vZGUoWExTKTsKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyhcKlhMUyk7CisgICAgLi4uCisKKyAgICAjIG1vZF9wZXJsIDIKKyAgICAuLi4KKyAgICB0aWUgKlhMUyA9PiAkcjsgICMgVGllIHRvIHRoZSBBcGFjaGU6OlJlcXVlc3RSZWMgb2JqZWN0CisgICAgYmlubW9kZSgqWExTKTsKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyhcKlhMUyk7CisgICAgLi4uCisKK1NlZSBhbHNvLCB0aGUgQzxtb2RfcGVybDEucGw+IGFuZCBDPG1vZF9wZXJsMi5wbD4gcHJvZ3JhbXMgaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCitGaWxlaGFuZGxlcyBjYW4gYWxzbyBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gc3RyZWFtIGFuIEV4Y2VsIGZpbGUgb3ZlciBhIHNvY2tldCBvciBpZiB5b3Ugd2FudCB0byBzdG9yZSBhbiBFeGNlbCBmaWxlIGluIGEgc2NhbGFyLgorCitGb3IgZXhhbXBsZSBoZXJlIGlzIGEgd2F5IHRvIHdyaXRlIGFuIEV4Y2VsIGZpbGUgdG8gYSBzY2FsYXIgd2l0aCBDPHBlcmwgNS44PjoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICAjIFJlcXVpcmVzIHBlcmwgNS44IG9yIGxhdGVyCisgICAgb3BlbiBteSAkZmgsICc+JywgXG15ICRzdHIgb3IgZGllICJGYWlsZWQgdG8gb3BlbiBmaWxlaGFuZGxlOiAkISI7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygkZmgpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICAnSGkgRXhjZWwhJyk7CisKKyAgICAkd29ya2Jvb2stPmNsb3NlKCk7CisKKyAgICAjIFRoZSBFeGNlbCBmaWxlIGluIG5vdyBpbiAkc3RyLiBSZW1lbWJlciB0byBiaW5tb2RlKCkgdGhlIG91dHB1dAorICAgICMgZmlsZWhhbmRsZSBiZWZvcmUgcHJpbnRpbmcgaXQuCisgICAgYmlubW9kZSBTVERPVVQ7CisgICAgcHJpbnQgJHN0cjsKKworU2VlIGFsc28gdGhlIEM8d3JpdGVfdG9fc2NhbGFyLnBsPiBhbmQgQzxmaWxlaGFuZGxlLnBsPiBwcm9ncmFtcyBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK0I8Tm90ZSBhYm91dCB0aGUgcmVxdWlyZW1lbnQgZm9yPiBDPGJpbm1vZGUoKT4uIEFuIEV4Y2VsIGZpbGUgaXMgY29tcHJpc2VkIG9mIGJpbmFyeSBkYXRhLiBUaGVyZWZvcmUsIGlmIHlvdSBhcmUgdXNpbmcgYSBmaWxlaGFuZGxlIHlvdSBzaG91bGQgZW5zdXJlIHRoYXQgeW91IEM8YmlubW9kZSgpPiBpdCBwcmlvciB0byBwYXNzaW5nIGl0IHRvIEM8bmV3KCk+LllvdSBzaG91bGQgZG8gdGhpcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgeW91IGFyZSBvbiBhIFdpbmRvd3MgcGxhdGZvcm0gb3Igbm90LiBUaGlzIGFwcGxpZXMgZXNwZWNpYWxseSB0byB1c2VycyBvZiBwZXJsIDUuOCBvbiBzeXN0ZW1zIHdoZXJlIEM8VVRGLTg+IGlzIGxpa2VseSB0byBiZSBpbiBvcGVyYXRpb24gc3VjaCBhcyBSZWRIYXQgTGludXggOS4gSWYgeW91ciBwcm9ncmFtLCBlaXRoZXIgaW50ZW50aW9uYWxseSBvciBub3QsIHdyaXRlcyBDPFVURi04PiBkYXRhIHRvIGEgZmlsZWhhbmRsZSB0aGF0IGlzIHBhc3NlZCB0byBDPG5ldygpPiBpdCB3aWxsIGNvcnJ1cHQgdGhlIEV4Y2VsIGZpbGUgdGhhdCBpcyBjcmVhdGVkLgorCitZb3UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBDPGJpbm1vZGUoKT4gaWYgeW91IGFyZSB1c2luZyBmaWxlbmFtZXMgaW5zdGVhZCBvZiBmaWxlaGFuZGxlcy4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgcGVyZm9ybXMgdGhlIEM8YmlubW9kZSgpPiBpbnRlcm5hbGx5IHdoZW4gaXQgY29udmVydHMgdGhlIGZpbGVuYW1lIHRvIGEgZmlsZWhhbmRsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQzxiaW5tb2RlKCk+IHNlZSBDPHBlcmxmdW5jPiBhbmQgQzxwZXJsb3BlbnR1dD4gaW4gdGhlIG1haW4gUGVybCBkb2N1bWVudGF0aW9uLgorCisKKworCisKKz1oZWFkMiBhZGRfd29ya3NoZWV0KCRzaGVldG5hbWUsICR1dGZfMTZfYmUpCisKK0F0IGxlYXN0IG9uZSB3b3Jrc2hlZXQgc2hvdWxkIGJlIGFkZGVkIHRvIGEgbmV3IHdvcmtib29rLiBBIHdvcmtzaGVldCBpcyB1c2VkIHRvIHdyaXRlIGRhdGEgaW50byBjZWxsczoKKworICAgICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7ICAgICAgICAgICAjIFNoZWV0MQorICAgICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdGb2dsaW8yJyk7ICAjIEZvZ2xpbzIKKyAgICAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRGF0YScpOyAgICAgIyBEYXRhCisgICAgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsgICAgICAgICAgICMgU2hlZXQ0CisKK0lmIEM8JHNoZWV0bmFtZT4gaXMgbm90IHNwZWNpZmllZCB0aGUgZGVmYXVsdCBFeGNlbCBjb252ZW50aW9uIHdpbGwgYmUgZm9sbG93ZWQsIGkuZS4gU2hlZXQxLCBTaGVldDIsIGV0Yy4gVGhlIEM8JHV0Zl8xNl9iZT4gcGFyYW1ldGVyIGlzIG9wdGlvbmFsLCBzZWUgYmVsb3cuCisKK1RoZSB3b3Jrc2hlZXQgbmFtZSBtdXN0IGJlIGEgdmFsaWQgRXhjZWwgd29ya3NoZWV0IG5hbWUsIGkuZS4gaXQgY2Fubm90IGNvbnRhaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycywgQzxbIF0gOiAqID8gLyBcPiBhbmQgaXQgbXVzdCBiZSBsZXNzIHRoYW4gMzIgY2hhcmFjdGVycy4gSW4gYWRkaXRpb24sIHlvdSBjYW5ub3QgdXNlIHRoZSBzYW1lLCBjYXNlIGluc2Vuc2l0aXZlLCBDPCRzaGVldG5hbWU+IGZvciBtb3JlIHRoYW4gb25lIHdvcmtzaGVldC4KKworT24gc3lzdGVtcyB3aXRoIEM8cGVybCA1Ljg+IGFuZCBsYXRlciB0aGUgQzxhZGRfd29ya3NoZWV0KCk+IG1ldGhvZCB3aWxsIGFsc28gaGFuZGxlIHN0cmluZ3MgaW4gQzxVVEYtOD4gZm9ybWF0LgorCisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgiXHh7MjYzYX0iKTsgIyBTbWlsZXkKKworT24gZWFybGllciBQZXJsIHN5c3RlbXMgeW91ciBjYW4gc3BlY2lmeSBDPFVURi0xNkJFPiB3b3Jrc2hlZXQgbmFtZXMgdXNpbmcgYW4gYWRkaXRpb25hbCBvcHRpb25hbCBwYXJhbWV0ZXI6CisKKyAgICBteSAkbmFtZSA9IHBhY2sgJ24nLCAweDI2M2E7CisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgkbmFtZSwgMSk7ICAgIyBTbWlsZXkKKworCisKKworPWhlYWQyIGFkZF9mb3JtYXQoJXByb3BlcnRpZXMpCisKK1RoZSBDPGFkZF9mb3JtYXQoKT4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgRm9ybWF0IG9iamVjdHMgd2hpY2ggYXJlIHVzZWQgdG8gYXBwbHkgZm9ybWF0dGluZyB0byBhIGNlbGwuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSB0aGUgcHJvcGVydGllcyBhdCBjcmVhdGlvbiB0aW1lIHZpYSBhIGhhc2ggb2YgcHJvcGVydHkgdmFsdWVzIG9yIGxhdGVyIHZpYSBtZXRob2QgY2FsbHMuCisKKyAgICAkZm9ybWF0MSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCglcHJvcHMpOyAjIFNldCBwcm9wZXJ0aWVzIGF0IGNyZWF0aW9uCisgICAgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsgICAgICAgIyBTZXQgcHJvcGVydGllcyBsYXRlcgorCitTZWUgdGhlIEw8Q0VMTCBGT1JNQVRUSU5HPiBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgRm9ybWF0IHByb3BlcnRpZXMgYW5kIGhvdyB0byBzZXQgdGhlbS4KKworCisKKworPWhlYWQyIGFkZF9jaGFydCglcHJvcGVydGllcykKKworVGhpcyBtZXRob2QgaXMgdXNlIHRvIGNyZWF0ZSBhIG5ldyBjaGFydCBlaXRoZXIgYXMgYSBzdGFuZGFsb25lIHdvcmtzaGVldCAodGhlIGRlZmF1bHQpIG9yIGFzIGFuIGVtYmVkZGFibGUgb2JqZWN0IHRoYXQgY2FuIGJlIGluc2VydGVkIGludG8gYSB3b3Jrc2hlZXQgdmlhIHRoZSBDPGluc2VydF9jaGFydCgpPiBXb3Jrc2hlZXQgbWV0aG9kLgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicgKTsKKworVGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IGFyZToKKworICAgIHR5cGUgICAgIChyZXF1aXJlZCkKKyAgICBuYW1lICAgICAob3B0aW9uYWwpCisgICAgZW1iZWRkZWQgKG9wdGlvbmFsKQorCis9b3ZlcgorCis9aXRlbSAqIEM8dHlwZT4KKworVGhpcyBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlci4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBjaGFydCB0aGF0IHdpbGwgYmUgY3JlYXRlZC4KKworICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdsaW5lJyApOworCitUaGUgYXZhaWxhYmxlIHR5cGVzIGFyZToKKworICAgIGFyZWEKKyAgICBiYXIKKyAgICBjb2x1bW4KKyAgICBsaW5lCisgICAgcGllCisgICAgc2NhdHRlcgorICAgIHN0b2NrCisKKz1pdGVtICogQzxuYW1lPgorCitTZXQgdGhlIG5hbWUgZm9yIHRoZSBjaGFydCBzaGVldC4gVGhlIG5hbWUgcHJvcGVydHkgaXMgb3B0aW9uYWwgYW5kIGlmIGl0IGlzbid0IHN1cHBsaWVkIHdpbGwgZGVmYXVsdCB0byBDPENoYXJ0MSAuLiBuPi4gVGhlIG5hbWUgbXVzdCBiZSBhIHZhbGlkIEV4Y2VsIHdvcmtzaGVldCBuYW1lLiBTZWUgQzxhZGRfd29ya3NoZWV0KCk+IGZvciBtb3JlIGRldGFpbHMgb24gdmFsaWQgc2hlZXQgbmFtZXMuIFRoZSBDPG5hbWU+IHByb3BlcnR5IGNhbiBiZSBvbWl0dGVkIGZvciBlbWJlZGRlZCBjaGFydHMuCisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScsIG5hbWUgPT4gJ1Jlc3VsdHMgQ2hhcnQnICk7CisKKz1pdGVtICogQzxlbWJlZGRlZD4KKworU3BlY2lmaWVzIHRoYXQgdGhlIENoYXJ0IG9iamVjdCB3aWxsIGJlIGluc2VydGVkIGluIGEgd29ya3NoZWV0IHZpYSB0aGUgQzxpbnNlcnRfY2hhcnQoKT4gV29ya3NoZWV0IG1ldGhvZC4gSXQgaXMgYW4gZXJyb3IgdG8gdHJ5IGluc2VydCBhIENoYXJ0IHRoYXQgZG9lc24ndCBoYXZlIHRoaXMgZmxhZyBzZXQuCisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScsIGVtYmVkZGVkID0+IDEgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBjaGFydC4KKyAgICAuLi4KKworICAgICMgSW5zZXJ0IHRoZSBjaGFydCBpbnRvIHRoZSBhIHdvcmtzaGVldC4KKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfY2hhcnQoICdFMicsICRjaGFydCApOworCis9YmFjaworCitTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+IGZvciBkZXRhaWxzIG9uIGhvdyB0byBjb25maWd1cmUgdGhlIGNoYXJ0IG9iamVjdCBvbmNlIGl0IGlzIGNyZWF0ZWQuIFNlZSBhbHNvIHRoZSBDPGNoYXJ0XyoucGw+IHByb2dyYW1zIGluIHRoZSBleGFtcGxlcyBkaXJlY3Rvcnkgb2YgdGhlIGRpc3Ryby4KKworCisKKworPWhlYWQyIGFkZF9jaGFydF9leHQoJGNoYXJ0X2RhdGEsICRjaGFydG5hbWUpCisKK1RoaXMgbWV0aG9kIGlzIHVzZSB0byBpbmNsdWRlIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGNoYXJ0cyBpbiBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGZpbGUuCisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydF9leHQoJ2NoYXJ0MDEuYmluJywgJ0NoYXJ0MScpOworCitUaGlzIGZlYXR1cmUgaXMgc2VtaS1kZXByZWNhdGVkIGluIGZhdm91ciBvZiB0aGUgIm5hdGl2ZSIgY2hhcnRzIGNyZWF0ZWQgdXNpbmcgQzxhZGRfY2hhcnQoKT4uIFJlYWQgQzxleHRlcm5hbF9jaGFydHMudHh0PiAob3IgQzwucG9kPikgaW4gdGhlIGV4dGVybmFsX2NoYXJ0cyBkaXJlY3Rvcnkgb2YgdGhlIGRpc3RybyBmb3IgYSBmdWxsIGV4cGxhbmF0aW9uLgorCisKKworCis9aGVhZDIgY2xvc2UoKQorCitJbiBnZW5lcmFsIHlvdXIgRXhjZWwgZmlsZSB3aWxsIGJlIGNsb3NlZCBhdXRvbWF0aWNhbGx5IHdoZW4geW91ciBwcm9ncmFtIGVuZHMgb3Igd2hlbiB0aGUgV29ya2Jvb2sgb2JqZWN0IGdvZXMgb3V0IG9mIHNjb3BlLCBob3dldmVyIHRoZSBDPGNsb3NlKCk+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byBleHBsaWNpdGx5IGNsb3NlIGFuIEV4Y2VsIGZpbGUuCisKKyAgICAkd29ya2Jvb2stPmNsb3NlKCk7CisKK0FuIGV4cGxpY2l0IEM8Y2xvc2UoKT4gaXMgcmVxdWlyZWQgaWYgdGhlIGZpbGUgbXVzdCBiZSBjbG9zZWQgcHJpb3IgdG8gcGVyZm9ybWluZyBzb21lIGV4dGVybmFsIGFjdGlvbiBvbiBpdCBzdWNoIGFzIGNvcHlpbmcgaXQsIHJlYWRpbmcgaXRzIHNpemUgb3IgYXR0YWNoaW5nIGl0IHRvIGFuIGVtYWlsLgorCitJbiBhZGRpdGlvbiwgQzxjbG9zZSgpPiBtYXkgYmUgcmVxdWlyZWQgdG8gcHJldmVudCBwZXJsJ3MgZ2FyYmFnZSBjb2xsZWN0b3IgZnJvbSBkaXNwb3Npbmcgb2YgdGhlIFdvcmtib29rLCBXb3Jrc2hlZXQgYW5kIEZvcm1hdCBvYmplY3RzIGluIHRoZSB3cm9uZyBvcmRlci4gU2l0dWF0aW9ucyB3aGVyZSB0aGlzIGNhbiBvY2N1ciBhcmU6CisKKz1vdmVyIDQKKworPWl0ZW0gKgorCitJZiBDPG15KCk+IHdhcyBub3QgdXNlZCB0byBkZWNsYXJlIHRoZSBzY29wZSBvZiBhIHdvcmtib29rIHZhcmlhYmxlIGNyZWF0ZWQgdXNpbmcgQzxuZXcoKT4uCisKKz1pdGVtICoKKworSWYgdGhlIEM8bmV3KCk+LCBDPGFkZF93b3Jrc2hlZXQoKT4gb3IgQzxhZGRfZm9ybWF0KCk+IG1ldGhvZHMgYXJlIGNhbGxlZCBpbiBzdWJyb3V0aW5lcy4KKworPWJhY2sKKworVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHJlbGllcyBvbiBQZXJsJ3MgQzxERVNUUk9ZPiBtZWNoYW5pc20gdG8gdHJpZ2dlciBkZXN0cnVjdG9yIG1ldGhvZHMgaW4gYSBzcGVjaWZpYyBzZXF1ZW5jZS4gVGhpcyBtYXkgbm90IGhhcHBlbiBpbiBjYXNlcyB3aGVyZSB0aGUgV29ya2Jvb2ssIFdvcmtzaGVldCBhbmQgRm9ybWF0IHZhcmlhYmxlcyBhcmUgbm90IGxleGljYWxseSBzY29wZWQgb3Igd2hlcmUgdGhleSBoYXZlIGRpZmZlcmVudCBsZXhpY2FsIHNjb3Blcy4KKworSW4gZ2VuZXJhbCwgaWYgeW91IGNyZWF0ZSBhIGZpbGUgd2l0aCBhIHNpemUgb2YgMCBieXRlcyBvciB5b3UgZmFpbCB0byBjcmVhdGUgYSBmaWxlIHlvdSBuZWVkIHRvIGNhbGwgQzxjbG9zZSgpPi4KKworVGhlIHJldHVybiB2YWx1ZSBvZiBDPGNsb3NlKCk+IGlzIHRoZSBzYW1lIGFzIHRoYXQgcmV0dXJuZWQgYnkgcGVybCB3aGVuIGl0IGNsb3NlcyB0aGUgZmlsZSBjcmVhdGVkIGJ5IEM8bmV3KCk+LiBUaGlzIGFsbG93cyB5b3UgdG8gaGFuZGxlIGVycm9yIGNvbmRpdGlvbnMgaW4gdGhlIHVzdWFsIHdheToKKworICAgICR3b3JrYm9vay0+Y2xvc2UoKSBvciBkaWUgIkVycm9yIGNsb3NpbmcgZmlsZTogJCEiOworCisKKworCis9aGVhZDIgY29tcGF0aWJpbGl0eV9tb2RlKCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXByb3ZlIGNvbXBhdGliaWxpdHkgd2l0aCB0aGlyZCBwYXJ0eSBhcHBsaWNhdGlvbnMgdGhhdCByZWFkIEV4Y2VsIGZpbGVzLgorCisgICAgJHdvcmtib29rLT5jb21wYXRpYmlsaXR5X21vZGUoKTsKKworQW4gRXhjZWwgZmlsZSBpcyBjb21wcmlzZWQgb2YgYmluYXJ5IHJlY29yZHMgdGhhdCBkZXNjcmliZSBwcm9wZXJ0aWVzIG9mIGEgc3ByZWFkc2hlZXQuIEV4Y2VsIGlzIHJlYXNvbmFibHkgbGliZXJhbCBhYm91dCB0aGlzIGFuZCwgb3V0c2lkZSBvZiBhIGNvcmUgc3Vic2V0LCBpdCBkb2Vzbid0IHJlcXVpcmUgZXZlcnkgcG9zc2libGUgcmVjb3JkIHRvIGJlIHByZXNlbnQgd2hlbiBpdCByZWFkcyBhIGZpbGUuIFRoaXMgaXMgYWxzbyB0cnVlIG9mIEdudW1lcmljIGFuZCBPcGVuT2ZmaWNlLk9yZyBDYWxjLgorCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhpcyBmYWN0IHRvIG9taXQgc29tZSByZWNvcmRzIGluIG9yZGVyIHRvIG1pbmltaXNlIHRoZSBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4gbWVtb3J5IGFuZCB0byBzaW1wbGlmeSBhbmQgc3BlZWQgdXAgdGhlIHdyaXRpbmcgb2YgZmlsZXMuIEhvd2V2ZXIsIHNvbWUgdGhpcmQgcGFydHkgYXBwbGljYXRpb25zIHRoYXQgcmVhZCBFeGNlbCBmaWxlcyBvZnRlbiBleHBlY3QgY2VydGFpbiByZWNvcmRzIHRvIGJlIHByZXNlbnQuIEluICJjb21wYXRpYmlsaXR5IG1vZGUiIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHdyaXRlcyB0aGVzZSByZWNvcmRzIGFuZCB0cmllcyB0byBiZSBhcyBjbG9zZSB0byBhbiBFeGNlbCBnZW5lcmF0ZWQgZmlsZSBhcyBwb3NzaWJsZS4KKworQXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBDPGNvbXBhdGliaWxpdHlfbW9kZSgpPiBhcmUgQXBhY2hlIFBPSSwgQXBwbGUgTnVtYmVycywgYW5kIFF1aWNrb2ZmaWNlIG9uIE5va2lhLCBQYWxtIGFuZCBvdGhlciBkZXZpY2VzLiBZb3Ugc2hvdWxkIGFsc28gdXNlIEM8Y29tcGF0aWJpbGl0eV9tb2RlKCk+IGlmIHlvdXIgRXhjZWwgZmlsZSB3aWxsIGJlIHVzZWQgYXMgYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UgYnkgYW5vdGhlciBFeGNlbCBmaWxlLgorCitJZiB5b3UgZW5jb3VudGVyIG90aGVyIHNpdHVhdGlvbnMgdGhhdCByZXF1aXJlIEM8Y29tcGF0aWJpbGl0eV9tb2RlKCk+LCBwbGVhc2UgbGV0IG1lIGtub3cuCisKK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IEM8Y29tcGF0aWJpbGl0eV9tb2RlKCk+IHJlcXVpcmVzIGFkZGl0aW9uYWwgZGF0YSB0byBiZSBzdG9yZWQgaW4gbWVtb3J5IGFuZCBhZGRpdGlvbmFsIHByb2Nlc3NpbmcuIFRoaXMgaW5jdXJzIGEgbWVtb3J5IGFuZCBzcGVlZCBwZW5hbHR5IGFuZCBtYXkgbm90IGJlIHN1aXRhYmxlIGZvciB2ZXJ5IGxhcmdlIGZpbGVzICg+MjBNQikuCisKK1lvdSBtdXN0IGNhbGwgQzxjb21wYXRpYmlsaXR5X21vZGUoKT4gYmVmb3JlIGNhbGxpbmcgQzxhZGRfd29ya3NoZWV0KCk+LgorCisKKworCis9aGVhZDIgc2V0X3Byb3BlcnRpZXMoKQorCitUaGUgQzxzZXRfcHJvcGVydGllcz4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgZG9jdW1lbnQgcHJvcGVydGllcyBvZiB0aGUgRXhjZWwgZmlsZSBjcmVhdGVkIGJ5IEM8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+LiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSB2aXNpYmxlIHdoZW4geW91IHVzZSB0aGUgQzw8IEZpbGUtPlByb3BlcnRpZXMgPj4gbWVudSBvcHRpb24gaW4gRXhjZWwgYW5kIGFyZSBhbHNvIGF2YWlsYWJsZSB0byBleHRlcm5hbCBhcHBsaWNhdGlvbnMgdGhhdCByZWFkIG9yIGluZGV4IHdpbmRvd3MgZmlsZXMuCisKK1RoZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBwYXNzZWQgYXMgYSBoYXNoIG9mIHZhbHVlcyBhcyBmb2xsb3dzOgorCisgICAgJHdvcmtib29rLT5zZXRfcHJvcGVydGllcygKKyAgICAgICAgdGl0bGUgICAgPT4gJ1RoaXMgaXMgYW4gZXhhbXBsZSBzcHJlYWRzaGVldCcsCisgICAgICAgIGF1dGhvciAgID0+ICdKb2huIE1jTmFtYXJhJywKKyAgICAgICAgY29tbWVudHMgPT4gJ0NyZWF0ZWQgd2l0aCBQZXJsIGFuZCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCcsCisgICAgKTsKKworVGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IGFyZToKKworICAgIHRpdGxlCisgICAgc3ViamVjdAorICAgIGF1dGhvcgorICAgIG1hbmFnZXIKKyAgICBjb21wYW55CisgICAgY2F0ZWdvcnkKKyAgICBrZXl3b3JkcworICAgIGNvbW1lbnRzCisKK1VzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBub3Qgc3VwcG9ydGVkIGR1ZSB0byBlZmZvcnQgcmVxdWlyZWQuCisKK0luIHBlcmwgNS44KyB5b3UgY2FuIGFsc28gcGFzcyBVVEYtOCBzdHJpbmdzIGFzIHByb3BlcnRpZXMuIFNlZSBMPFVOSUNPREUgSU4gRVhDRUw+LgorCisgICAgbXkgJHNtaWxleSA9IGNociAweDI2M0E7CisKKyAgICAkd29ya2Jvb2stPnNldF9wcm9wZXJ0aWVzKAorICAgICAgICBzdWJqZWN0ID0+ICJIYXBweSBub3c/ICRzbWlsZXkiLAorICAgICk7CisKK1dpdGggb2xkZXIgdmVyc2lvbnMgb2YgcGVybCB5b3UgY2FuIHVzZSBhIG1vZHVsZSB0byBjb252ZXJ0IGEgbm9uLUFTQ0lJIHN0cmluZyB0byBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBVVEYtOCBhbmQgdGhlbiBwYXNzIGFuIGFkZGl0aW9uYWwgQzx1dGY4PiBmbGFnIHRvIEM8c2V0X3Byb3BlcnRpZXMoKT46CisKKyAgICBteSAkc21pbGV5ID0gcGFjayAnSConLCAnRTI5OEJBJzsKKworICAgICR3b3JrYm9vay0+c2V0X3Byb3BlcnRpZXMoCisgICAgICAgIHN1YmplY3QgPT4gIkhhcHB5IG5vdz8gJHNtaWxleSIsCisgICAgICAgIHV0ZjggICAgPT4gMSwKKyAgICApOworCitVc3VhbGx5IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFsbG93cyB5b3UgdG8gdXNlIFVURi0xNiB3aXRoIHByZSA1LjggdmVyc2lvbnMgb2YgcGVybC4gSG93ZXZlciwgZG9jdW1lbnQgcHJvcGVydGllcyBkb24ndCBzdXBwb3J0IFVURi0xNiBmb3IgdGhlc2UgdHlwZSBvZiBzdHJpbmdzLgorCitJbiBvcmRlciB0byBwcm9tb3RlIHRoZSB1c2VmdWxuZXNzIG9mIFBlcmwgYW5kIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgY29uc2lkZXIgYWRkaW5nIGEgY29tbWVudCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgd2hlbiB1c2luZyBkb2N1bWVudCBwcm9wZXJ0aWVzOgorCisgICAgJHdvcmtib29rLT5zZXRfcHJvcGVydGllcygKKyAgICAgICAgLi4uLAorICAgICAgICBjb21tZW50cyA9PiAnQ3JlYXRlZCB3aXRoIFBlcmwgYW5kIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsJywKKyAgICAgICAgLi4uLAorICAgICk7CisKK1RoaXMgZmVhdHVyZSByZXF1aXJlcyB0aGF0IHRoZSBDPE9MRTo6U3RvcmFnZV9MaXRlPiBtb2R1bGUgaXMgaW5zdGFsbGVkICh3aGljaCBpcyB1c3VhbGx5IHRoZSBjYXNlIGZvciBhIHN0YW5kYXJkIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGluc3RhbGxhdGlvbikuIEhvd2V2ZXIsIHRoaXMgYWxzbyBtZWFucyB0aGF0IHRoZSByZXN1bHRpbmcgT0xFIGRvY3VtZW50IG1heSBCPHBvc3NpYmx5PiBiZSBidWdneSBmb3IgZmlsZXMgbGVzcyB0aGFuIDdNQiBzaW5jZSBpdCBoYXNuJ3QgYmVlbiBhcyByaWdvcm91c2x5IHRlc3RlZCBpbiB0aGF0IGRvbWFpbi4gQXMgYSByZXN1bHQgb2YgdGhpcyBDPHNldF9wcm9wZXJ0aWVzPiBpcyBjdXJyZW50bHkgaW5jb21wYXRpYmxlIHdpdGggR251bWVyaWMgZm9yIGZpbGVzIGxlc3MgdGhhbiA3TUIuIFRoaXMgaXMgYmVpbmcgaW52ZXN0aWdhdGVkLiBJZiB5b3UgZW5jb3VudGVyIGFueSBwcm9ibGVtcyB3aXRoIHRoaXMgZmVhdHVyZXMgbGV0IG1lIGtub3cuCisKK0ZvciBjb252ZW5pZW5jZSBpdCBpcyBwb3NzaWJsZSB0byBwYXNzIGVpdGhlciBhIGhhc2ggb3IgaGFzaCByZWYgb2YgYXJndW1lbnRzIHRvIHRoaXMgbWV0aG9kLgorCitTZWUgYWxzbyB0aGUgQzxwcm9wZXJ0aWVzLnBsPiBwcm9ncmFtIGluIHRoZSBleGFtcGxlcyBkaXJlY3Rvcnkgb2YgdGhlIGRpc3Ryby4KKworCisKKworPWhlYWQyIGRlZmluZV9uYW1lKCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBkZWZpbmVkIGEgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHZhbHVlLCBhIHNpbmdsZSBjZWxsIG9yIGEgcmFuZ2Ugb2YgY2VsbHMgaW4gYSB3b3JrYm9vay4KKworICAgICR3b3JrYm9vay0+ZGVmaW5lX25hbWUoJ0V4Y2hhbmdlX3JhdGUnLCAnPTAuOTYnKTsKKyAgICAkd29ya2Jvb2stPmRlZmluZV9uYW1lKCdTYWxlcycsICAgICAgICAgJz1TaGVldDEhJEckMTokSCQxMCcpOworICAgICR3b3JrYm9vay0+ZGVmaW5lX25hbWUoJ1NoZWV0MiFTYWxlcycsICAnPVNoZWV0MiEkRyQxOiRHJDEwJyk7CisKK1NlZSB0aGUgZGVmaW5lZF9uYW1lLnBsIHByb2dyYW0gaW4gdGhlIGV4YW1wbGVzIGRpciBvZiB0aGUgZGlzdHJvLgorCitOb3RlOiBUaGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZS4gTW9yZSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcyB3aWxsIGJlIGFkZGVkLgorCisKKworCis9aGVhZDIgc2V0X3RlbXBkaXIoKQorCitGb3Igc3BlZWQgYW5kIGVmZmljaWVuY3kgQzxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4gc3RvcmVzIHdvcmtzaGVldCBkYXRhIGluIHRlbXBvcmFyeSBmaWxlcyBwcmlvciB0byBhc3NlbWJsaW5nIHRoZSBmaW5hbCB3b3JrYm9vay4KKworSWYgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaXMgdW5hYmxlIHRvIGNyZWF0ZSB0aGVzZSB0ZW1wb3JhcnkgZmlsZXMgaXQgd2lsbCBzdG9yZSB0aGUgcmVxdWlyZWQgZGF0YSBpbiBtZW1vcnkuIFRoaXMgY2FuIGJlIHNsb3cgZm9yIGxhcmdlIGZpbGVzLgorCitUaGUgcHJvYmxlbSBvY2N1cnMgbWFpbmx5IHdpdGggSUlTIG9uIFdpbmRvd3MgYWx0aG91Z2ggaXQgY291bGQgZmVhc2libHkgb2NjdXIgb24gVW5peCBzeXN0ZW1zIGFzIHdlbGwuIFRoZSBwcm9ibGVtIGdlbmVyYWxseSBvY2N1cnMgYmVjYXVzZSB0aGUgZGVmYXVsdCB0ZW1wIGZpbGUgZGlyZWN0b3J5IGlzIGRlZmluZWQgYXMgQzxDOi8+IG9yIHNvbWUgb3RoZXIgZGlyZWN0b3J5IHRoYXQgSUlTIGRvZXNuJ3QgcHJvdmlkZSB3cml0ZSBhY2Nlc3MgdG8uCisKK1RvIGNoZWNrIGlmIHRoaXMgbWlnaHQgYmUgYSBwcm9ibGVtIG9uIGEgcGFydGljdWxhciBzeXN0ZW0geW91IGNhbiBydW4gYSBzaW1wbGUgdGVzdCBwcm9ncmFtIHdpdGggQzwtdz4gb3IgQzx1c2Ugd2FybmluZ3M+LiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nIGlmIHRoZSBtb2R1bGUgY2Fubm90IGNyZWF0ZSB0aGUgcmVxdWlyZWQgdGVtcG9yYXJ5IGZpbGVzOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygndGVzdC54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisKK1RvIGF2b2lkIHRoaXMgcHJvYmxlbSB0aGUgQzxzZXRfdGVtcGRpcigpPiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGRpcmVjdG9yeSB0aGF0IGlzIGFjY2Vzc2libGUgZm9yIHRoZSBjcmVhdGlvbiBvZiB0ZW1wb3JhcnkgZmlsZXMuCisKK1RoZSBDPEZpbGU6OlRlbXA+IG1vZHVsZSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVzLiBGaWxlOjpUZW1wIHVzZXMgQzxGaWxlOjpTcGVjPiB0byBkZXRlcm1pbmUgYW4gYXBwcm9wcmlhdGUgbG9jYXRpb24gZm9yIHRoZXNlIGZpbGVzIHN1Y2ggYXMgQzwvdG1wPiBvciBDPGM6XHdpbmRvd3NcdGVtcD4uIFlvdSBjYW4gZmluZCBvdXQgd2hpY2ggZGlyZWN0b3J5IGlzIHVzZWQgb24geW91ciBzeXN0ZW0gYXMgZm9sbG93czoKKworICAgIHBlcmwgLU1GaWxlOjpTcGVjIC1sZSAicHJpbnQgRmlsZTo6U3BlYy0+dG1wZGlyIgorCitFdmVuIGlmIHRoZSBkZWZhdWx0IHRlbXBvcmFyeSBmaWxlIGRpcmVjdG9yeSBpcyBhY2Nlc3NpYmxlIHlvdSBtYXkgd2lzaCB0byBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGxvY2F0aW9uIGZvciBzZWN1cml0eSBvciBtYWludGVuYW5jZSByZWFzb25zOgorCisgICAgJHdvcmtib29rLT5zZXRfdGVtcGRpcignL3RtcC93cml0ZWV4Y2VsJyk7CisgICAgJHdvcmtib29rLT5zZXRfdGVtcGRpcignYzpcd2luZG93c1x0ZW1wXHdyaXRlZXhjZWwnKTsKKworVGhlIGRpcmVjdG9yeSBmb3IgdGhlIHRlbXBvcmFyeSBmaWxlIG11c3QgZXhpc3QsIEM8c2V0X3RlbXBkaXIoKT4gd2lsbCBub3QgY3JlYXRlIGEgbmV3IGRpcmVjdG9yeS4KKworT25lIGRpc2FkdmFudGFnZSBvZiB1c2luZyB0aGUgQzxzZXRfdGVtcGRpcigpPiBtZXRob2QgaXMgdGhhdCBvbiBzb21lIFdpbmRvd3Mgc3lzdGVtcyBpdCB3aWxsIGxpbWl0IHlvdSB0byBhcHByb3hpbWF0ZWx5IDgwMCBjb25jdXJyZW50IHRlbXBmaWxlcy4gVGhpcyBtZWFucyB0aGF0IGEgc2luZ2xlIHByb2dyYW0gcnVubmluZyBvbiBvbmUgb2YgdGhlc2Ugc3lzdGVtcyB3aWxsIGJlIGxpbWl0ZWQgdG8gY3JlYXRpbmcgYSB0b3RhbCBvZiA4MDAgd29ya2Jvb2sgYW5kIHdvcmtzaGVldCBvYmplY3RzLiBZb3UgY2FuIHJ1biBtdWx0aXBsZSwgbm9uLWNvbmN1cnJlbnQgcHJvZ3JhbXMgdG8gd29yayBhcm91bmQgdGhpcyBpZiBuZWNlc3NhcnkuCisKKworCisKKz1oZWFkMiBzZXRfY3VzdG9tX2NvbG9yKCRpbmRleCwgJHJlZCwgJGdyZWVuLCAkYmx1ZSkKKworVGhlIEM8c2V0X2N1c3RvbV9jb2xvcigpPiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgb25lIG9mIHRoZSBidWlsdC1pbiBwYWxldHRlIHZhbHVlcyB3aXRoIGEgbW9yZSBzdWl0YWJsZSBjb2xvdXIuCisKK1RoZSB2YWx1ZSBmb3IgQzwkaW5kZXg+IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uNjMsIHNlZSBMPENPTE9VUlMgSU4gRVhDRUw+LgorCitUaGUgZGVmYXVsdCBuYW1lZCBjb2xvdXJzIHVzZSB0aGUgZm9sbG93aW5nIGluZGljZXM6CisKKyAgICAgOCAgID0+ICAgYmxhY2sKKyAgICAgOSAgID0+ICAgd2hpdGUKKyAgICAxMCAgID0+ICAgcmVkCisgICAgMTEgICA9PiAgIGxpbWUKKyAgICAxMiAgID0+ICAgYmx1ZQorICAgIDEzICAgPT4gICB5ZWxsb3cKKyAgICAxNCAgID0+ICAgbWFnZW50YQorICAgIDE1ICAgPT4gICBjeWFuCisgICAgMTYgICA9PiAgIGJyb3duCisgICAgMTcgICA9PiAgIGdyZWVuCisgICAgMTggICA9PiAgIG5hdnkKKyAgICAyMCAgID0+ICAgcHVycGxlCisgICAgMjIgICA9PiAgIHNpbHZlcgorICAgIDIzICAgPT4gICBncmF5CisgICAgMzMgICA9PiAgIHBpbmsKKyAgICA1MyAgID0+ICAgb3JhbmdlCisKK0EgbmV3IGNvbG91ciBpcyBzZXQgdXNpbmcgaXRzIFJHQiAocmVkIGdyZWVuIGJsdWUpIGNvbXBvbmVudHMuIFRoZSBDPCRyZWQ+LCBDPCRncmVlbj4gYW5kIEM8JGJsdWU+IHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAwLi4yNTUuIFlvdSBjYW4gZGV0ZXJtaW5lIHRoZSByZXF1aXJlZCB2YWx1ZXMgaW4gRXhjZWwgdXNpbmcgdGhlIEM8VG9vbHMtRTxndD5PcHRpb25zLUU8Z3Q+Q29sb3JzLUU8Z3Q+TW9kaWZ5PiBkaWFsb2cuCisKK1RoZSBDPHNldF9jdXN0b21fY29sb3IoKT4gd29ya2Jvb2sgbWV0aG9kIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBhIEhUTUwgc3R5bGUgQzwjcnJnZ2JiPiBoZXggdmFsdWU6CisKKyAgICAkd29ya2Jvb2stPnNldF9jdXN0b21fY29sb3IoNDAsIDI1NSwgIDEwMiwgIDAgICApOyAjIE9yYW5nZQorICAgICR3b3JrYm9vay0+c2V0X2N1c3RvbV9jb2xvcig0MCwgMHhGRiwgMHg2NiwgMHgwMCk7ICMgU2FtZSB0aGluZworICAgICR3b3JrYm9vay0+c2V0X2N1c3RvbV9jb2xvcig0MCwgJyNGRjY2MDAnICAgICAgICk7ICMgU2FtZSB0aGluZworCisgICAgbXkgJGZvbnQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoY29sb3IgPT4gNDApOyAjIFVzZSB0aGUgbW9kaWZpZWQgY29sb3VyCisKK1RoZSByZXR1cm4gdmFsdWUgZnJvbSBDPHNldF9jdXN0b21fY29sb3IoKT4gaXMgdGhlIGluZGV4IG9mIHRoZSBjb2xvdXIgdGhhdCB3YXMgY2hhbmdlZDoKKworICAgIG15ICRmZXJyYXJpID0gJHdvcmtib29rLT5zZXRfY3VzdG9tX2NvbG9yKDQwLCAyMTYsIDEyLCAxMik7CisKKyAgICBteSAkZm9ybWF0ICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ19jb2xvciA9PiAkZmVycmFyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgID0+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCisKKworPWhlYWQyIHNoZWV0cygwLCAxLCAuLi4pCisKK1RoZSBDPHNoZWV0cygpPiBtZXRob2QgcmV0dXJucyBhIGxpc3QsIG9yIGEgc2xpY2VkIGxpc3QsIG9mIHRoZSB3b3Jrc2hlZXRzIGluIGEgd29ya2Jvb2suCisKK0lmIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRoZSBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSB3b3Jrc2hlZXRzIGluIHRoZSB3b3JrYm9vay4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcmVwZWF0IGFuIG9wZXJhdGlvbiBvbiBlYWNoIHdvcmtzaGVldDoKKworICAgIGZvcmVhY2ggJHdvcmtzaGVldCAoJHdvcmtib29rLT5zaGVldHMoKSkgeworICAgICAgIHByaW50ICR3b3Jrc2hlZXQtPmdldF9uYW1lKCk7CisgICAgfQorCisKK1lvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgc2xpY2UgbGlzdCB0byByZXR1cm4gb25lIG9yIG1vcmUgd29ya3NoZWV0IG9iamVjdHM6CisKKyAgICAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5zaGVldHMoMCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ0hlbGxvJyk7CisKKworT3Igc2luY2UgcmV0dXJuIHZhbHVlIGZyb20gQzxzaGVldHMoKT4gaXMgYSByZWZlcmVuY2UgdG8gYSB3b3Jrc2hlZXQgb2JqZWN0IHlvdSBjYW4gd3JpdGUgdGhlIGFib3ZlIGV4YW1wbGUgYXM6CisKKyAgICAkd29ya2Jvb2stPnNoZWV0cygwKS0+d3JpdGUoJ0ExJywgJ0hlbGxvJyk7CisKKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHJldHVybnMgdGhlIGZpcnN0IGFuZCBsYXN0IHdvcmtzaGVldCBpbiBhIHdvcmtib29rOgorCisgICAgZm9yZWFjaCAkd29ya3NoZWV0ICgkd29ya2Jvb2stPnNoZWV0cygwLCAtMSkpIHsKKyAgICAgICAjIERvIHNvbWV0aGluZworICAgIH0KKworCitBcnJheSBzbGljZXMgYXJlIGV4cGxhaW5lZCBpbiB0aGUgcGVybGRhdGEgbWFucGFnZS4KKworCisKKworPWhlYWQyIHNldF8xOTA0KCkKKworRXhjZWwgc3RvcmVzIGRhdGVzIGFzIHJlYWwgbnVtYmVycyB3aGVyZSB0aGUgaW50ZWdlciBwYXJ0IHN0b3JlcyB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGVwb2NoIGFuZCB0aGUgZnJhY3Rpb25hbCBwYXJ0IHN0b3JlcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgZGF5LiBUaGUgZXBvY2ggY2FuIGJlIGVpdGhlciAxOTAwIG9yIDE5MDQuIEV4Y2VsIGZvciBXaW5kb3dzIHVzZXMgMTkwMCBhbmQgRXhjZWwgZm9yIE1hY2ludG9zaCB1c2VzIDE5MDQuIEhvd2V2ZXIsIEV4Y2VsIG9uIGVpdGhlciBwbGF0Zm9ybSB3aWxsIGNvbnZlcnQgYXV0b21hdGljYWxseSBiZXR3ZWVuIG9uZSBzeXN0ZW0gYW5kIHRoZSBvdGhlci4KKworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgc3RvcmVzIGRhdGVzIGluIHRoZSAxOTAwIGZvcm1hdCBieSBkZWZhdWx0LiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhpcyB5b3UgY2FuIGNhbGwgdGhlIEM8c2V0XzE5MDQoKT4gd29ya2Jvb2sgbWV0aG9kLiBZb3UgY2FuIHF1ZXJ5IHRoZSBjdXJyZW50IHZhbHVlIGJ5IGNhbGxpbmcgdGhlIEM8Z2V0XzE5MDQoKT4gd29ya2Jvb2sgbWV0aG9kLiBUaGlzIHJldHVybnMgMCBmb3IgMTkwMCBhbmQgMSBmb3IgMTkwNC4KKworU2VlIGFsc28gTDxEQVRFUyBBTkQgVElNRSBJTiBFWENFTD4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd29ya2luZyB3aXRoIEV4Y2VsJ3MgZGF0ZSBzeXN0ZW0uCisKK0luIGdlbmVyYWwgeW91IHByb2JhYmx5IHdvbid0IG5lZWQgdG8gdXNlIEM8c2V0XzE5MDQoKT4uCisKKworCisKKz1oZWFkMiBzZXRfY29kZXBhZ2UoJGNvZGVwYWdlKQorCitUaGUgZGVmYXVsdCBjb2RlIHBhZ2Ugb3IgY2hhcmFjdGVyIHNldCB1c2VkIGJ5IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGlzIEFOU0kuIFRoaXMgaXMgYWxzbyB0aGUgZGVmYXVsdCB1c2VkIGJ5IEV4Y2VsIGZvciBXaW5kb3dzLiBPY2Nhc2lvbmFsbHkgaG93ZXZlciBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNoYW5nZSB0aGUgY29kZSBwYWdlIHZpYSB0aGUgQzxzZXRfY29kZXBhZ2UoKT4gbWV0aG9kLgorCitDaGFuZ2luZyB0aGUgY29kZSBwYWdlIG1heSBiZSByZXF1aXJlZCBpZiB5b3VyIGFyZSB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBvbiB0aGUgTWFjaW50b3NoIGFuZCB5b3UgYXJlIHVzaW5nIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgQVNDSUkgMTI4IGNoYXJhY3RlciBzZXQ6CisKKyAgICAkd29ya2Jvb2stPnNldF9jb2RlcGFnZSgxKTsgIyBBTlNJLCBNUyBXaW5kb3dzCisgICAgJHdvcmtib29rLT5zZXRfY29kZXBhZ2UoMik7ICMgQXBwbGUgTWFjaW50b3NoCisKK1RoZSBDPHNldF9jb2RlcGFnZSgpPiBtZXRob2QgaXMgcmFyZWx5IHJlcXVpcmVkLgorCisKKworCis9aGVhZDEgV09SS1NIRUVUIE1FVEhPRFMKKworQSBuZXcgd29ya3NoZWV0IGlzIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgQzxhZGRfd29ya3NoZWV0KCk+IG1ldGhvZCBmcm9tIGEgd29ya2Jvb2sgb2JqZWN0OgorCisgICAgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCitUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0aHJvdWdoIGEgbmV3IHdvcmtzaGVldDoKKworICAgIHdyaXRlKCkKKyAgICB3cml0ZV9udW1iZXIoKQorICAgIHdyaXRlX3N0cmluZygpCisgICAgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKQorICAgIHdyaXRlX3V0ZjE2bGVfc3RyaW5nKCkKKyAgICBrZWVwX2xlYWRpbmdfemVyb3MoKQorICAgIHdyaXRlX2JsYW5rKCkKKyAgICB3cml0ZV9yb3coKQorICAgIHdyaXRlX2NvbCgpCisgICAgd3JpdGVfZGF0ZV90aW1lKCkKKyAgICB3cml0ZV91cmwoKQorICAgIHdyaXRlX3VybF9yYW5nZSgpCisgICAgd3JpdGVfZm9ybXVsYSgpCisgICAgc3RvcmVfZm9ybXVsYSgpCisgICAgcmVwZWF0X2Zvcm11bGEoKQorICAgIHdyaXRlX2NvbW1lbnQoKQorICAgIHNob3dfY29tbWVudHMoKQorICAgIGFkZF93cml0ZV9oYW5kbGVyKCkKKyAgICBpbnNlcnRfaW1hZ2UoKQorICAgIGluc2VydF9jaGFydCgpCisgICAgZGF0YV92YWxpZGF0aW9uKCkKKyAgICBnZXRfbmFtZSgpCisgICAgYWN0aXZhdGUoKQorICAgIHNlbGVjdCgpCisgICAgaGlkZSgpCisgICAgc2V0X2ZpcnN0X3NoZWV0KCkKKyAgICBwcm90ZWN0KCkKKyAgICBzZXRfc2VsZWN0aW9uKCkKKyAgICBzZXRfcm93KCkKKyAgICBzZXRfY29sdW1uKCkKKyAgICBvdXRsaW5lX3NldHRpbmdzKCkKKyAgICBmcmVlemVfcGFuZXMoKQorICAgIHNwbGl0X3BhbmVzKCkKKyAgICBtZXJnZV9yYW5nZSgpCisgICAgc2V0X3pvb20oKQorICAgIHJpZ2h0X3RvX2xlZnQoKQorICAgIGhpZGVfemVybygpCisgICAgc2V0X3RhYl9jb2xvcigpCisgICAgYXV0b2ZpbHRlcigpCisKKworCisKKz1oZWFkMiBDZWxsIG5vdGF0aW9uCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHN1cHBvcnRzIHR3byBmb3JtcyBvZiBub3RhdGlvbiB0byBkZXNpZ25hdGUgdGhlIHBvc2l0aW9uIG9mIGNlbGxzOiBSb3ctY29sdW1uIG5vdGF0aW9uIGFuZCBBMSBub3RhdGlvbi4KKworUm93LWNvbHVtbiBub3RhdGlvbiB1c2VzIGEgemVybyBiYXNlZCBpbmRleCBmb3IgYm90aCByb3cgYW5kIGNvbHVtbiB3aGlsZSBBMSBub3RhdGlvbiB1c2VzIHRoZSBzdGFuZGFyZCBFeGNlbCBhbHBoYW51bWVyaWMgc2VxdWVuY2Ugb2YgY29sdW1uIGxldHRlciBhbmQgMS1iYXNlZCByb3cuIEZvciBleGFtcGxlOgorCisgICAgKDAsIDApICAgICAgIyBUaGUgdG9wIGxlZnQgY2VsbCBpbiByb3ctY29sdW1uIG5vdGF0aW9uLgorICAgICgnQTEnKSAgICAgICMgVGhlIHRvcCBsZWZ0IGNlbGwgaW4gQTEgbm90YXRpb24uCisKKyAgICAoMTk5OSwgMjkpICAjIFJvdy1jb2x1bW4gbm90YXRpb24uCisgICAgKCdBRDIwMDAnKSAgIyBUaGUgc2FtZSBjZWxsIGluIEExIG5vdGF0aW9uLgorCitSb3ctY29sdW1uIG5vdGF0aW9uIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIHJlZmVycmluZyB0byBjZWxscyBwcm9ncmFtbWF0aWNhbGx5OgorCisgICAgZm9yIG15ICRpICgwIC4uIDkpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGksIDAsICdIZWxsbycpOyAjIENlbGxzIEExIHRvIEExMAorICAgIH0KKworQTEgbm90YXRpb24gaXMgdXNlZnVsIGZvciBzZXR0aW5nIHVwIGEgd29ya3NoZWV0IG1hbnVhbGx5IGFuZCBmb3Igd29ya2luZyB3aXRoIGZvcm11bGFzOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0gxJywgMjAwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDInLCAnPUgxKzEnKTsKKworSW4gZm9ybXVsYXMgYW5kIGFwcGxpY2FibGUgbWV0aG9kcyB5b3UgY2FuIGFsc28gdXNlIHRoZSBDPEE6QT4gY29sdW1uIG5vdGF0aW9uOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJz1TVU0oQjpCKScpOworCitUaGUgQzxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4gbW9kdWxlIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIGRpc3RybyBjb250YWlucyBoZWxwZXIgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggQTEgbm90YXRpb24sIGZvciBleGFtcGxlOgorCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5OworCisgICAgKCRyb3csICRjb2wpICAgID0geGxfY2VsbF90b19yb3djb2woJ0MyJyk7ICAjICgxLCAyKQorICAgICRzdHIgICAgICAgICAgICA9IHhsX3Jvd2NvbF90b19jZWxsKDEsIDIpOyAgIyBDMgorCitGb3Igc2ltcGxpY2l0eSwgdGhlIHBhcmFtZXRlciBsaXN0cyBmb3IgdGhlIHdvcmtzaGVldCBtZXRob2QgY2FsbHMgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBhcmUgZ2l2ZW4gaW4gdGVybXMgb2Ygcm93LWNvbHVtbiBub3RhdGlvbi4gSW4gYWxsIGNhc2VzIGl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIEExIG5vdGF0aW9uLgorCitOb3RlOiBpbiBFeGNlbCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBhIFIxQzEgbm90YXRpb24uIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworCisKKworPWhlYWQyIHdyaXRlKCRyb3csICRjb2x1bW4sICR0b2tlbiwgJGZvcm1hdCkKKworRXhjZWwgbWFrZXMgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGRhdGEgdHlwZXMgc3VjaCBhcyBzdHJpbmdzLCBudW1iZXJzLCBibGFua3MsIGZvcm11bGFzIGFuZCBoeXBlcmxpbmtzLiBUbyBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB3cml0aW5nIGRhdGEgdGhlIEM8d3JpdGUoKT4gbWV0aG9kIGFjdHMgYXMgYSBnZW5lcmFsIGFsaWFzIGZvciBzZXZlcmFsIG1vcmUgc3BlY2lmaWMgbWV0aG9kczoKKworICAgIHdyaXRlX3N0cmluZygpCisgICAgd3JpdGVfbnVtYmVyKCkKKyAgICB3cml0ZV9ibGFuaygpCisgICAgd3JpdGVfZm9ybXVsYSgpCisgICAgd3JpdGVfdXJsKCkKKyAgICB3cml0ZV9yb3coKQorICAgIHdyaXRlX2NvbCgpCisKK1RoZSBnZW5lcmFsIHJ1bGUgaXMgdGhhdCBpZiB0aGUgZGF0YSBsb29rcyBsaWtlIGEgSTxzb21ldGhpbmc+IHRoZW4gYSBJPHNvbWV0aGluZz4gaXMgd3JpdHRlbi4gSGVyZSBhcmUgc29tZSBleGFtcGxlcyBpbiBib3RoIHJvdy1jb2x1bW4gYW5kIEExIG5vdGF0aW9uOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNhbWUgYXM6CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgJ0hlbGxvJyAgICAgICAgICAgICAgICApOyAjIHdyaXRlX3N0cmluZygpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMCwgJ09uZScgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX3N0cmluZygpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMCwgIDIgICAgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX251bWJlcigpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMCwgIDMuMDAwMDEgICAgICAgICAgICAgICApOyAjIHdyaXRlX251bWJlcigpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgMCwgICIiICAgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX2JsYW5rKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAwLCAgJycgICAgICAgICAgICAgICAgICAgICk7ICMgd3JpdGVfYmxhbmsoKQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsIDAsICB1bmRlZiAgICAgICAgICAgICAgICAgKTsgIyB3cml0ZV9ibGFuaygpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNywgMCAgICAgICAgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX2JsYW5rKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSg4LCAwLCAgJ2h0dHA6Ly93d3cucGVybC5jb20vJyk7ICMgd3JpdGVfdXJsKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTknLCAgJ2Z0cDovL2Z0cC5jcGFuLm9yZy8nICk7ICMgd3JpdGVfdXJsKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEwJywgJ2ludGVybmFsOlNoZWV0MSFBMScgICk7ICMgd3JpdGVfdXJsKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTExJywgJ2V4dGVybmFsOmM6XGZvby54bHMnICk7ICMgd3JpdGVfdXJsKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEyJywgJz1BMyArIDMqQTQnICAgICAgICAgICk7ICMgd3JpdGVfZm9ybXVsYSgpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExMycsICc9U0lOKFBJKCkvNCknICAgICAgICApOyAjIHdyaXRlX2Zvcm11bGEoKQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTQnLCBcQGFycmF5ICAgICAgICAgICAgICAgKTsgIyB3cml0ZV9yb3coKQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTUnLCBbXEBhcnJheV0gICAgICAgICAgICAgKTsgIyB3cml0ZV9jb2woKQorCisgICAgIyBBbmQgaWYgdGhlIGtlZXBfbGVhZGluZ196ZXJvcyBwcm9wZXJ0eSBpcyBzZXQ6CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExNiwgIDIgICAgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX251bWJlcigpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExNywgIDAyICAgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX3N0cmluZygpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExOCwgIDAwMDAyICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX3N0cmluZygpCisKKworVGhlICJsb29rcyBsaWtlIiBydWxlIGlzIGRlZmluZWQgYnkgcmVndWxhciBleHByZXNzaW9uczoKKworQzx3cml0ZV9udW1iZXIoKT4gaWYgQzwkdG9rZW4+IGlzIGEgbnVtYmVyIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgcmVnZXg6IEM8JHRva2VuID1+IC9eKFsrLV0/KSg/PVxkfFwuXGQpXGQqKFwuXGQqKT8oW0VlXShbKy1dP1xkKykpPyQvPi4KKworQzx3cml0ZV9zdHJpbmcoKT4gaWYgQzxrZWVwX2xlYWRpbmdfemVyb3MoKT4gaXMgc2V0IGFuZCBDPCR0b2tlbj4gaXMgYW4gaW50ZWdlciB3aXRoIGxlYWRpbmcgemVyb3MgYmFzZWQgb24gdGhlIGZvbGxvd2luZyByZWdleDogQzwkdG9rZW4gPX4gL14wXGQrJC8+LgorCitDPHdyaXRlX2JsYW5rKCk+IGlmIEM8JHRva2VuPiBpcyB1bmRlZiBvciBhIGJsYW5rIHN0cmluZzogQzx1bmRlZj4sIEM8IiI+IG9yIEM8Jyc+LgorCitDPHdyaXRlX3VybCgpPiBpZiBDPCR0b2tlbj4gaXMgYSBodHRwLCBodHRwcywgZnRwIG9yIG1haWx0byBVUkwgYmFzZWQgb24gdGhlIGZvbGxvd2luZyByZWdleGVzOiBDPCR0b2tlbiA9fiBtfF5bZmhddHQ/cHM/Oi8vfD4gb3IgIEM8JHRva2VuID1+IG18Xm1haWx0bzp8Pi4KKworQzx3cml0ZV91cmwoKT4gaWYgQzwkdG9rZW4+IGlzIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHNoZWV0IHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHJlZ2V4OiBDPCR0b2tlbiA9fiBtW14oaW58ZXgpdGVybmFsOl0+LgorCitDPHdyaXRlX2Zvcm11bGEoKT4gaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBDPCR0b2tlbj4gaXMgQzwiPSI+LgorCitDPHdyaXRlX3JvdygpPiBpZiBDPCR0b2tlbj4gaXMgYW4gYXJyYXkgcmVmLgorCitDPHdyaXRlX2NvbCgpPiBpZiBDPCR0b2tlbj4gaXMgYW4gYXJyYXkgcmVmIG9mIGFycmF5IHJlZnMuCisKK0M8d3JpdGVfc3RyaW5nKCk+IGlmIG5vbmUgb2YgdGhlIHByZXZpb3VzIGNvbmRpdGlvbnMgYXBwbHkuCisKK1RoZSBDPCRmb3JtYXQ+IHBhcmFtZXRlciBpcyBvcHRpb25hbC4gSXQgc2hvdWxkIGJlIGEgdmFsaWQgRm9ybWF0IG9iamVjdCwgc2VlIEw8Q0VMTCBGT1JNQVRUSU5HPjoKKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworICAgICRmb3JtYXQtPnNldF9jb2xvcigncmVkJyk7CisgICAgJGZvcm1hdC0+c2V0X2FsaWduKCdjZW50ZXInKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDQsIDAsICdIZWxsbycsICRmb3JtYXQpOyAjIEZvcm1hdHRlZCBzdHJpbmcKKworVGhlIHdyaXRlKCkgbWV0aG9kIHdpbGwgaWdub3JlIGVtcHR5IHN0cmluZ3Mgb3IgQzx1bmRlZj4gdG9rZW5zIHVubGVzcyBhIGZvcm1hdCBpcyBhbHNvIHN1cHBsaWVkLiBBcyBzdWNoIHlvdSBuZWVkbid0IHdvcnJ5IGFib3V0IHNwZWNpYWwgaGFuZGxpbmcgZm9yIGVtcHR5IG9yIEM8dW5kZWY+IHZhbHVlcyBpbiB5b3VyIGRhdGEuIFNlZSBhbHNvIHRoZSBDPHdyaXRlX2JsYW5rKCk+IG1ldGhvZC4KKworT25lIHByb2JsZW0gd2l0aCB0aGUgQzx3cml0ZSgpPiBtZXRob2QgaXMgdGhhdCBvY2Nhc2lvbmFsbHkgZGF0YSBsb29rcyBsaWtlIGEgbnVtYmVyIGJ1dCB5b3UgZG9uJ3Qgd2FudCBpdCB0cmVhdGVkIGFzIGEgbnVtYmVyLiBGb3IgZXhhbXBsZSwgemlwIGNvZGVzIG9yIElEIG51bWJlcnMgb2Z0ZW4gc3RhcnQgd2l0aCBhIGxlYWRpbmcgemVyby4gSWYgeW91IHdyaXRlIHRoaXMgZGF0YSBhcyBhIG51bWJlciB0aGVuIHRoZSBsZWFkaW5nIHplcm8ocykgd2lsbCBiZSBzdHJpcHBlZC4gWW91IGNhbiBjaGFuZ2UgdGhpcyBkZWZhdWx0IGJlaGF2aW91ciBieSB1c2luZyB0aGUgQzxrZWVwX2xlYWRpbmdfemVyb3MoKT4gbWV0aG9kLiBXaGlsZSB0aGlzIHByb3BlcnR5IGlzIGluIHBsYWNlIGFueSBpbnRlZ2VycyB3aXRoIGxlYWRpbmcgemVyb3Mgd2lsbCBiZSB0cmVhdGVkIGFzIHN0cmluZ3MgYW5kIHRoZSB6ZXJvcyB3aWxsIGJlIHByZXNlcnZlZC4gU2VlIHRoZSBDPGtlZXBfbGVhZGluZ196ZXJvcygpPiBzZWN0aW9uIGZvciBhIGZ1bGwgZGlzY3Vzc2lvbiBvZiB0aGlzIGlzc3VlLgorCitZb3UgY2FuIGFsc28gYWRkIHlvdXIgb3duIGRhdGEgaGFuZGxlcnMgdG8gdGhlIEM8d3JpdGUoKT4gbWV0aG9kIHVzaW5nIEM8YWRkX3dyaXRlX2hhbmRsZXIoKT4uCisKK09uIHN5c3RlbXMgd2l0aCBDPHBlcmwgNS44PiBhbmQgbGF0ZXIgdGhlIEM8d3JpdGUoKT4gbWV0aG9kIHdpbGwgYWxzbyBoYW5kbGUgVW5pY29kZSBzdHJpbmdzIGluIEM8VVRGLTg+IGZvcm1hdC4KKworVGhlIEM8d3JpdGU+IG1ldGhvZHMgcmV0dXJuOgorCisgICAgMCBmb3Igc3VjY2Vzcy4KKyAgIC0xIGZvciBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgIC0yIGZvciByb3cgb3IgY29sdW1uIG91dCBvZiBib3VuZHMuCisgICAtMyBmb3Igc3RyaW5nIHRvbyBsb25nLgorCisKKworCis9aGVhZDIgd3JpdGVfbnVtYmVyKCRyb3csICRjb2x1bW4sICRudW1iZXIsICRmb3JtYXQpCisKK1dyaXRlIGFuIGludGVnZXIgb3IgYSBmbG9hdCB0byB0aGUgY2VsbCBzcGVjaWZpZWQgYnkgQzwkcm93PiBhbmQgQzwkY29sdW1uPjoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX251bWJlcigwLCAwLCAgMTIzNDU2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9udW1iZXIoJ0EyJywgIDIuMzQ1MSk7CisKK1NlZSB0aGUgbm90ZSBhYm91dCBMPENlbGwgbm90YXRpb24+LiBUaGUgQzwkZm9ybWF0PiBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuCisKK0luIGdlbmVyYWwgaXQgaXMgc3VmZmljaWVudCB0byB1c2UgdGhlIEM8d3JpdGUoKT4gbWV0aG9kLgorCisKKworCis9aGVhZDIgd3JpdGVfc3RyaW5nKCRyb3csICRjb2x1bW4sICRzdHJpbmcsICRmb3JtYXQpCisKK1dyaXRlIGEgc3RyaW5nIHRvIHRoZSBjZWxsIHNwZWNpZmllZCBieSBDPCRyb3c+IGFuZCBDPCRjb2x1bW4+OgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nKDAsIDAsICdZb3VyIHRleHQgaGVyZScgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJ0EyJywgJ29yIGhlcmUnICk7CisKK1RoZSBtYXhpbXVtIHN0cmluZyBzaXplIGlzIDMyNzY3IGNoYXJhY3RlcnMuIEhvd2V2ZXIgdGhlIG1heGltdW0gc3RyaW5nIHNlZ21lbnQgdGhhdCBFeGNlbCBjYW4gZGlzcGxheSBpbiBhIGNlbGwgaXMgMTAwMC4gQWxsIDMyNzY3IGNoYXJhY3RlcnMgY2FuIGJlIGRpc3BsYXllZCBpbiB0aGUgZm9ybXVsYSBiYXIuCisKK1RoZSBDPCRmb3JtYXQ+IHBhcmFtZXRlciBpcyBvcHRpb25hbC4KKworT24gc3lzdGVtcyB3aXRoIEM8cGVybCA1Ljg+IGFuZCBsYXRlciB0aGUgQzx3cml0ZSgpPiBtZXRob2Qgd2lsbCBhbHNvIGhhbmRsZSBzdHJpbmdzIGluIEM8VVRGLTg+IGZvcm1hdC4gV2l0aCBvbGRlciBwZXJscyB5b3UgY2FuIGFsc28gd3JpdGUgVW5pY29kZSBpbiBDPFVURjE2PiBmb3JtYXQgdmlhIHRoZSBDPHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCk+IG1ldGhvZC4gU2VlIGFsc28gdGhlIEM8dW5pY29kZV8qLnBsPiBwcm9ncmFtcyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK0luIGdlbmVyYWwgaXQgaXMgc3VmZmljaWVudCB0byB1c2UgdGhlIEM8d3JpdGUoKT4gbWV0aG9kLiBIb3dldmVyLCB5b3UgbWF5IHNvbWV0aW1lcyB3aXNoIHRvIHVzZSB0aGUgQzx3cml0ZV9zdHJpbmcoKT4gbWV0aG9kIHRvIHdyaXRlIGRhdGEgdGhhdCBsb29rcyBsaWtlIGEgbnVtYmVyIGJ1dCB0aGF0IHlvdSBkb24ndCB3YW50IHRyZWF0ZWQgYXMgYSBudW1iZXIuIEZvciBleGFtcGxlLCB6aXAgY29kZXMgb3IgcGhvbmUgbnVtYmVyczoKKworICAgICMgV3JpdGUgYXMgYSBwbGFpbiBzdHJpbmcKKyAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJ0ExJywgJzAxMjA5Jyk7CisKK0hvd2V2ZXIsIGlmIHRoZSB1c2VyIGVkaXRzIHRoaXMgc3RyaW5nIEV4Y2VsIG1heSBjb252ZXJ0IGl0IGJhY2sgdG8gYSBudW1iZXIuIFRvIGdldCBhcm91bmQgdGhpcyB5b3UgY2FuIHVzZSB0aGUgRXhjZWwgdGV4dCBmb3JtYXQgQzxAPjoKKworICAgICMgRm9ybWF0IGFzIGEgc3RyaW5nLiBEb2Vzbid0IGNoYW5nZSB0byBhIG51bWJlciB3aGVuIGVkaXRlZAorICAgIG15ICRmb3JtYXQxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ0AnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJ0EyJywgJzAxMjA5JywgJGZvcm1hdDEpOworCitTZWUgYWxzbyB0aGUgbm90ZSBhYm91dCBMPENlbGwgbm90YXRpb24+LgorCisKKworCis9aGVhZDIgd3JpdGVfdXRmMTZiZV9zdHJpbmcoJHJvdywgJGNvbHVtbiwgJHN0cmluZywgJGZvcm1hdCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byB3cml0ZSBDPFVURi0xNkJFPiBzdHJpbmdzIHRvIGEgY2VsbCBpbiBFeGNlbC4gSXQgaXMgZnVuY3Rpb25hbGx5IHRoZSBzYW1lIGFzIHRoZSBDPHdyaXRlX3N0cmluZygpPiBtZXRob2QgZXhjZXB0IHRoYXQgdGhlIHN0cmluZyBzaG91bGQgYmUgaW4gQzxVVEYtMTZCRT4gVW5pY29kZSBmb3JtYXQuIEl0IGlzIGdlbmVyYWxseSBlYXNpZXIsIHdoZW4gdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwsIHRvIHdyaXRlIHVuaWNvZGUgc3RyaW5ncyBpbiBDPFVURi04PiBmb3JtYXQsIHNlZSBMPFVOSUNPREUgSU4gRVhDRUw+LiBUaGUgQzx3cml0ZV91dGYxNmJlX3N0cmluZygpPiBtZXRob2QgaXMgbWFpbmx5IG9mIHVzZSBpbiB2ZXJzaW9ucyBvZiBwZXJsIHByaW9yIHRvIDUuOC4KKworCitUaGUgZm9sbG93aW5nIGlzIGEgc2ltcGxlIGV4YW1wbGUgc2hvd2luZyBob3cgdG8gd3JpdGUgc29tZSBVbmljb2RlIHN0cmluZ3MgaW4gQzxVVEYtMTZCRT4gZm9ybWF0OgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIHVzZSBVbmljb2RlOjpNYXAoKTsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCd1dGZfMTZfYmUueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgIyBJbmNyZWFzZSB0aGUgY29sdW1uIHdpZHRoIGZvciBjbGFyaXR5CisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgMjUpOworCisKKyAgICAjIFdyaXRlIGEgVW5pY29kZSBjaGFyYWN0ZXIKKyAgICAjCisgICAgbXkgJHNtaWxleSA9IHBhY2sgJ24nLCAweDI2M2E7CisKKyAgICAjIEluY3JlYXNlIHRoZSBmb250IHNpemUgZm9yIGxlZ2liaWxpdHkuCisgICAgbXkgJGJpZ19mb250ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KHNpemUgPT4gNzIpOworCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJ0EzJywgJHNtaWxleSwgJGJpZ19mb250KTsKKworCisKKyAgICAjIFdyaXRlIGEgcGhyYXNlIGluIEN5cmlsbGljIHVzaW5nIGEgaGV4LWVuY29kZWQgc3RyaW5nCisgICAgIworICAgIG15ICRzdHIgPSBwYWNrICdIKicsICcwNDJkMDQ0MjA0M2UwMDIwMDQ0NDA0NDAwNDMwMDQzNzA0MzAwMDIwMDQzZCcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICcwNDMwMDAyMDA0NDAwNDQzMDQ0MTA0NDEwNDNhMDQzZTA0M2MwMDIxJzsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCdBNScsICRzdHIpOworCisKKworICAgICMgTWFwIGEgc3RyaW5nIHRvIFVURi0xNkJFIHVzaW5nIGFuIGV4dGVybmFsIG1vZHVsZS4KKyAgICAjCisgICAgbXkgJG1hcCAgID0gVW5pY29kZTo6TWFwLT5uZXcoJ0lTTy04ODU5LTEnKTsKKyAgICBteSAkdXRmMTYgPSAkbWFwLT50b191bmljb2RlKCdIZWxsbyB3b3JsZCEnKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCdBNycsICR1dGYxNik7CisKK1lvdSBjYW4gY29udmVydCBBU0NJSSBlbmNvZGluZ3MgdG8gdGhlIHJlcXVpcmVkIEM8VVRGLTE2QkU+IGZvcm1hdCB1c2luZyBvbmUgb2YgdGhlIG1hbnkgVW5pY29kZSBtb2R1bGVzIG9uIENQQU4uIEZvciBleGFtcGxlIEM8VW5pY29kZTo6TWFwPiBhbmQgQzxVbmljb2RlOjpTdHJpbmc+OiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvYXV0aG9yL01TQ0hXQVJUWi9Vbmljb2RlLU1hcC9NYXAucG0+IGFuZCBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvYXV0aG9yL0dBQVMvVW5pY29kZS1TdHJpbmcvU3RyaW5nLnBtPi4KKworRm9yIGEgZnVsbCBsaXN0IG9mIHRoZSBQZXJsIFVuaWNvZGUgbW9kdWxlcyBzZWU6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9zZWFyY2g/cXVlcnk9dW5pY29kZSZtb2RlPWFsbD4uCisKK0M8VVRGLTE2QkU+IGlzIHRoZSBmb3JtYXQgbW9zdCBvZnRlbiByZXR1cm5lZCBieSBDPFBlcmw+IG1vZHVsZXMgdGhhdCBnZW5lcmF0ZSBDPFVURi0xNj4uIFRvIHdyaXRlIEM8VVRGLTE2PiBzdHJpbmdzIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0IHVzZSB0aGUgQzx3cml0ZV91dGYxNmJlX3N0cmluZ19sZSgpPiBtZXRob2QgYmVsb3cuCisKK1RoZSBDPHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCk+IG1ldGhvZCB3YXMgcHJldmlvdXNseSBjYWxsZWQgQzx3cml0ZV91bmljb2RlKCk+LiBUaGF0LCBvdmVybHkgZ2VuZXJhbCwgbmFtZSBpcyBzdGlsbCBzdXBwb3J0ZWQgYnV0IGRlcHJlY2F0ZWQuCisKK1NlZSBhbHNvIHRoZSBDPHVuaWNvZGVfKi5wbD4gcHJvZ3JhbXMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDIgd3JpdGVfdXRmMTZsZV9zdHJpbmcoJHJvdywgJGNvbHVtbiwgJHN0cmluZywgJGZvcm1hdCkKKworVGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgYXMgQzx3cml0ZV91dGYxNmJlKCk+IGV4Y2VwdCB0aGF0IHRoZSBzdHJpbmcgc2hvdWxkIGJlIDE2LWJpdCBjaGFyYWN0ZXJzIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiBUaGlzIGlzIGdlbmVyYWxseSByZWZlcnJlZCB0byBhcyBDPFVURi0xNkxFPi4gU2VlIEw8VU5JQ09ERSBJTiBFWENFTD4uCisKK0M8VVRGLTE2PiBkYXRhIGNhbiBiZSBjaGFuZ2VkIGZyb20gbGl0dGxlLWVuZGlhbiB0byBiaWctZW5kaWFuIGZvcm1hdCAoYW5kIHZpY2UtdmVyc2EpIGFzIGZvbGxvd3M6CisKKyAgICAkdXRmMTZiZSA9IHBhY2sgJ24qJywgdW5wYWNrICd2KicsICR1dGYxNmxlOworCisKKworCis9aGVhZDIga2VlcF9sZWFkaW5nX3plcm9zKCkKKworVGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiBpbnRlZ2VycyB3aXRoIGxlYWRpbmcgemVyb3Mgd2hlbiB1c2luZyB0aGUgQzx3cml0ZSgpPiBtZXRob2QuCisKK1RoZSBDPHdyaXRlKCk+IG1ldGhvZCB1c2VzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBkYXRhIHRvIHdyaXRlIHRvIGFuIEV4Y2VsIHdvcmtzaGVldC4gSWYgdGhlIGRhdGEgbG9va3MgbGlrZSBhIG51bWJlciBpdCB3cml0ZXMgYSBudW1iZXIgdXNpbmcgQzx3cml0ZV9udW1iZXIoKT4uIE9uZSBwcm9ibGVtIHdpdGggdGhpcyBhcHByb2FjaCBpcyB0aGF0IG9jY2FzaW9uYWxseSBkYXRhIGxvb2tzIGxpa2UgYSBudW1iZXIgYnV0IHlvdSBkb24ndCB3YW50IGl0IHRyZWF0ZWQgYXMgYSBudW1iZXIuCisKK1ppcCBjb2RlcyBhbmQgSUQgbnVtYmVycywgZm9yIGV4YW1wbGUsIG9mdGVuIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHplcm8uIElmIHlvdSB3cml0ZSB0aGlzIGRhdGEgYXMgYSBudW1iZXIgdGhlbiB0aGUgbGVhZGluZyB6ZXJvKHMpIHdpbGwgYmUgc3RyaXBwZWQuIFRoaXMgaXMgdGhlIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3VyIHdoZW4geW91IGVudGVyIGRhdGEgbWFudWFsbHkgaW4gRXhjZWwuCisKK1RvIGdldCBhcm91bmQgdGhpcyB5b3UgY2FuIHVzZSBvbmUgb2YgdGhyZWUgb3B0aW9ucy4gV3JpdGUgYSBmb3JtYXR0ZWQgbnVtYmVyLCB3cml0ZSB0aGUgbnVtYmVyIGFzIGEgc3RyaW5nIG9yIHVzZSB0aGUgQzxrZWVwX2xlYWRpbmdfemVyb3MoKT4gbWV0aG9kIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgQzx3cml0ZSgpPjoKKworICAgICMgSW1wbGljaXRseSB3cml0ZSBhIG51bWJlciwgdGhlIGxlYWRpbmcgemVybyBpcyByZW1vdmVkOiAxMjA5CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJzAxMjA5Jyk7CisKKyAgICAjIFdyaXRlIGEgemVybyBwYWRkZWQgbnVtYmVyIHVzaW5nIGEgZm9ybWF0OiAwMTIwOQorICAgIG15ICRmb3JtYXQxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJzAwMDAwJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJzAxMjA5JywgJGZvcm1hdDEpOworCisgICAgIyBXcml0ZSBleHBsaWNpdGx5IGFzIGEgc3RyaW5nOiAwMTIwOQorICAgICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZygnQTMnLCAnMDEyMDknKTsKKworICAgICMgV3JpdGUgaW1wbGljaXRseSBhcyBhIHN0cmluZzogMDEyMDkKKyAgICAkd29ya3NoZWV0LT5rZWVwX2xlYWRpbmdfemVyb3MoKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTQnLCAnMDEyMDknKTsKKworCitUaGUgYWJvdmUgY29kZSB3b3VsZCBnZW5lcmF0ZSBhIHdvcmtzaGVldCB0aGF0IGxvb2tlZCBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8ICAgfCAgICAgQSAgICAgfCAgICAgQiAgICAgfCAgICAgQyAgICAgfCAgICAgRCAgICAgfCAuLi4KKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8IDEgfCAgICAgIDEyMDkgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAuLi4KKyAgICB8IDIgfCAgICAgMDEyMDkgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAuLi4KKyAgICB8IDMgfCAwMTIwOSAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAuLi4KKyAgICB8IDQgfCAwMTIwOSAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAuLi4KKworCitUaGUgZXhhbXBsZXMgYXJlIG9uIGRpZmZlcmVudCBzaWRlcyBvZiB0aGUgY2VsbHMgZHVlIHRvIHRoZSBmYWN0IHRoYXQgRXhjZWwgZGlzcGxheXMgc3RyaW5ncyB3aXRoIGEgbGVmdCBqdXN0aWZpY2F0aW9uIGFuZCBudW1iZXJzIHdpdGggYSByaWdodCBqdXN0aWZpY2F0aW9uIGJ5IGRlZmF1bHQuIFlvdSBjYW4gY2hhbmdlIHRoaXMgYnkgdXNpbmcgYSBmb3JtYXQgdG8ganVzdGlmeSB0aGUgZGF0YSwgc2VlIEw8Q0VMTCBGT1JNQVRUSU5HPi4KKworSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgaWYgdGhlIHVzZXIgZWRpdHMgdGhlIGRhdGEgaW4gZXhhbXBsZXMgQzxBMz4gYW5kIEM8QTQ+IHRoZSBzdHJpbmdzIHdpbGwgcmV2ZXJ0IGJhY2sgdG8gbnVtYmVycy4gQWdhaW4gdGhpcyBpcyBFeGNlbCdzIGRlZmF1bHQgYmVoYXZpb3VyLiBUbyBhdm9pZCB0aGlzIHlvdSBjYW4gdXNlIHRoZSB0ZXh0IGZvcm1hdCBDPEA+OgorCisgICAgIyBGb3JtYXQgYXMgYSBzdHJpbmcgKDAxMjA5KQorICAgIG15ICRmb3JtYXQyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ0AnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJ0E1JywgJzAxMjA5JywgJGZvcm1hdDIpOworCitUaGUgQzxrZWVwX2xlYWRpbmdfemVyb3MoKT4gcHJvcGVydHkgaXMgb2ZmIGJ5IGRlZmF1bHQuIFRoZSBDPGtlZXBfbGVhZGluZ196ZXJvcygpPiBtZXRob2QgdGFrZXMgMCBvciAxIGFzIGFuIGFyZ3VtZW50LiBJdCBkZWZhdWx0cyB0byAxIGlmIGFuIGFyZ3VtZW50IGlzbid0IHNwZWNpZmllZDoKKworICAgICR3b3Jrc2hlZXQtPmtlZXBfbGVhZGluZ196ZXJvcygpOyAgIyBTZXQgb24KKyAgICAkd29ya3NoZWV0LT5rZWVwX2xlYWRpbmdfemVyb3MoMSk7ICMgU2V0IG9uCisgICAgJHdvcmtzaGVldC0+a2VlcF9sZWFkaW5nX3plcm9zKDApOyAjIFNldCBvZmYKKworU2VlIGFsc28gdGhlIEM8YWRkX3dyaXRlX2hhbmRsZXIoKT4gbWV0aG9kLgorCisKKz1oZWFkMiB3cml0ZV9ibGFuaygkcm93LCAkY29sdW1uLCAkZm9ybWF0KQorCitXcml0ZSBhIGJsYW5rIGNlbGwgc3BlY2lmaWVkIGJ5IEM8JHJvdz4gYW5kIEM8JGNvbHVtbj46CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9ibGFuaygwLCAwLCAkZm9ybWF0KTsKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhZGQgZm9ybWF0dGluZyB0byBhIGNlbGwgd2hpY2ggZG9lc24ndCBjb250YWluIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZS4KKworRXhjZWwgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBhbiAiRW1wdHkiIGNlbGwgYW5kIGEgIkJsYW5rIiBjZWxsLiBBbiAiRW1wdHkiIGNlbGwgaXMgYSBjZWxsIHdoaWNoIGRvZXNuJ3QgY29udGFpbiBkYXRhIHdoaWxzdCBhICJCbGFuayIgY2VsbCBpcyBhIGNlbGwgd2hpY2ggZG9lc24ndCBjb250YWluIGRhdGEgYnV0IGRvZXMgY29udGFpbiBmb3JtYXR0aW5nLiBFeGNlbCBzdG9yZXMgIkJsYW5rIiBjZWxscyBidXQgaWdub3JlcyAiRW1wdHkiIGNlbGxzLgorCitBcyBzdWNoLCBpZiB5b3Ugd3JpdGUgYW4gZW1wdHkgY2VsbCB3aXRob3V0IGZvcm1hdHRpbmcgaXQgaXMgaWdub3JlZDoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICB1bmRlZiwgJGZvcm1hdCk7ICMgd3JpdGVfYmxhbmsoKQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICB1bmRlZiAgICAgICAgICk7ICMgSWdub3JlZAorCitUaGlzIHNlZW1pbmdseSB1bmludGVyZXN0aW5nIGZhY3QgbWVhbnMgdGhhdCB5b3UgY2FuIHdyaXRlIGFycmF5cyBvZiBkYXRhIHdpdGhvdXQgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHVuZGVmIG9yIGVtcHR5IHN0cmluZyB2YWx1ZXMuCisKK1NlZSB0aGUgbm90ZSBhYm91dCBMPENlbGwgbm90YXRpb24+LgorCisKKworCis9aGVhZDIgd3JpdGVfcm93KCRyb3csICRjb2x1bW4sICRhcnJheV9yZWYsICRmb3JtYXQpCisKK1RoZSBDPHdyaXRlX3JvdygpPiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYSAxRCBvciAyRCBhcnJheSBvZiBkYXRhIGluIG9uZSBnby4gVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnZlcnRpbmcgdGhlIHJlc3VsdHMgb2YgYSBkYXRhYmFzZSBxdWVyeSBpbnRvIGFuIEV4Y2VsIHdvcmtzaGVldC4gWW91IG11c3QgcGFzcyBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgb2YgZGF0YSByYXRoZXIgdGhhbiB0aGUgYXJyYXkgaXRzZWxmLiBUaGUgQzx3cml0ZSgpPiBtZXRob2QgaXMgdGhlbiBjYWxsZWQgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgZGF0YS4gRm9yIGV4YW1wbGU6CisKKyAgICBAYXJyYXkgICAgICA9ICgnYXdrJywgJ2dhd2snLCAnbWF3aycpOworICAgICRhcnJheV9yZWYgID0gXEBhcnJheTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX3JvdygwLCAwLCAkYXJyYXlfcmVmKTsKKworICAgICMgVGhlIGFib3ZlIGV4YW1wbGUgaXMgZXF1aXZhbGVudCB0bzoKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAkYXJyYXlbMF0pOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsICRhcnJheVsxXSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgJGFycmF5WzJdKTsKKworCitOb3RlOiBGb3IgY29udmVuaWVuY2UgdGhlIEM8d3JpdGUoKT4gbWV0aG9kIGJlaGF2ZXMgaW4gdGhlIHNhbWUgd2F5IGFzIEM8d3JpdGVfcm93KCk+IGlmIGl0IGlzIHBhc3NlZCBhbiBhcnJheSByZWZlcmVuY2UuIFRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIHR3byBtZXRob2QgY2FsbHMgYXJlIGVxdWl2YWxlbnQ6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9yb3coJ0ExJywgJGFycmF5X3JlZik7ICMgV3JpdGUgYSByb3cgb2YgZGF0YQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCAgICAnQTEnLCAkYXJyYXlfcmVmKTsgIyBTYW1lIHRoaW5nCisKK0FzIHdpdGggYWxsIG9mIHRoZSB3cml0ZSBtZXRob2RzIHRoZSBDPCRmb3JtYXQ+IHBhcmFtZXRlciBpcyBvcHRpb25hbC4gSWYgYSBmb3JtYXQgaXMgc3BlY2lmaWVkIGl0IGlzIGFwcGxpZWQgdG8gYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgZGF0YSBhcnJheS4KKworQXJyYXkgcmVmZXJlbmNlcyB3aXRoaW4gdGhlIGRhdGEgd2lsbCBiZSB0cmVhdGVkIGFzIGNvbHVtbnMuIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZSAyRCBhcnJheXMgb2YgZGF0YSBpbiBvbmUgZ28uIEZvciBleGFtcGxlOgorCisgICAgQGVlYyA9ICAoCisgICAgICAgICAgICAgICAgWydtYWdnaWUnLCAnbWlsbHknLCAnbW9sbHknLCAnbWF5JyAgXSwKKyAgICAgICAgICAgICAgICBbMTMsICAgICAgIDE0LCAgICAgIDE1LCAgICAgIDE2ICAgICBdLAorICAgICAgICAgICAgICAgIFsnc2hlbGwnLCAgJ3N0YXInLCAgJ2NyYWInLCAgJ3N0b25lJ10KKyAgICAgICAgICAgICk7CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9yb3coJ0ExJywgXEBlZWMpOworCisKK1dvdWxkIHByb2R1Y2UgYSB3b3Jrc2hlZXQgYXMgZm9sbG93czoKKworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgICB8ICAgIEEgICAgfCAgICBCICAgIHwgICAgQyAgICB8ICAgIEQgICAgfCAgICBFICAgIHwgLi4uCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgfCAxIHwgbWFnZ2llICB8IDEzICAgICAgfCBzaGVsbCAgIHwgLi4uICAgICB8ICAuLi4gICAgfCAuLi4KKyAgICB8IDIgfCBtaWxseSAgIHwgMTQgICAgICB8IHN0YXIgICAgfCAuLi4gICAgIHwgIC4uLiAgICB8IC4uLgorICAgIHwgMyB8IG1vbGx5ICAgfCAxNSAgICAgIHwgY3JhYiAgICB8IC4uLiAgICAgfCAgLi4uICAgIHwgLi4uCisgICAgfCA0IHwgbWF5ICAgICB8IDE2ICAgICAgfCBzdG9uZSAgIHwgLi4uICAgICB8ICAuLi4gICAgfCAuLi4KKyAgICB8IDUgfCAuLi4gICAgIHwgLi4uICAgICB8IC4uLiAgICAgfCAuLi4gICAgIHwgIC4uLiAgICB8IC4uLgorICAgIHwgNiB8IC4uLiAgICAgfCAuLi4gICAgIHwgLi4uICAgICB8IC4uLiAgICAgfCAgLi4uICAgIHwgLi4uCisKKworVG8gd3JpdGUgdGhlIGRhdGEgaW4gYSByb3ctY29sdW1uIG9yZGVyIHJlZmVyIHRvIHRoZSBDPHdyaXRlX2NvbCgpPiBtZXRob2QgYmVsb3cuCisKK0FueSBDPHVuZGVmPiB2YWx1ZXMgaW4gdGhlIGRhdGEgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyBhIGZvcm1hdCBpcyBhcHBsaWVkIHRvIHRoZSBkYXRhLCBpbiB3aGljaCBjYXNlIGEgZm9ybWF0dGVkIGJsYW5rIGNlbGwgd2lsbCBiZSB3cml0dGVuLiBJbiBlaXRoZXIgY2FzZSB0aGUgYXBwcm9wcmlhdGUgcm93IG9yIGNvbHVtbiB2YWx1ZSB3aWxsIHN0aWxsIGJlIGluY3JlbWVudGVkLgorCitUbyBmaW5kIG91dCBtb3JlIGFib3V0IGFycmF5IHJlZmVyZW5jZXMgcmVmZXIgdG8gQzxwZXJscmVmPiBhbmQgQzxwZXJscmVmdHV0PiBpbiB0aGUgbWFpbiBQZXJsIGRvY3VtZW50YXRpb24uIFRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgMkQgYXJyYXlzIG9yICJsaXN0cyBvZiBsaXN0cyIgcmVmZXIgdG8gQzxwZXJsbG9sPi4KKworVGhlIEM8d3JpdGVfcm93KCk+IG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBlcnJvciBlbmNvdW50ZXJlZCB3aGVuIHdyaXRpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBkYXRhIG9yIHplcm8gaWYgbm8gZXJyb3JzIHdlcmUgZW5jb3VudGVyZWQuIFNlZSB0aGUgcmV0dXJuIHZhbHVlcyBkZXNjcmliZWQgZm9yIHRoZSBDPHdyaXRlKCk+IG1ldGhvZCBhYm92ZS4KKworU2VlIGFsc28gdGhlIEM8d3JpdGVfYXJyYXlzLnBsPiBwcm9ncmFtIGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3Rvcnkgb2YgdGhlIGRpc3Ryby4KKworVGhlIEM8d3JpdGVfcm93KCk+IG1ldGhvZCBhbGxvd3MgdGhlIGZvbGxvd2luZyBpZGlvbWF0aWMgY29udmVyc2lvbiBvZiBhIHRleHQgZmlsZSB0byBhbiBFeGNlbCBmaWxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdmaWxlLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG9wZW4gSU5QVVQsICdmaWxlLnR4dCcgb3IgZGllICJDb3VsZG4ndCBvcGVuIGZpbGU6ICQhIjsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCQuLTEsIDAsIFtzcGxpdF0pIHdoaWxlIDxJTlBVVD47CisKKworCisKKz1oZWFkMiB3cml0ZV9jb2woJHJvdywgJGNvbHVtbiwgJGFycmF5X3JlZiwgJGZvcm1hdCkKKworVGhlIEM8d3JpdGVfY29sKCk+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byB3cml0ZSBhIDFEIG9yIDJEIGFycmF5IG9mIGRhdGEgaW4gb25lIGdvLiBUaGlzIGlzIHVzZWZ1bCBmb3IgY29udmVydGluZyB0aGUgcmVzdWx0cyBvZiBhIGRhdGFiYXNlIHF1ZXJ5IGludG8gYW4gRXhjZWwgd29ya3NoZWV0LiBZb3UgbXVzdCBwYXNzIGEgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSBvZiBkYXRhIHJhdGhlciB0aGFuIHRoZSBhcnJheSBpdHNlbGYuIFRoZSBDPHdyaXRlKCk+IG1ldGhvZCBpcyB0aGVuIGNhbGxlZCBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBkYXRhLiBGb3IgZXhhbXBsZToKKworICAgIEBhcnJheSAgICAgID0gKCdhd2snLCAnZ2F3aycsICdtYXdrJyk7CisgICAgJGFycmF5X3JlZiAgPSBcQGFycmF5OworCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29sKDAsIDAsICRhcnJheV9yZWYpOworCisgICAgIyBUaGUgYWJvdmUgZXhhbXBsZSBpcyBlcXVpdmFsZW50IHRvOgorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICRhcnJheVswXSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMCwgJGFycmF5WzFdKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAwLCAkYXJyYXlbMl0pOworCitBcyB3aXRoIGFsbCBvZiB0aGUgd3JpdGUgbWV0aG9kcyB0aGUgQzwkZm9ybWF0PiBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuIElmIGEgZm9ybWF0IGlzIHNwZWNpZmllZCBpdCBpcyBhcHBsaWVkIHRvIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIGRhdGEgYXJyYXkuCisKK0FycmF5IHJlZmVyZW5jZXMgd2l0aGluIHRoZSBkYXRhIHdpbGwgYmUgdHJlYXRlZCBhcyByb3dzLiBUaGlzIGFsbG93cyB5b3UgdG8gd3JpdGUgMkQgYXJyYXlzIG9mIGRhdGEgaW4gb25lIGdvLiBGb3IgZXhhbXBsZToKKworICAgIEBlZWMgPSAgKAorICAgICAgICAgICAgICAgIFsnbWFnZ2llJywgJ21pbGx5JywgJ21vbGx5JywgJ21heScgIF0sCisgICAgICAgICAgICAgICAgWzEzLCAgICAgICAxNCwgICAgICAxNSwgICAgICAxNiAgICAgXSwKKyAgICAgICAgICAgICAgICBbJ3NoZWxsJywgICdzdGFyJywgICdjcmFiJywgICdzdG9uZSddCisgICAgICAgICAgICApOworCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29sKCdBMScsIFxAZWVjKTsKKworCitXb3VsZCBwcm9kdWNlIGEgd29ya3NoZWV0IGFzIGZvbGxvd3M6CisKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8ICAgfCAgICBBICAgIHwgICAgQiAgICB8ICAgIEMgICAgfCAgICBEICAgIHwgICAgRSAgICB8IC4uLgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgMSB8IG1hZ2dpZSAgfCBtaWxseSAgIHwgbW9sbHkgICB8IG1heSAgICAgfCAgLi4uICAgIHwgLi4uCisgICAgfCAyIHwgMTMgICAgICB8IDE0ICAgICAgfCAxNSAgICAgIHwgMTYgICAgICB8ICAuLi4gICAgfCAuLi4KKyAgICB8IDMgfCBzaGVsbCAgIHwgc3RhciAgICB8IGNyYWIgICAgfCBzdG9uZSAgIHwgIC4uLiAgICB8IC4uLgorICAgIHwgNCB8IC4uLiAgICAgfCAuLi4gICAgIHwgLi4uICAgICB8IC4uLiAgICAgfCAgLi4uICAgIHwgLi4uCisgICAgfCA1IHwgLi4uICAgICB8IC4uLiAgICAgfCAuLi4gICAgIHwgLi4uICAgICB8ICAuLi4gICAgfCAuLi4KKyAgICB8IDYgfCAuLi4gICAgIHwgLi4uICAgICB8IC4uLiAgICAgfCAuLi4gICAgIHwgIC4uLiAgICB8IC4uLgorCisKK1RvIHdyaXRlIHRoZSBkYXRhIGluIGEgY29sdW1uLXJvdyBvcmRlciByZWZlciB0byB0aGUgQzx3cml0ZV9yb3coKT4gbWV0aG9kIGFib3ZlLgorCitBbnkgQzx1bmRlZj4gdmFsdWVzIGluIHRoZSBkYXRhIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgYSBmb3JtYXQgaXMgYXBwbGllZCB0byB0aGUgZGF0YSwgaW4gd2hpY2ggY2FzZSBhIGZvcm1hdHRlZCBibGFuayBjZWxsIHdpbGwgYmUgd3JpdHRlbi4gSW4gZWl0aGVyIGNhc2UgdGhlIGFwcHJvcHJpYXRlIHJvdyBvciBjb2x1bW4gdmFsdWUgd2lsbCBzdGlsbCBiZSBpbmNyZW1lbnRlZC4KKworQXMgbm90ZWQgYWJvdmUgdGhlIEM8d3JpdGUoKT4gbWV0aG9kIGNhbiBiZSB1c2VkIGFzIGEgc3lub255bSBmb3IgQzx3cml0ZV9yb3coKT4gYW5kIEM8d3JpdGVfcm93KCk+IGhhbmRsZXMgbmVzdGVkIGFycmF5IHJlZnMgYXMgY29sdW1ucy4gVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIHR3byBtZXRob2QgY2FsbHMgYXJlIGVxdWl2YWxlbnQgYWx0aG91Z2ggdGhlIG1vcmUgZXhwbGljaXQgY2FsbCB0byBDPHdyaXRlX2NvbCgpPiB3b3VsZCBiZSBwcmVmZXJhYmxlIGZvciBtYWludGFpbmFiaWxpdHk6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb2woJ0ExJywgJGFycmF5X3JlZiAgICApOyAjIFdyaXRlIGEgY29sdW1uIG9mIGRhdGEKKyAgICAkd29ya3NoZWV0LT53cml0ZSggICAgJ0ExJywgWyAkYXJyYXlfcmVmIF0pOyAjIFNhbWUgdGhpbmcKKworVG8gZmluZCBvdXQgbW9yZSBhYm91dCBhcnJheSByZWZlcmVuY2VzIHJlZmVyIHRvIEM8cGVybHJlZj4gYW5kIEM8cGVybHJlZnR1dD4gaW4gdGhlIG1haW4gUGVybCBkb2N1bWVudGF0aW9uLiBUbyBmaW5kIG91dCBtb3JlIGFib3V0IDJEIGFycmF5cyBvciAibGlzdHMgb2YgbGlzdHMiIHJlZmVyIHRvIEM8cGVybGxvbD4uCisKK1RoZSBDPHdyaXRlX2NvbCgpPiBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQgd2hlbiB3cml0aW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgZGF0YSBvciB6ZXJvIGlmIG5vIGVycm9ycyB3ZXJlIGVuY291bnRlcmVkLiBTZWUgdGhlIHJldHVybiB2YWx1ZXMgZGVzY3JpYmVkIGZvciB0aGUgQzx3cml0ZSgpPiBtZXRob2QgYWJvdmUuCisKK1NlZSBhbHNvIHRoZSBDPHdyaXRlX2FycmF5cy5wbD4gcHJvZ3JhbSBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKKworCisKKz1oZWFkMiB3cml0ZV9kYXRlX3RpbWUoJHJvdywgJGNvbCwgJGRhdGVfc3RyaW5nLCAkZm9ybWF0KQorCitUaGUgQzx3cml0ZV9kYXRlX3RpbWUoKT4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGEgZGF0ZSBvciB0aW1lIHRvIHRoZSBjZWxsIHNwZWNpZmllZCBieSBDPCRyb3c+IGFuZCBDPCRjb2x1bW4+OgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfZGF0ZV90aW1lKCdBMScsICcyMDA0LTA1LTEzVDIzOjIwJywgJGRhdGVfZm9ybWF0KTsKKworVGhlIEM8JGRhdGVfc3RyaW5nPiBzaG91bGQgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgICB5eXl5LW1tLWRkVGhoOm1tOnNzLnNzcworCitUaGlzIGNvbmZvcm1zIHRvIGFuIElTTzg2MDEgZGF0ZSBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIGZ1bGwgcmFuZ2Ugb2YgSVNPODYwMSBmb3JtYXRzIGFyZSBub3Qgc3VwcG9ydGVkLgorCitUaGUgZm9sbG93aW5nIHZhcmlhdGlvbnMgb24gdGhlIEM8JGRhdGVfc3RyaW5nPiBwYXJhbWV0ZXIgYXJlIHBlcm1pdHRlZDoKKworICAgIHl5eXktbW0tZGRUaGg6bW06c3Muc3NzICAgICAgICAgIyBTdGFuZGFyZCBmb3JtYXQKKyAgICB5eXl5LW1tLWRkVCAgICAgICAgICAgICAgICAgICAgICMgTm8gdGltZQorICAgICAgICAgICAgICBUaGg6bW06c3Muc3NzICAgICAgICAgIyBObyBkYXRlCisgICAgeXl5eS1tbS1kZFRoaDptbTpzcy5zc3NaICAgICAgICAjIEFkZGl0aW9uYWwgWiAoYnV0IG5vdCB0aW1lIHpvbmVzKQorICAgIHl5eXktbW0tZGRUaGg6bW06c3MgICAgICAgICAgICAgIyBObyBmcmFjdGlvbmFsIHNlY29uZHMKKyAgICB5eXl5LW1tLWRkVGhoOm1tICAgICAgICAgICAgICAgICMgTm8gc2Vjb25kcworCitOb3RlIHRoYXQgdGhlIEM8VD4gaXMgcmVxdWlyZWQgaW4gYWxsIGNhc2VzLgorCitBIGRhdGUgc2hvdWxkIGFsd2F5cyBoYXZlIGEgQzwkZm9ybWF0Piwgb3RoZXJ3aXNlIGl0IHdpbGwgYXBwZWFyIGFzIGEgbnVtYmVyLCBzZWUgTDxEQVRFUyBBTkQgVElNRSBJTiBFWENFTD4gYW5kIEw8Q0VMTCBGT1JNQVRUSU5HPi4gSGVyZSBpcyBhIHR5cGljYWwgZXhhbXBsZToKKworICAgIG15ICRkYXRlX2Zvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICdtbS9kZC95eScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2RhdGVfdGltZSgnQTEnLCAnMjAwNC0wNS0xM1QyMzoyMCcsICRkYXRlX2Zvcm1hdCk7CisKK1ZhbGlkIGRhdGVzIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgMTkwMC0wMS0wMSB0byA5OTk5LTEyLTMxLCBmb3IgdGhlIDE5MDAgZXBvY2ggYW5kIDE5MDQtMDEtMDEgdG8gOTk5OS0xMi0zMSwgZm9yIHRoZSAxOTA0IGVwb2NoLiBBcyB3aXRoIEV4Y2VsLCBkYXRlcyBvdXRzaWRlIHRoZXNlIHJhbmdlcyB3aWxsIGJlIHdyaXR0ZW4gYXMgYSBzdHJpbmcuCisKK1NlZSBhbHNvIHRoZSBkYXRlX3RpbWUucGwgcHJvZ3JhbSBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKKworCisKKz1oZWFkMiB3cml0ZV91cmwoJHJvdywgJGNvbCwgJHVybCwgJGxhYmVsLCAkZm9ybWF0KQorCitXcml0ZSBhIGh5cGVybGluayB0byBhIFVSTCBpbiB0aGUgY2VsbCBzcGVjaWZpZWQgYnkgQzwkcm93PiBhbmQgQzwkY29sdW1uPi4gVGhlIGh5cGVybGluayBpcyBjb21wcmlzZWQgb2YgdHdvIGVsZW1lbnRzOiB0aGUgdmlzaWJsZSBsYWJlbCBhbmQgdGhlIGludmlzaWJsZSBsaW5rLiBUaGUgdmlzaWJsZSBsYWJlbCBpcyB0aGUgc2FtZSBhcyB0aGUgbGluayB1bmxlc3MgYW4gYWx0ZXJuYXRpdmUgbGFiZWwgaXMgc3BlY2lmaWVkLiBUaGUgcGFyYW1ldGVycyBDPCRsYWJlbD4gYW5kIHRoZSBDPCRmb3JtYXQ+IGFyZSBvcHRpb25hbCBhbmQgdGhlaXIgcG9zaXRpb24gaXMgaW50ZXJjaGFuZ2VhYmxlLgorCitUaGUgbGFiZWwgaXMgd3JpdHRlbiB1c2luZyB0aGUgQzx3cml0ZSgpPiBtZXRob2QuIFRoZXJlZm9yZSBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBzdHJpbmdzLCBudW1iZXJzIG9yIGZvcm11bGFzIGFzIGxhYmVscy4KKworVGhlcmUgYXJlIGZvdXIgd2ViIHN0eWxlIFVSSSdzIHN1cHBvcnRlZDogQzxodHRwOi8vPiwgQzxodHRwczovLz4sIEM8ZnRwOi8vPiBhbmQgIEM8bWFpbHRvOj46CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoMCwgMCwgICdmdHA6Ly93d3cucGVybC5vcmcvJyAgICAgICAgICAgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKDEsIDAsICAnaHR0cDovL3d3dy5wZXJsLmNvbS8nLCAnUGVybCBob21lJyAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTMnLCAgJ2h0dHA6Ly93d3cucGVybC5jb20vJywgJGZvcm1hdCAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoJ0E0JywgICdodHRwOi8vd3d3LnBlcmwuY29tLycsICdQZXJsJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBNScsICAnbWFpbHRvOmptY25hbWFyYUBjcGFuLm9yZycgICAgICAgICAgICApOworCitUaGVyZSBhcmUgdHdvIGxvY2FsIFVSSXMgc3VwcG9ydGVkOiBDPGludGVybmFsOj4gYW5kIEM8ZXh0ZXJuYWw6Pi4gVGhlc2UgYXJlIHVzZWQgZm9yIGh5cGVybGlua3MgdG8gaW50ZXJuYWwgd29ya3NoZWV0IHJlZmVyZW5jZXMgb3IgZXh0ZXJuYWwgd29ya2Jvb2sgYW5kIHdvcmtzaGVldCByZWZlcmVuY2VzOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBNicsICAnaW50ZXJuYWw6U2hlZXQyIUExJyAgICAgICAgICAgICAgICAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTcnLCAgJ2ludGVybmFsOlNoZWV0MiFBMScsICAgJGZvcm1hdCAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoJ0E4JywgICdpbnRlcm5hbDpTaGVldDIhQTE6QjInICAgICAgICAgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBOScsICBxe2ludGVybmFsOidTYWxlcyBEYXRhJyFBMX0gICAgICAgICAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTEwJywgJ2V4dGVybmFsOmM6XHRlbXBcZm9vLnhscycgICAgICAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoJ0ExMScsICdleHRlcm5hbDpjOlx0ZW1wXGZvby54bHMjU2hlZXQyIUExJyAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBMTInLCAnZXh0ZXJuYWw6Li5cLi5cLi5cZm9vLnhscycgICAgICAgICAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTEzJywgJ2V4dGVybmFsOi4uXC4uXC4uXGZvby54bHMjU2hlZXQyIUExJyAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoJ0ExMycsICdleHRlcm5hbDpcXFxcTkVUV09SS1xzaGFyZVxmb28ueGxzJyAgICk7CisKK0FsbCBvZiB0aGUgdGhlc2UgVVJJIHR5cGVzIGFyZSByZWNvZ25pc2VkIGJ5IHRoZSBDPHdyaXRlKCk+IG1ldGhvZCwgc2VlIGFib3ZlLgorCitXb3Jrc2hlZXQgcmVmZXJlbmNlcyBhcmUgdHlwaWNhbGx5IG9mIHRoZSBmb3JtIEM8U2hlZXQxIUExPi4gWW91IGNhbiBhbHNvIHJlZmVyIHRvIGEgd29ya3NoZWV0IHJhbmdlIHVzaW5nIHRoZSBzdGFuZGFyZCBFeGNlbCBub3RhdGlvbjogQzxTaGVldDEhQTE6QjI+LgorCitJbiBleHRlcm5hbCBsaW5rcyB0aGUgd29ya2Jvb2sgYW5kIHdvcmtzaGVldCBuYW1lIG11c3QgYmUgc2VwYXJhdGVkIGJ5IHRoZSBDPCM+IGNoYXJhY3RlcjogQzxleHRlcm5hbDpXb3JrYm9vay54bHMjU2hlZXQxIUExJz4uCisKK1lvdSBjYW4gYWxzbyBsaW5rIHRvIGEgbmFtZWQgcmFuZ2UgaW4gdGhlIHRhcmdldCB3b3Jrc2hlZXQuIEZvciBleGFtcGxlIHNheSB5b3UgaGF2ZSBhIG5hbWVkIHJhbmdlIGNhbGxlZCBDPG15X25hbWU+IGluIHRoZSB3b3JrYm9vayBDPGM6XHRlbXBcZm9vLnhscz4geW91IGNvdWxkIGxpbmsgdG8gaXQgYXMgZm9sbG93czoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTE0JywgJ2V4dGVybmFsOmM6XHRlbXBcZm9vLnhscyNteV9uYW1lJyk7CisKK05vdGUsIHlvdSBjYW5ub3QgY3VycmVudGx5IGNyZWF0ZSBuYW1lZCByYW5nZXMgd2l0aCBDPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4KKworRXhjZWwgcmVxdWlyZXMgdGhhdCB3b3Jrc2hlZXQgbmFtZXMgY29udGFpbmluZyBzcGFjZXMgb3Igbm9uIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSBzaW5nbGUgcXVvdGVkIGFzIGZvbGxvd3MgQzwnU2FsZXMgRGF0YSchQTE+LiBJZiB5b3UgbmVlZCB0byBkbyB0aGlzIGluIGEgc2luZ2xlIHF1b3RlZCBzdHJpbmcgdGhlbiB5b3UgY2FuIGVpdGhlciBlc2NhcGUgdGhlIHNpbmdsZSBxdW90ZXMgQzxcJz4gb3IgdXNlIHRoZSBxdW90ZSBvcGVyYXRvciBDPHF7fT4gYXMgZGVzY3JpYmVkIGluIEM8cGVybG9wPiBpbiB0aGUgbWFpbiBQZXJsIGRvY3VtZW50YXRpb24uCisKK0xpbmtzIHRvIG5ldHdvcmsgZmlsZXMgYXJlIGFsc28gc3VwcG9ydGVkLiBNUy9Ob3ZlbGwgTmV0d29yayBmaWxlcyBub3JtYWxseSBiZWdpbiB3aXRoIHR3byBiYWNrIHNsYXNoZXMgYXMgZm9sbG93cyBDPFxcTkVUV09SS1xldGM+LiBJbiBvcmRlciB0byBnZW5lcmF0ZSB0aGlzIGluIGEgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZWQgc3RyaW5nIHlvdSB3aWxsIGhhdmUgdG8gZXNjYXBlIHRoZSBiYWNrc2xhc2hlcywgIEM8J1xcXFxORVRXT1JLXGV0Yyc+LgorCitJZiB5b3UgYXJlIHVzaW5nIGRvdWJsZSBxdW90ZSBzdHJpbmdzIHRoZW4geW91IHNob3VsZCBiZSBjYXJlZnVsIHRvIGVzY2FwZSBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBtZXRhY2hhcmFjdGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiAgc2VlIEM8cGVybGZhcTU6IFdoeSBjYW4ndCBJIHVzZSAiQzpcdGVtcFxmb28iIGluIERPUyBwYXRocz8+LgorCitGaW5hbGx5LCB5b3UgY2FuIGF2b2lkIG1vc3Qgb2YgdGhlc2UgcXVvdGluZyBwcm9ibGVtcyBieSB1c2luZyBmb3J3YXJkIHNsYXNoZXMuIFRoZXNlIGFyZSB0cmFuc2xhdGVkIGludGVybmFsbHkgdG8gYmFja3NsYXNoZXM6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoJ0ExNCcsICJleHRlcm5hbDpjOi90ZW1wL2Zvby54bHMiICAgICAgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBMTUnLCAnZXh0ZXJuYWw6Ly9ORVRXT1JLL3NoYXJlL2Zvby54bHMnICAgICApOworCitTZWUgYWxzbywgdGhlIG5vdGUgYWJvdXQgTDxDZWxsIG5vdGF0aW9uPi4KKworCisKKworPWhlYWQyIHdyaXRlX3VybF9yYW5nZSgkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMiwgJHVybCwgJHN0cmluZywgJGZvcm1hdCkKKworVGhpcyBtZXRob2QgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIEM8d3JpdGVfdXJsKCk+IG1ldGhvZCBkZXNjcmliZWQgYWJvdmUuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCB5b3UgY2FuIHNwZWNpZnkgYSBsaW5rIGZvciBhIHJhbmdlIG9mIGNlbGxzOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKDAsIDAsIDAsIDMsICdmdHA6Ly93d3cucGVybC5vcmcvJyAgICAgICAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoMSwgMCwgMCwgMywgJ2h0dHA6Ly93d3cucGVybC5jb20vJywgJ1BlcmwgaG9tZScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTM6RDMnLCAgICAnaW50ZXJuYWw6U2hlZXQyIUExJyAgICAgICAgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBNDpENCcsICAgICdleHRlcm5hbDpjOlx0ZW1wXGZvby54bHMnICAgICAgICAgKTsKKworCitUaGlzIG1ldGhvZCBpcyBnZW5lcmFsbHkgb25seSByZXF1aXJlZCB3aGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBtZXJnZWQgY2VsbHMuIFNlZSB0aGUgQzxtZXJnZV9yYW5nZSgpPiBtZXRob2QgYW5kIHRoZSBDPG1lcmdlPiBwcm9wZXJ0eSBvZiBhIEZvcm1hdCBvYmplY3QsIEw8Q0VMTCBGT1JNQVRUSU5HPi4KKworVGhlcmUgaXMgbm8gd2F5IHRvIGZvcmNlIHRoaXMgYmVoYXZpb3VyIHRocm91Z2ggdGhlIEM8d3JpdGUoKT4gbWV0aG9kLgorCitUaGUgcGFyYW1ldGVycyBDPCRzdHJpbmc+IGFuZCB0aGUgQzwkZm9ybWF0PiBhcmUgb3B0aW9uYWwgYW5kIHRoZWlyIHBvc2l0aW9uIGlzIGludGVyY2hhbmdlYWJsZS4gSG93ZXZlciwgdGhleSBhcmUgYXBwbGllZCBvbmx5IHRvIHRoZSBmaXJzdCBjZWxsIGluIHRoZSByYW5nZS4KKworU2VlIGFsc28sIHRoZSBub3RlIGFib3V0IEw8Q2VsbCBub3RhdGlvbj4uCisKKworCisKKz1oZWFkMiB3cml0ZV9mb3JtdWxhKCRyb3csICRjb2x1bW4sICRmb3JtdWxhLCAkZm9ybWF0LCAkdmFsdWUpCisKK1dyaXRlIGEgZm9ybXVsYSBvciBmdW5jdGlvbiB0byB0aGUgY2VsbCBzcGVjaWZpZWQgYnkgQzwkcm93PiBhbmQgQzwkY29sdW1uPjoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoMCwgMCwgJz0kQiQzICsgQjQnICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoMSwgMCwgJz1TSU4oUEkoKS80KScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoMiwgMCwgJz1TVU0oQjE6QjUpJyApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoJ0E0JywgJz1JRihBMz4xLCJZZXMiLCAiTm8iKScgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoJ0E1JywgJz1BVkVSQUdFKDEsIDIsIDMsIDQpJyAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoJ0E2JywgJz1EQVRFVkFMVUUoIjEtSmFuLTIwMDEiKScpOworCitTZWUgdGhlIG5vdGUgYWJvdXQgTDxDZWxsIG5vdGF0aW9uPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd3JpdGluZyBFeGNlbCBmb3JtdWxhcyBzZWUgTDxGT1JNVUxBUyBBTkQgRlVOQ1RJT05TIElOIEVYQ0VMPgorCitTZWUgYWxzbyB0aGUgc2VjdGlvbiAiSW1wcm92aW5nIHBlcmZvcm1hbmNlIHdoZW4gd29ya2luZyB3aXRoIGZvcm11bGFzIiBhbmQgdGhlIEM8c3RvcmVfZm9ybXVsYSgpPiBhbmQgQzxyZXBlYXRfZm9ybXVsYSgpPiBtZXRob2RzLgorCitJZiByZXF1aXJlZCwgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IHRoZSBjYWxjdWxhdGVkIHZhbHVlIG9mIHRoZSBmb3JtdWxhLiBUaGlzIGlzIG9jY2FzaW9uYWxseSBuZWNlc3Nhcnkgd2hlbiB3b3JraW5nIHdpdGggbm9uLUV4Y2VsIGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IGNhbGN1bGF0ZWQgdGhlIHZhbHVlIG9mIHRoZSBmb3JtdWxhLiBUaGUgY2FsY3VsYXRlZCBDPCR2YWx1ZT4gaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQgbGlzdDoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICc9MisyJywgJGZvcm1hdCwgNCk7CisKK0hvd2V2ZXIsIHRoaXMgcHJvYmFibHkgaXNuJ3Qgc29tZXRoaW5nIHRoYXQgd2lsbCBldmVyIG5lZWQgdG8gZG8uIElmIHlvdSBkbyB1c2UgdGhpcyBmZWF0dXJlIHRoZW4gZG8gc28gd2l0aCBjYXJlLgorCisKKworCis9aGVhZDIgc3RvcmVfZm9ybXVsYSgkZm9ybXVsYSkKKworVGhlIEM8c3RvcmVfZm9ybXVsYSgpPiBtZXRob2QgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEM8cmVwZWF0X2Zvcm11bGEoKT4gdG8gc3BlZWQgdXAgdGhlIGdlbmVyYXRpb24gb2YgcmVwZWF0ZWQgZm9ybXVsYXMuIFNlZSAiSW1wcm92aW5nIHBlcmZvcm1hbmNlIHdoZW4gd29ya2luZyB3aXRoIGZvcm11bGFzIiBpbiBMPEZPUk1VTEFTIEFORCBGVU5DVElPTlMgSU4gRVhDRUw+LgorCitUaGUgQzxzdG9yZV9mb3JtdWxhKCk+IG1ldGhvZCBwcmUtcGFyc2VzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBhIGZvcm11bGEgYW5kIHN0b3JlcyBpdCBmb3IgdXNlIGF0IGEgbGF0ZXIgc3RhZ2UgYnkgdGhlIEM8cmVwZWF0X2Zvcm11bGEoKT4gbWV0aG9kLgorCitDPHN0b3JlX2Zvcm11bGEoKT4gY2FycmllcyB0aGUgc2FtZSBzcGVlZCBwZW5hbHR5IGFzIEM8d3JpdGVfZm9ybXVsYSgpPi4gSG93ZXZlciwgaW4gcHJhY3RpY2UgaXQgd2lsbCBiZSB1c2VkIGxlc3MgZnJlcXVlbnRseS4KKworVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZCBpcyBhIHNjYWxhciB0aGF0IGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgcmVmZXJlbmNlIHRvIGEgZm9ybXVsYS4KKworICAgIG15ICRzaW4gPSAkd29ya3NoZWV0LT5zdG9yZV9mb3JtdWxhKCc9U0lOKEExKScpOworICAgIG15ICRjb3MgPSAkd29ya3NoZWV0LT5zdG9yZV9mb3JtdWxhKCc9Q09TKEExKScpOworCisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0IxJywgJHNpbiwgJGZvcm1hdCwgJ0ExJywgJ0EyJyk7CisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0MxJywgJGNvcywgJGZvcm1hdCwgJ0ExJywgJ0EyJyk7CisKK0FsdGhvdWdoIEM8c3RvcmVfZm9ybXVsYSgpPiBpcyBhIHdvcmtzaGVldCBtZXRob2QgdGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgdXNlZCBpbiBhbnkgd29ya3NoZWV0OgorCisgICAgbXkgJG5vdyA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1OT1coKScpOworCisgICAgJHdvcmtzaGVldDEtPnJlcGVhdF9mb3JtdWxhKCdCMScsICRub3cpOworICAgICR3b3Jrc2hlZXQyLT5yZXBlYXRfZm9ybXVsYSgnQjEnLCAkbm93KTsKKyAgICAkd29ya3NoZWV0My0+cmVwZWF0X2Zvcm11bGEoJ0IxJywgJG5vdyk7CisKKworCis9aGVhZDIgcmVwZWF0X2Zvcm11bGEoJHJvdywgJGNvbCwgJGZvcm11bGEsICRmb3JtYXQsICgkcGF0dGVybiA9PiAkcmVwbGFjZSwgLi4uKSkKKworCitUaGUgQzxyZXBlYXRfZm9ybXVsYSgpPiBtZXRob2QgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEM8c3RvcmVfZm9ybXVsYSgpPiB0byBzcGVlZCB1cCB0aGUgZ2VuZXJhdGlvbiBvZiByZXBlYXRlZCBmb3JtdWxhcy4gIFNlZSAiSW1wcm92aW5nIHBlcmZvcm1hbmNlIHdoZW4gd29ya2luZyB3aXRoIGZvcm11bGFzIiBpbiBMPEZPUk1VTEFTIEFORCBGVU5DVElPTlMgSU4gRVhDRUw+LgorCitJbiBtYW55IHJlc3BlY3RzIEM8cmVwZWF0X2Zvcm11bGEoKT4gYmVoYXZlcyBsaWtlIEM8d3JpdGVfZm9ybXVsYSgpPiBleGNlcHQgdGhhdCBpdCBpcyBzaWduaWZpY2FudGx5IGZhc3Rlci4KKworVGhlIEM8cmVwZWF0X2Zvcm11bGEoKT4gbWV0aG9kIGNyZWF0ZXMgYSBuZXcgZm9ybXVsYSBiYXNlZCBvbiB0aGUgcHJlLXBhcnNlZCB0b2tlbnMgcmV0dXJuZWQgYnkgQzxzdG9yZV9mb3JtdWxhKCk+LiBUaGUgbmV3IGZvcm11bGEgaXMgZ2VuZXJhdGVkIGJ5IHN1YnN0aXR1dGluZyBDPCRwYXR0ZXJuPiwgQzwkcmVwbGFjZT4gcGFpcnMgaW4gdGhlIHN0b3JlZCBmb3JtdWxhOgorCisgICAgbXkgJGZvcm11bGEgPSAkd29ya3NoZWV0LT5zdG9yZV9mb3JtdWxhKCc9QTEgKiAzICsgNTAnKTsKKworICAgIGZvciBteSAkcm93ICgwLi45OSkgeworICAgICAgICAkd29ya3NoZWV0LT5yZXBlYXRfZm9ybXVsYSgkcm93LCAxLCAkZm9ybXVsYSwgJGZvcm1hdCwgJ0ExJywgJ0EnLigkcm93ICsxKSk7CisgICAgfQorCitJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBDPHJlcGVhdF9mb3JtdWxhKCk+IGRvZXNuJ3QgbW9kaWZ5IHRoZSB0b2tlbnMuIEluIHRoZSBhYm92ZSBleGFtcGxlIHRoZSBzdWJzdGl0dXRpb24gaXMgYWx3YXlzIG1hZGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgdG9rZW4sIEM8QTE+LCB3aGljaCBkb2Vzbid0IGNoYW5nZS4KKworQXMgdXN1YWwsIHlvdSBjYW4gdXNlIEM8dW5kZWY+IGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnkgYSBDPCRmb3JtYXQ+OgorCisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0IyJywgJGZvcm11bGEsICRmb3JtYXQsICdBMScsICdBMicpOworICAgICR3b3Jrc2hlZXQtPnJlcGVhdF9mb3JtdWxhKCdCMycsICRmb3JtdWxhLCB1bmRlZiwgICAnQTEnLCAnQTMnKTsKKworVGhlIHN1YnN0aXR1dGlvbnMgYXJlIG1hZGUgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCB5b3UgY2FuIHVzZSBhcyBtYW55IEM8JHBhdHRlcm4+LCBDPCRyZXBsYWNlPiBwYWlycyBhcyB5b3UgbmVlZC4gSG93ZXZlciwgZWFjaCBzdWJzdGl0dXRpb24gaXMgbWFkZSBvbmx5IG9uY2U6CisKKyAgICBteSAkZm9ybXVsYSA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1BMSArIEExJyk7CisKKyAgICAjIEdpdmVzICc9QjEgKyBBMScKKyAgICAkd29ya3NoZWV0LT5yZXBlYXRfZm9ybXVsYSgnQjEnLCAkZm9ybXVsYSwgdW5kZWYsICdBMScsICdCMScpOworCisgICAgIyBHaXZlcyAnPUIxICsgQjEnCisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0IyJywgJGZvcm11bGEsIHVuZGVmLCAoJ0ExJywgJ0IxJykgeCAyKTsKKworU2luY2UgdGhlIEM8JHBhdHRlcm4+IGlzIGludGVycG9sYXRlZCBlYWNoIHRpbWUgdGhhdCBpdCBpcyB1c2VkIGl0IGlzIHdvcnRoIHVzaW5nIHRoZSBDPHFyPiBvcGVyYXRvciB0byBxdW90ZSB0aGUgcGF0dGVybi4gVGhlIEM8cXI+IG9wZXJhdG9yIGlzIGV4cGxhaW5lZCBpbiB0aGUgQzxwZXJsb3A+IG1hbiBwYWdlLgorCisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0IxJywgJGZvcm11bGEsICRmb3JtYXQsIHFyL0ExLywgJ0EyJyk7CisKK0NhcmUgc2hvdWxkIGJlIHRha2VuIHdpdGggdGhlIHZhbHVlcyB0aGF0IGFyZSBzdWJzdGl0dXRlZC4gVGhlIGZvcm11bGEgcmV0dXJuZWQgYnkgQzxyZXBlYXRfZm9ybXVsYSgpPiBjb250YWlucyBzZXZlcmFsIG90aGVyIHRva2VucyBpbiBhZGRpdGlvbiB0byB0aG9zZSBpbiB0aGUgZm9ybXVsYSBhbmQgdGhlc2UgbWlnaHQgYWxzbyBtYXRjaCB0aGUgIHBhdHRlcm4gdGhhdCB5b3UgYXJlIHRyeWluZyB0byByZXBsYWNlLiBJbiBwYXJ0aWN1bGFyIHlvdSBzaG91bGQgYXZvaWQgc3Vic3RpdHV0aW5nIGEgc2luZ2xlIDAsIDEsIDIgb3IgMy4KKworWW91IHNob3VsZCBhbHNvIGJlIGNhcmVmdWwgdG8gYXZvaWQgZmFsc2UgbWF0Y2hlcy4gRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBzbmlwcGV0IGlzIG1lYW50IHRvIGNoYW5nZSB0aGUgc3RvcmVkIGZvcm11bGEgaW4gc3RlcHMgZnJvbSBDPD1BMSArIFNJTihBMSk+IHRvIEM8PUExMCArIFNJTihBMTApPi4KKworICAgIG15ICRmb3JtdWxhID0gJHdvcmtzaGVldC0+c3RvcmVfZm9ybXVsYSgnPUExICsgU0lOKEExKScpOworCisgICAgZm9yIG15ICRyb3cgKDEgLi4gMTApIHsKKyAgICAgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJHJvdyAtMSwgMSwgJGZvcm11bGEsIHVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXcvQTEvLCAnQScgLiAkcm93LCAgICMhIEJhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF3L0ExLywgJ0EnIC4gJHJvdyAgICAjISBCYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9CisKK0hvd2V2ZXIgaXQgY29udGFpbnMgYSBidWcuIEluIHRoZSBsYXN0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB3aGVuIEM8JHJvdz4gaXMgMTAgdGhlIGZvbGxvd2luZyBzdWJzdGl0dXRpb25zIHdpbGwgb2NjdXI6CisKKyAgICBzL0ExL0ExMC87ICAgIGNoYW5nZXMgICAgPUExICsgU0lOKEExKSAgICAgdG8gICAgPUExMCArIFNJTihBMSkKKyAgICBzL0ExL0ExMC87ICAgIGNoYW5nZXMgICAgPUExMCArIFNJTihBMSkgICAgdG8gICAgPUExMDAgKyBTSU4oQTEpICMgISEKKworVGhlIHNvbHV0aW9uIGluIHRoaXMgY2FzZSBpcyB0byB1c2UgYSBtb3JlIGV4cGxpY2l0IG1hdGNoIHN1Y2ggYXMgQzxxdy9eQTEkLz46CisKKyAgICAgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJHJvdyAtMSwgMSwgJGZvcm11bGEsIHVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXcvXkExJC8sICdBJyAuICRyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdy9eQTEkLywgJ0EnIC4gJHJvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK0Fub3RoZXIgc2ltaWxhciBwcm9ibGVtIG9jY3VycyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBzdWJzdGl0dXRpb25zIGFyZSBtYWRlIGluIG9yZGVyLiBGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIHNuaXBwZXQgaXMgbWVhbnQgdG8gY2hhbmdlIHRoZSBzdG9yZWQgZm9ybXVsYSBmcm9tIEM8PUExMCArIEExMT4gIHRvIEM8PUExMSArIEExMj46CisKKyAgICBteSAkZm9ybXVsYSA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1BMTAgKyBBMTEnKTsKKworICAgICR3b3Jrc2hlZXQtPnJlcGVhdF9mb3JtdWxhKCdBMScsICRmb3JtdWxhLCB1bmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXcvQTEwLywgJ0ExMScsICAgIyEgQmFkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdy9BMTEvLCAnQTEyJyAgICAjISBCYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitIb3dldmVyLCB0aGUgYWN0dWFsIHN1YnN0aXR1dGlvbiB5aWVsZHMgQzw9QTEyICsgQTExPjoKKworICAgIHMvQTEwL0ExMS87ICAgIGNoYW5nZXMgICAgPUExMCArIEExMSAgICB0byAgICA9QTExICsgQTExCisgICAgcy9BMTEvQTEyLzsgICAgY2hhbmdlcyAgICA9QTExICsgQTExICAgIHRvICAgID1BMTIgKyBBMTEgIyAhIQorCitUaGUgc29sdXRpb24gaGVyZSB3b3VsZCBiZSB0byByZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgc3Vic3RpdHV0aW9ucyBvciB0byBzdGFydCB3aXRoIGEgc3RvcmVkIGZvcm11bGEgdGhhdCB3b24ndCB5aWVsZCBhIGZhbHNlIG1hdGNoIHN1Y2ggYXMgQzw9WDEwICsgWTExPjoKKworICAgIG15ICRmb3JtdWxhID0gJHdvcmtzaGVldC0+c3RvcmVfZm9ybXVsYSgnPVgxMCArIFkxMScpOworCisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0ExJywgJGZvcm11bGEsIHVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdy9YMTAvLCAnQTExJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXcvWTExLywgJ0ExMicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKworSWYgeW91IHRoaW5rIHRoYXQgeW91IGhhdmUgYSBwcm9ibGVtIHJlbGF0ZWQgdG8gYSBmYWxzZSBtYXRjaCB5b3UgY2FuIGNoZWNrIHRoZSB0b2tlbnMgdGhhdCB5b3UgYXJlIHN1YnN0aXR1dGluZyBhZ2FpbnN0IGFzIGZvbGxvd3MuCisKKyAgICBteSAkZm9ybXVsYSA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1BMSo1KzQnKTsKKyAgICBwcmludCAiQCRmb3JtdWxhXG4iOworCitTZWUgYWxzbyB0aGUgQzxyZXBlYXQucGw+IHByb2dyYW0gaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDIgd3JpdGVfY29tbWVudCgkcm93LCAkY29sdW1uLCAkc3RyaW5nLCAuLi4pCisKK1RoZSBDPHdyaXRlX2NvbW1lbnQoKT4gbWV0aG9kIGlzIHVzZWQgdG8gYWRkIGEgY29tbWVudCB0byBhIGNlbGwuIEEgY2VsbCBjb21tZW50IGlzIGluZGljYXRlZCBpbiBFeGNlbCBieSBhIHNtYWxsIHJlZCB0cmlhbmdsZSBpbiB0aGUgdXBwZXIgcmlnaHQtaGFuZCBjb3JuZXIgb2YgdGhlIGNlbGwuIE1vdmluZyB0aGUgY3Vyc29yIG92ZXIgdGhlIHJlZCB0cmlhbmdsZSB3aWxsIHJldmVhbCB0aGUgY29tbWVudC4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBjb21tZW50IHRvIGEgY2VsbDoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlICAgICAgICAoMiwgMiwgJ0hlbGxvJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgyLCAyLCAnVGhpcyBpcyBhIGNvbW1lbnQuJyk7CisKK0FzIHVzdWFsIHlvdSBjYW4gcmVwbGFjZSB0aGUgQzwkcm93PiBhbmQgQzwkY29sdW1uPiBwYXJhbWV0ZXJzIHdpdGggYW4gQzxBMT4gY2VsbCByZWZlcmVuY2UuIFNlZSB0aGUgbm90ZSBhYm91dCBMPENlbGwgbm90YXRpb24+LgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUgICAgICAgICgnQzMnLCAnSGVsbG8nKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDMycsICdUaGlzIGlzIGEgY29tbWVudC4nKTsKKworT24gc3lzdGVtcyB3aXRoIEM8cGVybCA1Ljg+IGFuZCBsYXRlciB0aGUgQzx3cml0ZV9jb21tZW50KCk+IG1ldGhvZCB3aWxsIGFsc28gaGFuZGxlIHN0cmluZ3MgaW4gQzxVVEYtOD4gZm9ybWF0LgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAiXHh7MjYzYX0iKTsgICAgICAgIyBTbWlsZXkKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDNCcsICdDb21tZW50IGNhIHZhPycpOworCitJbiBhZGRpdGlvbiB0byB0aGUgYmFzaWMgMyBhcmd1bWVudCBmb3JtIG9mIEM8d3JpdGVfY29tbWVudCgpPiB5b3UgY2FuIHBhc3MgaW4gc2V2ZXJhbCBvcHRpb25hbCBrZXkvdmFsdWUgcGFpcnMgdG8gY29udHJvbCB0aGUgZm9ybWF0IG9mIHRoZSBjb21tZW50LiBGb3IgZXhhbXBsZToKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJ0hlbGxvJywgdmlzaWJsZSA9PiAxLCBhdXRob3IgPT4gJ1BlcmwnKTsKKworTW9zdCBvZiB0aGVzZSBvcHRpb25zIGFyZSBxdWl0ZSBzcGVjaWZpYyBhbmQgaW4gZ2VuZXJhbCB0aGUgZGVmYXVsdCBjb21tZW50IGJlaGF2aW91ciB3aWxsIGJlIGFsbCB0aGF0IHlvdSBuZWVkLiBIb3dldmVyLCBzaG91bGQgeW91IG5lZWQgZ3JlYXRlciBjb250cm9sIG92ZXIgdGhlIGZvcm1hdCBvZiB0aGUgY2VsbCBjb21tZW50IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgorCisgICAgZW5jb2RpbmcKKyAgICBhdXRob3IKKyAgICBhdXRob3JfZW5jb2RpbmcKKyAgICB2aXNpYmxlCisgICAgeF9zY2FsZQorICAgIHdpZHRoCisgICAgeV9zY2FsZQorICAgIGhlaWdodAorICAgIGNvbG9yCisgICAgc3RhcnRfY2VsbAorICAgIHN0YXJ0X3JvdworICAgIHN0YXJ0X2NvbAorICAgIHhfb2Zmc2V0CisgICAgeV9vZmZzZXQKKworCis9b3ZlciA0CisKKz1pdGVtIE9wdGlvbjogZW5jb2RpbmcKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tZW50IHN0cmluZyBpcyBlbmNvZGVkIGFzIEM8VVRGLTE2QkU+LgorCisgICAgbXkgJGNvbW1lbnQgPSBwYWNrICduJywgMHgyNjNhOyAjIFVURi0xNkJFIFNtaWxleSBzeW1ib2wKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQsIGVuY29kaW5nID0+IDEpOworCitJZiB5b3Ugd2lzaCB0byB1c2UgVW5pY29kZSBjaGFyYWN0ZXJzIGluIHRoZSBjb21tZW50IHN0cmluZyB0aGVuIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGlzIHRvIHVzZSBwZXJsIDUuOCBhbmQgQzxVVEYtOD4gc3RyaW5ncywgc2VlIEw8VU5JQ09ERSBJTiBFWENFTD4uCisKKworPWl0ZW0gT3B0aW9uOiBhdXRob3IKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSB3aG8gdGhlIGF1dGhvciBvZiB0aGUgY29tbWVudCBpcy4gRXhjZWwgZGlzcGxheXMgdGhlIGF1dGhvciBvZiB0aGUgY29tbWVudCBpbiB0aGUgc3RhdHVzIGJhciBhdCB0aGUgYm90dG9tIG9mIHRoZSB3b3Jrc2hlZXQuIFRoaXMgaXMgdXN1YWxseSBvZiBpbnRlcmVzdCBpbiBjb3Jwb3JhdGUgZW52aXJvbm1lbnRzIHdoZXJlIHNldmVyYWwgcGVvcGxlIG1pZ2h0IHJldmlldyBhbmQgcHJvdmlkZSBjb21tZW50cyB0byBhIHdvcmtib29rLgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnQXRvbmVtZW50JywgYXV0aG9yID0+ICdJYW4gTWNFd2FuJyk7CisKKworPWl0ZW0gT3B0aW9uOiBhdXRob3JfZW5jb2RpbmcKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBhdXRob3Igc3RyaW5nIGlzIGVuY29kZWQgYXMgQzxVVEYtMTZCRT4uCisKKworPWl0ZW0gT3B0aW9uOiB2aXNpYmxlCisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gbWFrZSBhIGNlbGwgY29tbWVudCB2aXNpYmxlIHdoZW4gdGhlIHdvcmtzaGVldCBpcyBvcGVuZWQuIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpbiBFeGNlbCBpcyB0aGF0IGNvbW1lbnRzIGFyZSBpbml0aWFsbHkgaGlkZGVuLiBIb3dldmVyLCBpdCBpcyBhbHNvIHBvc3NpYmxlIGluIEV4Y2VsIHRvIG1ha2UgaW5kaXZpZHVhbCBvciBhbGwgY29tbWVudHMgdmlzaWJsZS4gSW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaW5kaXZpZHVhbCBjb21tZW50cyBjYW4gYmUgbWFkZSB2aXNpYmxlIGFzIGZvbGxvd3M6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDMycsICdIZWxsbycsIHZpc2libGUgPT4gMSk7CisKK0l0IGlzIHBvc3NpYmxlIHRvIG1ha2UgYWxsIGNvbW1lbnRzIGluIGEgd29ya3NoZWV0IHZpc2libGUgdXNpbmcgdGhlIEM8c2hvd19jb21tZW50cygpPiB3b3Jrc2hlZXQgbWV0aG9kIChzZWUgYmVsb3cpLiBBbHRlcm5hdGl2ZWx5LCBpZiBhbGwgb2YgdGhlIGNlbGwgY29tbWVudHMgaGF2ZSBiZWVuIG1hZGUgdmlzaWJsZSB5b3UgY2FuIGhpZGUgaW5kaXZpZHVhbCBjb21tZW50czoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJ0hlbGxvJywgdmlzaWJsZSA9PiAwKTsKKworCis9aXRlbSBPcHRpb246IHhfc2NhbGUKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzZXQgdGhlIHdpZHRoIG9mIHRoZSBjZWxsIGNvbW1lbnQgYm94IGFzIGEgZmFjdG9yIG9mIHRoZSBkZWZhdWx0IHdpZHRoLgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCB4X3NjYWxlID0+IDIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0M0JywgJ0hlbGxvJywgeF9zY2FsZSA9PiA0LjIpOworCisKKz1pdGVtIE9wdGlvbjogd2lkdGgKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzZXQgdGhlIHdpZHRoIG9mIHRoZSBjZWxsIGNvbW1lbnQgYm94IGV4cGxpY2l0bHkgaW4gcGl4ZWxzLgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCB3aWR0aCA9PiAyMDApOworCisKKz1pdGVtIE9wdGlvbjogeV9zY2FsZQorCitUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgaGVpZ2h0IG9mIHRoZSBjZWxsIGNvbW1lbnQgYm94IGFzIGEgZmFjdG9yIG9mIHRoZSBkZWZhdWx0IGhlaWdodC4KKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJ0hlbGxvJywgeV9zY2FsZSA9PiAyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDNCcsICdIZWxsbycsIHlfc2NhbGUgPT4gNC4yKTsKKworCis9aXRlbSBPcHRpb246IGhlaWdodAorCitUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgaGVpZ2h0IG9mIHRoZSBjZWxsIGNvbW1lbnQgYm94IGV4cGxpY2l0bHkgaW4gcGl4ZWxzLgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCBoZWlnaHQgPT4gMjAwKTsKKworCis9aXRlbSBPcHRpb246IGNvbG9yCisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG91ciBvZiBjZWxsIGNvbW1lbnQgYm94LiBZb3UgY2FuIHVzZSBvbmUgb2YgdGhlIG5hbWVkIGNvbG91cnMgcmVjb2duaXNlZCBieSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBvciBhIGNvbG91ciBpbmRleC4gU2VlIEw8Q09MT1VSUyBJTiBFWENFTD4uCisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDMycsICdIZWxsbycsIGNvbG9yID0+ICdncmVlbicpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0M0JywgJ0hlbGxvJywgY29sb3IgPT4gMHgzNSk7ICAgICMgT3JhbmdlCisKKworPWl0ZW0gT3B0aW9uOiBzdGFydF9jZWxsCisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBjZWxsIGluIHdoaWNoIHRoZSBjb21tZW50IHdpbGwgYXBwZWFyLiBCeSBkZWZhdWx0IEV4Y2VsIGRpc3BsYXlzIGNvbW1lbnRzIG9uZSBjZWxsIHRvIHRoZSByaWdodCBhbmQgb25lIGNlbGwgYWJvdmUgdGhlIGNlbGwgdG8gd2hpY2ggdGhlIGNvbW1lbnQgcmVsYXRlcy4gSG93ZXZlciwgeW91IGNhbiBjaGFuZ2UgdGhpcyBiZWhhdmlvdXIgaWYgeW91IHdpc2guIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB0aGUgY29tbWVudCB3aGljaCB3b3VsZCBhcHBlYXIgYnkgZGVmYXVsdCBpbiBjZWxsIEM8RDI+IGlzIG1vdmVkIHRvIEM8RTI+LgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCBzdGFydF9jZWxsID0+ICdFMicpOworCisKKz1pdGVtIE9wdGlvbjogc3RhcnRfcm93CisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSByb3cgaW4gd2hpY2ggdGhlIGNvbW1lbnQgd2lsbCBhcHBlYXIuIFNlZSB0aGUgQzxzdGFydF9jZWxsPiBvcHRpb24gYWJvdmUuIFRoZSByb3cgaXMgemVybyBpbmRleGVkLgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCBzdGFydF9yb3cgPT4gMCk7CisKKworPWl0ZW0gT3B0aW9uOiBzdGFydF9jb2wKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzZXQgdGhlIGNvbHVtbiBpbiB3aGljaCB0aGUgY29tbWVudCB3aWxsIGFwcGVhci4gU2VlIHRoZSBDPHN0YXJ0X2NlbGw+IG9wdGlvbiBhYm92ZS4gVGhlIGNvbHVtbiBpcyB6ZXJvIGluZGV4ZWQuCisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDMycsICdIZWxsbycsIHN0YXJ0X2NvbCA9PiA0KTsKKworCis9aXRlbSBPcHRpb246IHhfb2Zmc2V0CisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSB4IG9mZnNldCwgaW4gcGl4ZWxzLCBvZiBhIGNvbW1lbnQgd2l0aGluIGEgY2VsbDoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQsIHhfb2Zmc2V0ID0+IDMwKTsKKworCis9aXRlbSBPcHRpb246IHlfb2Zmc2V0CisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSB5IG9mZnNldCwgaW4gcGl4ZWxzLCBvZiBhIGNvbW1lbnQgd2l0aGluIGEgY2VsbDoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQsIHhfb2Zmc2V0ID0+IDMwKTsKKworCis9YmFjaworCitZb3UgY2FuIGFwcGx5IGFzIG1hbnkgb2YgdGhlc2Ugb3B0aW9ucyBhcyB5b3UgcmVxdWlyZS4KKworQjxOb3RlIGFib3V0IHJvdyBoZWlnaHQgYW5kIGNvbW1lbnRzPi4gSWYgeW91IHNwZWNpZnkgdGhlIGhlaWdodCBvZiBhIHJvdyB0aGF0IGNvbnRhaW5zIGEgY29tbWVudCB0aGVuIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHdpbGwgYWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGNvbW1lbnQgdG8gbWFpbnRhaW4gdGhlIGRlZmF1bHQgb3IgdXNlciBzcGVjaWZpZWQgZGltZW5zaW9ucy4gSG93ZXZlciwgdGhlIGhlaWdodCBvZiBhIHJvdyBjYW4gYWxzbyBiZSBhZGp1c3RlZCBhdXRvbWF0aWNhbGx5IGJ5IEV4Y2VsIGlmIHRoZSB0ZXh0IHdyYXAgcHJvcGVydHkgaXMgc2V0IG9yIGxhcmdlIGZvbnRzIGFyZSB1c2VkIGluIHRoZSBjZWxsLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGhlaWdodCBvZiB0aGUgcm93IGlzIHVua25vd24gdG8gV3JpdGVFeGNlbCBhdCBydW4gdGltZSBhbmQgdGh1cyB0aGUgY29tbWVudCBib3ggaXMgc3RyZXRjaGVkIHdpdGggdGhlIHJvdy4gVXNlIHRoZSBDPHNldF9yb3coKT4gbWV0aG9kIHRvIHNwZWNpZnkgdGhlIHJvdyBoZWlnaHQgZXhwbGljaXRseSBhbmQgYXZvaWQgdGhpcyBwcm9ibGVtLgorCisKKz1oZWFkMiBzaG93X2NvbW1lbnRzKCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBtYWtlIGFsbCBjZWxsIGNvbW1lbnRzIHZpc2libGUgd2hlbiBhIHdvcmtzaGVldCBpcyBvcGVuZWQuCisKK0luZGl2aWR1YWwgY29tbWVudHMgY2FuIGJlIG1hZGUgdmlzaWJsZSB1c2luZyB0aGUgQzx2aXNpYmxlPiBwYXJhbWV0ZXIgb2YgdGhlIEM8d3JpdGVfY29tbWVudD4gbWV0aG9kIChzZWUgYWJvdmUpOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCB2aXNpYmxlID0+IDEpOworCitJZiBhbGwgb2YgdGhlIGNlbGwgY29tbWVudHMgaGF2ZSBiZWVuIG1hZGUgdmlzaWJsZSB5b3UgY2FuIGhpZGUgaW5kaXZpZHVhbCBjb21tZW50cyBhcyBmb2xsb3dzOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCB2aXNpYmxlID0+IDApOworCisKKworCis9aGVhZDIgYWRkX3dyaXRlX2hhbmRsZXIoJHJlLCAkY29kZV9yZWYpCisKK1RoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZXh0ZW5kIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB3cml0ZSgpIG1ldGhvZCB0byBoYW5kbGUgdXNlciBkZWZpbmVkIGRhdGEuCisKK0lmIHlvdSByZWZlciB0byB0aGUgc2VjdGlvbiBvbiBDPHdyaXRlKCk+IGFib3ZlIHlvdSB3aWxsIHNlZSB0aGF0IGl0IGFjdHMgYXMgYW4gYWxpYXMgZm9yIHNldmVyYWwgbW9yZSBzcGVjaWZpYyBDPHdyaXRlXyo+IG1ldGhvZHMuIEhvd2V2ZXIsIGl0IGRvZXNuJ3QgYWx3YXlzIGFjdCBpbiBleGFjdGx5IHRoZSB3YXkgdGhhdCB5b3Ugd291bGQgbGlrZSBpdCB0by4KKworT25lIHNvbHV0aW9uIGlzIHRvIGZpbHRlciB0aGUgaW5wdXQgZGF0YSB5b3Vyc2VsZiBhbmQgY2FsbCB0aGUgYXBwcm9wcmlhdGUgQzx3cml0ZV8qPiBtZXRob2QuIEFub3RoZXIgYXBwcm9hY2ggaXMgdG8gdXNlIHRoZSBDPGFkZF93cml0ZV9oYW5kbGVyKCk+IG1ldGhvZCB0byBhZGQgeW91ciBvd24gYXV0b21hdGVkIGJlaGF2aW91ciB0byBDPHdyaXRlKCk+LgorCitUaGUgQzxhZGRfd3JpdGVfaGFuZGxlcigpPiBtZXRob2QgdGFrZSB0d28gYXJndW1lbnRzLCBDPCRyZT4sIGEgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGluY29taW5nIGRhdGEgYW5kIEM8JGNvZGVfcmVmPiBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgbWF0Y2hlZCBkYXRhOgorCisgICAgJHdvcmtzaGVldC0+YWRkX3dyaXRlX2hhbmRsZXIocXIvXlxkXGRcZFxkJC8sIFwmbXlfd3JpdGUpOworCisoSW4gdGhlIHRoZXNlIGV4YW1wbGVzIHRoZSBDPHFyPiBvcGVyYXRvciBpcyB1c2VkIHRvIHF1b3RlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5ncywgc2VlIEw8cGVybG9wPiBmb3IgbW9yZSBkZXRhaWxzKS4KKworVGhlIG1ldGhvZCBpcyB1c2VkIGFzIGZvbGxvd3MuIHNheSB5b3Ugd2lzaGVkIHRvIHdyaXRlIDcgZGlnaXQgSUQgbnVtYmVycyBhcyBhIHN0cmluZyBzbyB0aGF0IGFueSBsZWFkaW5nIHplcm9zIHdlcmUgcHJlc2VydmVkKiwgeW91IGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAkd29ya3NoZWV0LT5hZGRfd3JpdGVfaGFuZGxlcihxci9eXGR7N30kLywgXCZ3cml0ZV9teV9pZCk7CisKKworICAgIHN1YiB3cml0ZV9teV9pZCB7CisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgcmV0dXJuICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZyhAXyk7CisgICAgfQorCisqIFlvdSBjb3VsZCBhbHNvIHVzZSB0aGUgQzxrZWVwX2xlYWRpbmdfemVyb3MoKT4gbWV0aG9kIGZvciB0aGlzLgorCitUaGVuIGlmIHlvdSBjYWxsIEM8d3JpdGUoKT4gd2l0aCBhbiBhcHByb3ByaWF0ZSBzdHJpbmcgaXQgd2lsbCBiZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHk6CisKKyAgICAjIFdyaXRlcyAwMDAwMDAwLiBJdCB3b3VsZCBub3JtYWxseSBiZSB3cml0dGVuIGFzIGEgbnVtYmVyOyAwLgorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICcwMDAwMDAwJyk7CisKK1RoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgYSByZWZlcmVuY2UgdG8gdGhlIGNhbGxpbmcgd29ya3NoZWV0IGFuZCBhbGwgb2YgdGhlIG90aGVyIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIEM8d3JpdGUoKT4uIFRoZSBjYWxsYmFjayB3aWxsIHNlZSBhbiBDPEBfPiBhcmd1bWVudCBsaXN0IHRoYXQgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOgorCisgICAgJF9bMF0gICBBIHJlZiB0byB0aGUgY2FsbGluZyB3b3Jrc2hlZXQuICoKKyAgICAkX1sxXSAgIFplcm8gYmFzZWQgcm93IG51bWJlci4KKyAgICAkX1syXSAgIFplcm8gYmFzZWQgY29sdW1uIG51bWJlci4KKyAgICAkX1szXSAgIEEgbnVtYmVyIG9yIHN0cmluZyBvciB0b2tlbi4KKyAgICAkX1s0XSAgIEEgZm9ybWF0IHJlZiBpZiBhbnkuCisgICAgJF9bNV0gICBBbnkgb3RoZXIgYXJndW1lbnRzLgorICAgIC4uLgorCisgICAgKiAgSXQgaXMgZ29vZCBzdHlsZSB0byBzaGlmdCB0aGlzIG9mZiB0aGUgbGlzdCBzbyB0aGUgQF8gaXMgdGhlIHNhbWUKKyAgICAgICBhcyB0aGUgYXJndW1lbnQgbGlzdCBzZWVuIGJ5IHdyaXRlKCkuCisKK1lvdXIgY2FsbGJhY2sgc2hvdWxkIEM8cmV0dXJuKCk+IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIEM8d3JpdGVfKj4gbWV0aG9kIHRoYXQgd2FzIGNhbGxlZCBvciBDPHVuZGVmPiB0byBpbmRpY2F0ZSB0aGF0IHlvdSByZWplY3RlZCB0aGUgbWF0Y2ggYW5kIHdhbnQgQzx3cml0ZSgpPiB0byBjb250aW51ZSBhcyBub3JtYWwuCisKK1NvIGZvciBleGFtcGxlIGlmIHlvdSB3aXNoZWQgdG8gYXBwbHkgdGhlIHByZXZpb3VzIGZpbHRlciBvbmx5IHRvIElEIHZhbHVlcyB0aGF0IG9jY3VyIGluIHRoZSBmaXJzdCBjb2x1bW4geW91IGNvdWxkIG1vZGlmeSB5b3VyIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIGZvbGxvd3M6CisKKworICAgIHN1YiB3cml0ZV9teV9pZCB7CisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgbXkgJGNvbCAgICAgICA9ICRfWzFdOworCisgICAgICAgIGlmICgkY29sID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoQF8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBSZWplY3QgdGhlIG1hdGNoIGFuZCByZXR1cm4gY29udHJvbCB0byB3cml0ZSgpCisgICAgICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgICAgIH0KKyAgICB9CisKK05vdywgeW91IHdpbGwgZ2V0IGRpZmZlcmVudCBiZWhhdmlvdXIgZm9yIHRoZSBmaXJzdCBjb2x1bW4gYW5kIG90aGVyIGNvbHVtbnM6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnMDAwMDAwMCcpOyAjIFdyaXRlcyAwMDAwMDAwCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJzAwMDAwMDAnKTsgIyBXcml0ZXMgMAorCisKK1lvdSBtYXkgYWRkIG1vcmUgdGhhbiBvbmUgaGFuZGxlciBpbiB3aGljaCBjYXNlIHRoZXkgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGFkZGVkLgorCitOb3RlLCB0aGUgQzxhZGRfd3JpdGVfaGFuZGxlcigpPiBtZXRob2QgaXMgcGFydGljdWxhcmx5IHN1aXRlZCBmb3IgaGFuZGxpbmcgZGF0ZXMuCisKK1NlZSB0aGUgQzx3cml0ZV9oYW5kbGVyIDEtND4gcHJvZ3JhbXMgaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBmb3IgZnVydGhlciBleGFtcGxlcy4KKworCisKKworPWhlYWQyIGluc2VydF9pbWFnZSgkcm93LCAkY29sLCAkZmlsZW5hbWUsICR4LCAkeSwgJHNjYWxlX3gsICRzY2FsZV95KQorCitUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBpbnNlcnQgYSBpbWFnZSBpbnRvIGEgd29ya3NoZWV0LiBUaGUgaW1hZ2UgY2FuIGJlIGluIFBORywgSlBFRyBvciBCTVAgZm9ybWF0LiBUaGUgQzwkeD4sIEM8JHk+LCBDPCRzY2FsZV94PiBhbmQgQzwkc2NhbGVfeT4gcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwuCisKKyAgICAkd29ya3NoZWV0MS0+aW5zZXJ0X2ltYWdlKCdBMScsICdwZXJsLmJtcCcpOworICAgICR3b3Jrc2hlZXQyLT5pbnNlcnRfaW1hZ2UoJ0ExJywgJy4uL2ltYWdlcy9wZXJsLmJtcCcpOworICAgICR3b3Jrc2hlZXQzLT5pbnNlcnRfaW1hZ2UoJ0ExJywgJy5jOlxpbWFnZXNccGVybC5ibXAnKTsKKworVGhlIHBhcmFtZXRlcnMgQzwkeD4gYW5kIEM8JHk+IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gb2Zmc2V0IGZyb20gdGhlIHRvcCBsZWZ0IGhhbmQgY29ybmVyIG9mIHRoZSBjZWxsIHNwZWNpZmllZCBieSBDPCRyb3c+IGFuZCBDPCRjb2w+LiBUaGUgb2Zmc2V0IHZhbHVlcyBhcmUgaW4gcGl4ZWxzLgorCisgICAgJHdvcmtzaGVldDEtPmluc2VydF9pbWFnZSgnQTEnLCAncGVybC5ibXAnLCAzMiwgMTApOworCitUaGUgZGVmYXVsdCB3aWR0aCBvZiBhIGNlbGwgaXMgNjMgcGl4ZWxzLiBUaGUgZGVmYXVsdCBoZWlnaHQgb2YgYSBjZWxsIGlzIDE3IHBpeGVscy4gVGhlIHBpeGVscyBvZmZzZXRzIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgcmVsYXRpb25zaGlwczoKKworICAgIFdwID0gaW50KDEyV2UpICAgaWYgV2UgPCAgMQorICAgIFdwID0gaW50KDdXZSArNSkgaWYgV2UgPj0gMQorICAgIEhwID0gaW50KDQvM0hlKQorCisgICAgd2hlcmU6CisgICAgV2UgaXMgdGhlIGNlbGwgd2lkdGggaW4gRXhjZWxzIHVuaXRzCisgICAgV3AgaXMgd2lkdGggaW4gcGl4ZWxzCisgICAgSGUgaXMgdGhlIGNlbGwgaGVpZ2h0IGluIEV4Y2VscyB1bml0cworICAgIEhwIGlzIGhlaWdodCBpbiBwaXhlbHMKKworVGhlIG9mZnNldHMgY2FuIGJlIGdyZWF0ZXIgdGhhbiB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSB1bmRlcmx5aW5nIGNlbGwuIFRoaXMgY2FuIGJlIG9jY2FzaW9uYWxseSB1c2VmdWwgaWYgeW91IHdpc2ggdG8gYWxpZ24gdHdvIG9yIG1vcmUgaW1hZ2VzIHJlbGF0aXZlIHRvIHRoZSBzYW1lIGNlbGwuCisKK1RoZSBwYXJhbWV0ZXJzIEM8JHNjYWxlX3g+IGFuZCBDPCRzY2FsZV95PiBjYW4gYmUgdXNlZCB0byBzY2FsZSB0aGUgaW5zZXJ0ZWQgaW1hZ2UgaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5OgorCisgICAgIyBTY2FsZSB0aGUgaW5zZXJ0ZWQgaW1hZ2U6IHdpZHRoIHggMi4wLCBoZWlnaHQgeCAwLjgKKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfaW1hZ2UoJ0ExJywgJ3BlcmwuYm1wJywgMCwgMCwgMiwgMC44KTsKKworU2VlIGFsc28gdGhlIEM8aW1hZ2VzLnBsPiBwcm9ncmFtIGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3Rvcnkgb2YgdGhlIGRpc3Ryby4KKworTm90ZTogeW91IG11c3QgY2FsbCBDPHNldF9yb3coKT4gb3IgQzxzZXRfY29sdW1uKCk+IGJlZm9yZSBDPGluc2VydF9pbWFnZSgpPiBpZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgZGltZW5zaW9ucyBvZiBhbnkgb2YgdGhlIHJvd3Mgb3IgY29sdW1ucyB0aGF0IHRoZSBpbWFnZSBvY2N1cGllcy4gVGhlIGhlaWdodCBvZiBhIHJvdyBjYW4gYWxzbyBjaGFuZ2UgaWYgeW91IHVzZSBhIGZvbnQgdGhhdCBpcyBsYXJnZXIgdGhhbiB0aGUgZGVmYXVsdC4gVGhpcyBpbiB0dXJuIHdpbGwgYWZmZWN0IHRoZSBzY2FsaW5nIG9mIHlvdXIgaW1hZ2UuIFRvIGF2b2lkIHRoaXMgeW91IHNob3VsZCBleHBsaWNpdGx5IHNldCB0aGUgaGVpZ2h0IG9mIHRoZSByb3cgdXNpbmcgQzxzZXRfcm93KCk+IGlmIGl0IGNvbnRhaW5zIGEgZm9udCBzaXplIHRoYXQgd2lsbCBjaGFuZ2UgdGhlIHJvdyBoZWlnaHQuCisKKworQk1QIGltYWdlcyBtdXN0IGJlIDI0IGJpdCwgdHJ1ZSBjb2xvdXIsIGJpdG1hcHMuIEluIGdlbmVyYWwgaXQgaXMgYmVzdCB0byBhdm9pZCBCTVAgaW1hZ2VzIHNpbmNlIHRoZXkgYXJlbid0IGNvbXByZXNzZWQuIFRoZSBvbGRlciBDPGluc2VydF9iaXRtYXAoKT4gbWV0aG9kIGlzIHN0aWxsIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZC4KKworCisKKworPWhlYWQyIGluc2VydF9jaGFydCgkcm93LCAkY29sLCAkY2hhcnQsICR4LCAkeSwgJHNjYWxlX3gsICRzY2FsZV95KQorCitUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBpbnNlcnQgYSBDaGFydCBvYmplY3QgaW50byBhIHdvcmtzaGVldC4gVGhlIENoYXJ0IG11c3QgYmUgY3JlYXRlZCBieSB0aGUgQzxhZGRfY2hhcnQoKT4gV29ya2Jvb2sgbWV0aG9kICBhbmQgaXQgbXVzdCBoYXZlIHRoZSBDPGVtYmVkZGVkPiBvcHRpb24gc2V0LgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2xpbmUnLCBlbWJlZGRlZCA9PiAxICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgY2hhcnQuCisgICAgLi4uCisKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgYSB3b3Jrc2hlZXQuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCdFMicsICRjaGFydCk7CisKK1NlZSBDPGFkZF9jaGFydCgpPiBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3JlYXRlIHRoZSBDaGFydCBvYmplY3QgYW5kIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0PiBmb3IgZGV0YWlscyBvbiBob3cgdG8gY29uZmlndXJlIGl0LiBTZWUgYWxzbyB0aGUgQzxjaGFydF8qLnBsPiBwcm9ncmFtcyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK1RoZSBDPCR4PiwgQzwkeT4sIEM8JHNjYWxlX3g+IGFuZCBDPCRzY2FsZV95PiBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbC4KKworVGhlIHBhcmFtZXRlcnMgQzwkeD4gYW5kIEM8JHk+IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gb2Zmc2V0IGZyb20gdGhlIHRvcCBsZWZ0IGhhbmQgY29ybmVyIG9mIHRoZSBjZWxsIHNwZWNpZmllZCBieSBDPCRyb3c+IGFuZCBDPCRjb2w+LiBUaGUgb2Zmc2V0IHZhbHVlcyBhcmUgaW4gcGl4ZWxzLiBTZWUgdGhlIEM8aW5zZXJ0X2ltYWdlPiBtZXRob2QgYWJvdmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2l6ZXMuCisKKyAgICAkd29ya3NoZWV0MS0+aW5zZXJ0X2NoYXJ0KCdFMicsICRjaGFydCwgMywgMyk7CisKK1RoZSBwYXJhbWV0ZXJzIEM8JHNjYWxlX3g+IGFuZCBDPCRzY2FsZV95PiBjYW4gYmUgdXNlZCB0byBzY2FsZSB0aGUgaW5zZXJ0ZWQgaW1hZ2UgaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5OgorCisgICAgIyBTY2FsZSB0aGUgd2lkdGggYnkgMTIwJSBhbmQgdGhlIGhlaWdodCBieSAxNTAlCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCdFMicsICRjaGFydCwgMCwgMCwgMS4yLCAxLjUpOworCitUaGUgZWFzaWVzdCB3YXkgdG8gY2FsY3VsYXRlIHRoZSByZXF1aXJlZCBzY2FsaW5nIGlzIHRvIGNyZWF0ZSBhIHRlc3QgY2hhcnQgd29ya3NoZWV0IHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuIFRoZW4gb3BlbiB0aGUgZmlsZSwgc2VsZWN0IHRoZSBjaGFydCBhbmQgZHJhZyB0aGUgY29ybmVyIHRvIGdldCB0aGUgcmVxdWlyZWQgc2l6ZS4gV2hpbGUgaG9sZGluZyBkb3duIHRoZSBtb3VzZSB0aGUgc2NhbGUgb2YgdGhlIHJlc2l6ZWQgY2hhcnQgaXMgc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIGZvcm11bGEgYmFyLgorCitOb3RlOiB5b3UgbXVzdCBjYWxsIEM8c2V0X3JvdygpPiBvciBDPHNldF9jb2x1bW4oKT4gYmVmb3JlIEM8aW5zZXJ0X2NoYXJ0KCk+IGlmIHlvdSB3aXNoIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBkaW1lbnNpb25zIG9mIGFueSBvZiB0aGUgcm93cyBvciBjb2x1bW5zIHRoYXQgdGhlIGNoYXJ0IG9jY3VwaWVzLiBUaGUgaGVpZ2h0IG9mIGEgcm93IGNhbiBhbHNvIGNoYW5nZSBpZiB5b3UgdXNlIGEgZm9udCB0aGF0IGlzIGxhcmdlciB0aGFuIHRoZSBkZWZhdWx0LiBUaGlzIGluIHR1cm4gd2lsbCBhZmZlY3QgdGhlIHNjYWxpbmcgb2YgeW91ciBjaGFydC4gVG8gYXZvaWQgdGhpcyB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgc2V0IHRoZSBoZWlnaHQgb2YgdGhlIHJvdyB1c2luZyBDPHNldF9yb3coKT4gaWYgaXQgY29udGFpbnMgYSBmb250IHNpemUgdGhhdCB3aWxsIGNoYW5nZSB0aGUgcm93IGhlaWdodC4KKworCisKKworPWhlYWQyIGVtYmVkX2NoYXJ0KCRyb3csICRjb2wsICRmaWxlbmFtZSwgJHgsICR5LCAkc2NhbGVfeCwgJHNjYWxlX3kpCisKK1RoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGluc2VydCBhIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGNoYXJ0IGludG8gYSB3b3Jrc2hlZXQuIFRoZSBjaGFydCBtdXN0IGZpcnN0IGJlIGV4dHJhY3RlZCBmcm9tIGFuIGV4aXN0aW5nIEV4Y2VsIGZpbGUuIFRoaXMgZmVhdHVyZSBpcyBzZW1pLWRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSAibmF0aXZlIiBjaGFydHMgY3JlYXRlZCB1c2luZyBDPGFkZF9jaGFydCgpPi4gUmVhZCBDPGV4dGVybmFsX2NoYXJ0cy50eHQ+IChvciBDPC5wb2Q+KSBpbiB0aGUgZXh0ZXJuYWxfY2hhcnRzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvIGZvciBhIGZ1bGwgZXhwbGFuYXRpb24uCisKK0hlcmUgaXMgYW4gZXhhbXBsZToKKworICAgICR3b3Jrc2hlZXQtPmVtYmVkX2NoYXJ0KCdCMicsICdzYWxlc19jaGFydC5iaW4nKTsKKworVGhlIEM8JHg+LCBDPCR5PiwgQzwkc2NhbGVfeD4gYW5kIEM8JHNjYWxlX3k+IHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsLiBTZWUgQzxpbnNlcnRfY2hhcnQoKT4gYWJvdmUgZm9yIGRldGFpbHMuCisKKworCisKKz1oZWFkMiBkYXRhX3ZhbGlkYXRpb24oKQorCitUaGUgQzxkYXRhX3ZhbGlkYXRpb24oKT4gbWV0aG9kIGlzIHVzZWQgdG8gY29uc3RydWN0IGFuIEV4Y2VsIGRhdGEgdmFsaWRhdGlvbiBvciB0byBsaW1pdCB0aGUgdXNlciBpbnB1dCB0byBhIGRyb3Bkb3duIGxpc3Qgb2YgdmFsdWVzLgorCisKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJ0IzJywKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgPT4gJz4nLAorICAgICAgICAgICAgdmFsdWUgICAgPT4gMTAwLAorICAgICAgICB9KTsKKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQjU6QjknLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSA9PiAnbGlzdCcsCisgICAgICAgICAgICB2YWx1ZSAgICA9PiBbJ29wZW4nLCAnaGlnaCcsICdjbG9zZSddLAorICAgICAgICB9KTsKKworVGhpcyBtZXRob2QgY29udGFpbnMgYSBsb3Qgb2YgcGFyYW1ldGVycyBhbmQgaXMgZGVzY3JpYmVkIGluIGRldGFpbCBpbiBhIHNlcGFyYXRlIHNlY3Rpb24gTDxEQVRBIFZBTElEQVRJT04gSU4gRVhDRUw+LgorCisKK1NlZSBhbHNvIHRoZSBDPGRhdGFfdmFsaWRhdGUucGw+IHByb2dyYW0gaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvCisKKworCisKKz1oZWFkMiBnZXRfbmFtZSgpCisKK1RoZSBDPGdldF9uYW1lKCk+IG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBuYW1lIG9mIGEgd29ya3NoZWV0LiBGb3IgZXhhbXBsZToKKworICAgIGZvcmVhY2ggbXkgJHNoZWV0ICgkd29ya2Jvb2stPnNoZWV0cygpKSB7CisgICAgICAgIHByaW50ICRzaGVldC0+Z2V0X25hbWUoKTsKKyAgICB9CisKK0ZvciByZWFzb25zIHJlbGF0ZWQgdG8gdGhlIGRlc2lnbiBvZiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgdG8gdGhlIGludGVybmFscyBvZiBFeGNlbCB0aGVyZSBpcyBubyBDPHNldF9uYW1lKCk+IG1ldGhvZC4gVGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgd29ya3NoZWV0IG5hbWUgaXMgdmlhIHRoZSBDPGFkZF93b3Jrc2hlZXQoKT4gbWV0aG9kLgorCisKKworCis9aGVhZDIgYWN0aXZhdGUoKQorCitUaGUgQzxhY3RpdmF0ZSgpPiBtZXRob2QgaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIHdvcmtzaGVldCBpcyBpbml0aWFsbHkgdmlzaWJsZSBpbiBhIG11bHRpLXNoZWV0IHdvcmtib29rOgorCisgICAgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1RvJyk7CisgICAgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ3RoZScpOworICAgICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCd3aW5kJyk7CisKKyAgICAkd29ya3NoZWV0My0+YWN0aXZhdGUoKTsKKworVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBFeGNlbCBWQkEgYWN0aXZhdGUgbWV0aG9kLiBNb3JlIHRoYW4gb25lIHdvcmtzaGVldCBjYW4gYmUgc2VsZWN0ZWQgdmlhIHRoZSBDPHNlbGVjdCgpPiBtZXRob2QsIHNlZSBiZWxvdywgaG93ZXZlciBvbmx5IG9uZSB3b3Jrc2hlZXQgY2FuIGJlIGFjdGl2ZS4KKworVGhlIGRlZmF1bHQgYWN0aXZlIHdvcmtzaGVldCBpcyB0aGUgZmlyc3Qgd29ya3NoZWV0LgorCisKKworCis9aGVhZDIgc2VsZWN0KCkKKworVGhlIEM8c2VsZWN0KCk+IG1ldGhvZCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSB3b3Jrc2hlZXQgaXMgc2VsZWN0ZWQgaW4gYSBtdWx0aS1zaGVldCB3b3JrYm9vazoKKworICAgICR3b3Jrc2hlZXQxLT5hY3RpdmF0ZSgpOworICAgICR3b3Jrc2hlZXQyLT5zZWxlY3QoKTsKKyAgICAkd29ya3NoZWV0My0+c2VsZWN0KCk7CisKK0Egc2VsZWN0ZWQgd29ya3NoZWV0IGhhcyBpdHMgdGFiIGhpZ2hsaWdodGVkLiBTZWxlY3Rpbmcgd29ya3NoZWV0cyBpcyBhIHdheSBvZiBncm91cGluZyB0aGVtIHRvZ2V0aGVyIHNvIHRoYXQsIGZvciBleGFtcGxlLCBzZXZlcmFsIHdvcmtzaGVldHMgY291bGQgYmUgcHJpbnRlZCBpbiBvbmUgZ28uIEEgd29ya3NoZWV0IHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkIHZpYSB0aGUgQzxhY3RpdmF0ZSgpPiBtZXRob2Qgd2lsbCBhbHNvIGFwcGVhciBhcyBzZWxlY3RlZC4KKworCisKKworPWhlYWQyIGhpZGUoKQorCitUaGUgQzxoaWRlKCk+IG1ldGhvZCBpcyB1c2VkIHRvIGhpZGUgYSB3b3Jrc2hlZXQ6CisKKyAgICAkd29ya3NoZWV0Mi0+aGlkZSgpOworCitZb3UgbWF5IHdpc2ggdG8gaGlkZSBhIHdvcmtzaGVldCBpbiBvcmRlciB0byBhdm9pZCBjb25mdXNpbmcgYSB1c2VyIHdpdGggaW50ZXJtZWRpYXRlIGRhdGEgb3IgY2FsY3VsYXRpb25zLgorCitBIGhpZGRlbiB3b3Jrc2hlZXQgY2FuIG5vdCBiZSBhY3RpdmF0ZWQgb3Igc2VsZWN0ZWQgc28gdGhpcyBtZXRob2QgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIEM8YWN0aXZhdGUoKT4gYW5kIEM8c2VsZWN0KCk+IG1ldGhvZHMuIEluIGFkZGl0aW9uLCBzaW5jZSB0aGUgZmlyc3Qgd29ya3NoZWV0IHdpbGwgZGVmYXVsdCB0byBiZWluZyB0aGUgYWN0aXZlIHdvcmtzaGVldCwgeW91IGNhbm5vdCBoaWRlIHRoZSBmaXJzdCB3b3Jrc2hlZXQgd2l0aG91dCBhY3RpdmF0aW5nIGFub3RoZXIgc2hlZXQ6CisKKyAgICAkd29ya3NoZWV0Mi0+YWN0aXZhdGUoKTsKKyAgICAkd29ya3NoZWV0MS0+aGlkZSgpOworCisKKworCis9aGVhZDIgc2V0X2ZpcnN0X3NoZWV0KCkKKworVGhlIEM8YWN0aXZhdGUoKT4gbWV0aG9kIGRldGVybWluZXMgd2hpY2ggd29ya3NoZWV0IGlzIGluaXRpYWxseSBzZWxlY3RlZC4gSG93ZXZlciwgaWYgdGhlcmUgYXJlIGEgbGFyZ2UgbnVtYmVyIG9mIHdvcmtzaGVldHMgdGhlIHNlbGVjdGVkIHdvcmtzaGVldCBtYXkgbm90IGFwcGVhciBvbiB0aGUgc2NyZWVuLiBUbyBhdm9pZCB0aGlzIHlvdSBjYW4gc2VsZWN0IHdoaWNoIGlzIHRoZSBsZWZ0bW9zdCB2aXNpYmxlIHdvcmtzaGVldCB1c2luZyBDPHNldF9maXJzdF9zaGVldCgpPjoKKworICAgIGZvciAoMS4uMjApIHsKKyAgICAgICAgJHdvcmtib29rLT5hZGRfd29ya3NoZWV0OworICAgIH0KKworICAgICR3b3Jrc2hlZXQyMSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICR3b3Jrc2hlZXQyMiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgJHdvcmtzaGVldDIxLT5zZXRfZmlyc3Rfc2hlZXQoKTsKKyAgICAkd29ya3NoZWV0MjItPmFjdGl2YXRlKCk7CisKK1RoaXMgbWV0aG9kIGlzIG5vdCByZXF1aXJlZCB2ZXJ5IG9mdGVuLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgZmlyc3Qgd29ya3NoZWV0LgorCisKKworCis9aGVhZDIgcHJvdGVjdCgkcGFzc3dvcmQpCisKK1RoZSBDPHByb3RlY3QoKT4gbWV0aG9kIGlzIHVzZWQgdG8gcHJvdGVjdCBhIHdvcmtzaGVldCBmcm9tIG1vZGlmaWNhdGlvbjoKKworICAgICR3b3Jrc2hlZXQtPnByb3RlY3QoKTsKKworSXQgY2FuIGJlIHR1cm5lZCBvZmYgaW4gRXhjZWwgdmlhIHRoZSBDPFRvb2xzLUU8Z3Q+UHJvdGVjdGlvbi1FPGd0PlVucHJvdGVjdCBTaGVldD4gbWVudSBjb21tYW5kLgorCitUaGUgQzxwcm90ZWN0KCk+IG1ldGhvZCBhbHNvIGhhcyB0aGUgZWZmZWN0IG9mIGVuYWJsaW5nIGEgY2VsbCdzIEM8bG9ja2VkPiBhbmQgQzxoaWRkZW4+IHByb3BlcnRpZXMgaWYgdGhleSBoYXZlIGJlZW4gc2V0LiBBICJsb2NrZWQiIGNlbGwgY2Fubm90IGJlIGVkaXRlZC4gQSAiaGlkZGVuIiBjZWxsIHdpbGwgZGlzcGxheSB0aGUgcmVzdWx0cyBvZiBhIGZvcm11bGEgYnV0IG5vdCB0aGUgZm9ybXVsYSBpdHNlbGYuIEluIEV4Y2VsIGEgY2VsbCdzIGxvY2tlZCBwcm9wZXJ0eSBpcyBvbiBieSBkZWZhdWx0LgorCisgICAgIyBTZXQgc29tZSBmb3JtYXQgcHJvcGVydGllcworICAgIG15ICR1bmxvY2tlZCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobG9ja2VkID0+IDApOworICAgIG15ICRoaWRkZW4gICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoaGlkZGVuID0+IDEpOworCisgICAgIyBFbmFibGUgd29ya3NoZWV0IHByb3RlY3Rpb24KKyAgICAkd29ya3NoZWV0LT5wcm90ZWN0KCk7CisKKyAgICAjIFRoaXMgY2VsbCBjYW5ub3QgYmUgZWRpdGVkLCBpdCBpcyBsb2NrZWQgYnkgZGVmYXVsdAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICc9MSsyJyk7CisKKyAgICAjIFRoaXMgY2VsbCBjYW4gYmUgZWRpdGVkCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJz0xKzInLCAkdW5sb2NrZWQpOworCisgICAgIyBUaGUgZm9ybXVsYSBpbiB0aGlzIGNlbGwgaXNuJ3QgdmlzaWJsZQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMycsICc9MSsyJywgJGhpZGRlbik7CisKK1NlZSBhbHNvIHRoZSBDPHNldF9sb2NrZWQ+IGFuZCBDPHNldF9oaWRkZW4+IGZvcm1hdCBtZXRob2RzIGluIEw8Q0VMTCBGT1JNQVRUSU5HPi4KKworWW91IGNhbiBvcHRpb25hbGx5IGFkZCBhIHBhc3N3b3JkIHRvIHRoZSB3b3Jrc2hlZXQgcHJvdGVjdGlvbjoKKworICAgICR3b3Jrc2hlZXQtPnByb3RlY3QoJ2Ryb3dzc2FwJyk7CisKK05vdGUsIHRoZSB3b3Jrc2hlZXQgbGV2ZWwgcGFzc3dvcmQgaW4gRXhjZWwgcHJvdmlkZXMgdmVyeSB3ZWFrIHByb3RlY3Rpb24uIEl0IGRvZXMgbm90IGVuY3J5cHQgeW91ciBkYXRhIGluIGFueSB3YXkgYW5kIGl0IGlzIHZlcnkgZWFzeSB0byBkZWFjdGl2YXRlLiBUaGVyZWZvcmUsIGRvIG5vdCB1c2UgdGhlIGFib3ZlIG1ldGhvZCBpZiB5b3Ugd2lzaCB0byBwcm90ZWN0IHNlbnNpdGl2ZSBkYXRhIG9yIGNhbGN1bGF0aW9ucy4gSG93ZXZlciwgYmVmb3JlIHlvdSBnZXQgd29ycmllZCwgRXhjZWwncyBvd24gd29ya2Jvb2sgbGV2ZWwgcGFzc3dvcmQgcHJvdGVjdGlvbiBkb2VzIHByb3ZpZGUgc3Ryb25nIGVuY3J5cHRpb24gaW4gRXhjZWwgOTcrLiBGb3IgdGVjaG5pY2FsIHJlYXNvbnMgdGhpcyB3aWxsIG5ldmVyIGJlIHN1cHBvcnRlZCBieSBDPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4KKworCisKKworPWhlYWQyIHNldF9zZWxlY3Rpb24oJGZpcnN0X3JvdywgJGZpcnN0X2NvbCwgJGxhc3Rfcm93LCAkbGFzdF9jb2wpCisKK1RoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggY2VsbCBvciBjZWxscyBhcmUgc2VsZWN0ZWQgaW4gYSB3b3Jrc2hlZXQuIFRoZSBtb3N0IGNvbW1vbiByZXF1aXJlbWVudCBpcyB0byBzZWxlY3QgYSBzaW5nbGUgY2VsbCwgaW4gd2hpY2ggY2FzZSBDPCRsYXN0X3Jvdz4gYW5kIEM8JGxhc3RfY29sPiBjYW4gYmUgb21pdHRlZC4gVGhlIGFjdGl2ZSBjZWxsIHdpdGhpbiBhIHNlbGVjdGVkIHJhbmdlIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIGluIHdoaWNoIEM8JGZpcnN0PiBhbmQgQzwkbGFzdD4gYXJlIHNwZWNpZmllZC4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgY2VsbCBvciBhIHJhbmdlIHVzaW5nIEExIG5vdGF0aW9uLiBTZWUgdGhlIG5vdGUgYWJvdXQgTDxDZWxsIG5vdGF0aW9uPi4KKworRXhhbXBsZXM6CisKKyAgICAkd29ya3NoZWV0MS0+c2V0X3NlbGVjdGlvbigzLCAzKTsgICAgICAgIyAxLiBDZWxsIEQ0LgorICAgICR3b3Jrc2hlZXQyLT5zZXRfc2VsZWN0aW9uKDMsIDMsIDYsIDYpOyAjIDIuIENlbGxzIEQ0IHRvIEc3LgorICAgICR3b3Jrc2hlZXQzLT5zZXRfc2VsZWN0aW9uKDYsIDYsIDMsIDMpOyAjIDMuIENlbGxzIEc3IHRvIEQ0LgorICAgICR3b3Jrc2hlZXQ0LT5zZXRfc2VsZWN0aW9uKCdENCcpOyAgICAgICAjIFNhbWUgYXMgMS4KKyAgICAkd29ya3NoZWV0NS0+c2V0X3NlbGVjdGlvbignRDQ6RzcnKTsgICAgIyBTYW1lIGFzIDIuCisgICAgJHdvcmtzaGVldDYtPnNldF9zZWxlY3Rpb24oJ0c3OkQ0Jyk7ICAgICMgU2FtZSBhcyAzLgorCitUaGUgZGVmYXVsdCBjZWxsIHNlbGVjdGlvbnMgaXMgKDAsIDApLCAnQTEnLgorCisKKworCis9aGVhZDIgc2V0X3Jvdygkcm93LCAkaGVpZ2h0LCAkZm9ybWF0LCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisKK1RoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIG9mIGEgcm93LiBBbGwgcGFyYW1ldGVycyBhcGFydCBmcm9tIEM8JHJvdz4gYXJlIG9wdGlvbmFsLgorCitUaGUgbW9zdCBjb21tb24gdXNlIGZvciB0aGlzIG1ldGhvZCBpcyB0byBjaGFuZ2UgdGhlIGhlaWdodCBvZiBhIHJvdzoKKworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgMjApOyAjIFJvdyAxIGhlaWdodCBzZXQgdG8gMjAKKworSWYgeW91IHdpc2ggdG8gc2V0IHRoZSBmb3JtYXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgaGVpZ2h0IHlvdSBjYW4gcGFzcyBDPHVuZGVmPiBhcyB0aGUgaGVpZ2h0IHBhcmFtZXRlcjoKKworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgdW5kZWYsICRmb3JtYXQpOworCitUaGUgQzwkZm9ybWF0PiBwYXJhbWV0ZXIgd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBjZWxscyBpbiB0aGUgcm93IHRoYXQgZG9uJ3QgIGhhdmUgYSBmb3JtYXQuIEZvciBleGFtcGxlCisKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDAsIHVuZGVmLCAkZm9ybWF0MSk7ICAgICMgU2V0IHRoZSBmb3JtYXQgZm9yIHJvdyAxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ0hlbGxvJyk7ICAgICAgICAgICAjIERlZmF1bHRzIHRvICRmb3JtYXQxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJ0hlbGxvJywgJGZvcm1hdDIpOyAjIEtlZXBzICRmb3JtYXQyCisKK0lmIHlvdSB3aXNoIHRvIGRlZmluZSBhIHJvdyBmb3JtYXQgaW4gdGhpcyB3YXkgeW91IHNob3VsZCBjYWxsIHRoZSBtZXRob2QgYmVmb3JlIGFueSBjYWxscyB0byBDPHdyaXRlKCk+LiBDYWxsaW5nIGl0IGFmdGVyd2FyZHMgd2lsbCBvdmVyd3JpdGUgYW55IGZvcm1hdCB0aGF0IHdhcyBwcmV2aW91c2x5IHNwZWNpZmllZC4KKworVGhlIEM8JGhpZGRlbj4gcGFyYW1ldGVyIHNob3VsZCBiZSBzZXQgdG8gMSBpZiB5b3Ugd2lzaCB0byBoaWRlIGEgcm93LiBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gaGlkZSBpbnRlcm1lZGlhcnkgc3RlcHMgaW4gYSBjb21wbGljYXRlZCBjYWxjdWxhdGlvbjoKKworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgMjAsICAgICRmb3JtYXQsIDEpOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMSwgdW5kZWYsIHVuZGVmLCAgIDEpOworCitUaGUgQzwkbGV2ZWw+IHBhcmFtZXRlciBpcyB1c2VkIHRvIHNldCB0aGUgb3V0bGluZSBsZXZlbCBvZiB0aGUgcm93LiBPdXRsaW5lcyBhcmUgZGVzY3JpYmVkIGluIEw8T1VUTElORVMgQU5EIEdST1VQSU5HIElOIEVYQ0VMPi4gQWRqYWNlbnQgcm93cyB3aXRoIHRoZSBzYW1lIG91dGxpbmUgbGV2ZWwgYXJlIGdyb3VwZWQgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBvdXRsaW5lLgorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2V0cyBhbiBvdXRsaW5lIGxldmVsIG9mIDEgZm9yIHJvd3MgMSBhbmQgMiAoemVyby1pbmRleGVkKToKKworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMSwgdW5kZWYsIHVuZGVmLCAwLCAxKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDIsIHVuZGVmLCB1bmRlZiwgMCwgMSk7CisKK1RoZSBDPCRoaWRkZW4+IHBhcmFtZXRlciBjYW4gYWxzbyBiZSB1c2VkIHRvIGhpZGUgY29sbGFwc2VkIG91dGxpbmVkIHJvd3Mgd2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEM8JGxldmVsPiBwYXJhbWV0ZXIuCisKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDEsIHVuZGVmLCB1bmRlZiwgMSwgMSk7CisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygyLCB1bmRlZiwgdW5kZWYsIDEsIDEpOworCitGb3IgY29sbGFwc2VkIG91dGxpbmVzIHlvdSBzaG91bGQgYWxzbyBpbmRpY2F0ZSB3aGljaCByb3cgaGFzIHRoZSBjb2xsYXBzZWQgQzwrPiBzeW1ib2wgdXNpbmcgdGhlIG9wdGlvbmFsIEM8JGNvbGxhcHNlZD4gcGFyYW1ldGVyLgorCisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygzLCB1bmRlZiwgdW5kZWYsIDAsIDAsIDEpOworCitGb3IgYSBtb3JlIGNvbXBsZXRlIGV4YW1wbGUgc2VlIHRoZSBDPG91dGxpbmUucGw+IGFuZCBDPG91dGxpbmVfY29sbGFwc2VkLnBsPiBwcm9ncmFtcyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK0V4Y2VsIGFsbG93cyB1cCB0byA3IG91dGxpbmUgbGV2ZWxzLiBUaGVyZWZvcmUgdGhlIEM8JGxldmVsPiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGluIHRoZSByYW5nZSBDPDAgRTxsdD49ICRsZXZlbCBFPGx0Pj0gNz4uCisKKworCisKKz1oZWFkMiBzZXRfY29sdW1uKCRmaXJzdF9jb2wsICRsYXN0X2NvbCwgJHdpZHRoLCAkZm9ybWF0LCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisKK1RoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIG9mIGEgc2luZ2xlIGNvbHVtbiBvciBhIHJhbmdlIG9mIGNvbHVtbnMuIEFsbCBwYXJhbWV0ZXJzIGFwYXJ0IGZyb20gQzwkZmlyc3RfY29sPiBhbmQgQzwkbGFzdF9jb2w+IGFyZSBvcHRpb25hbC4KKworSWYgQzxzZXRfY29sdW1uKCk+IGlzIGFwcGxpZWQgdG8gYSBzaW5nbGUgY29sdW1uIHRoZSB2YWx1ZSBvZiBDPCRmaXJzdF9jb2w+IGFuZCBDPCRsYXN0X2NvbD4gc2hvdWxkIGJlIHRoZSBzYW1lLiBJbiB0aGUgY2FzZSB3aGVyZSBDPCRsYXN0X2NvbD4gaXMgemVybyBpdCBpcyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgQzwkZmlyc3RfY29sPi4KKworSXQgaXMgYWxzbyBwb3NzaWJsZSwgYW5kIGdlbmVyYWxseSBjbGVhcmVyLCB0byBzcGVjaWZ5IGEgY29sdW1uIHJhbmdlIHVzaW5nIHRoZSBmb3JtIG9mIEExIG5vdGF0aW9uIHVzZWQgZm9yIGNvbHVtbnMuIFNlZSB0aGUgbm90ZSBhYm91dCBMPENlbGwgbm90YXRpb24+LgorCitFeGFtcGxlczoKKworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgIDIwKTsgIyBDb2x1bW4gIEEgICB3aWR0aCBzZXQgdG8gMjAKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDEsIDMsICAzMCk7ICMgQ29sdW1ucyBCLUQgd2lkdGggc2V0IHRvIDMwCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignRTpFJywgMjApOyAjIENvbHVtbiAgRSAgIHdpZHRoIHNldCB0byAyMAorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0Y6SCcsIDMwKTsgIyBDb2x1bW5zIEYtSCB3aWR0aCBzZXQgdG8gMzAKKworVGhlIHdpZHRoIGNvcnJlc3BvbmRzIHRvIHRoZSBjb2x1bW4gd2lkdGggdmFsdWUgdGhhdCBpcyBzcGVjaWZpZWQgaW4gRXhjZWwuIEl0IGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiBhIHN0cmluZyBpbiB0aGUgZGVmYXVsdCBmb250IG9mIEFyaWFsIDEwLiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSAiQXV0b0ZpdCIgZm9yIGEgY29sdW1uIGluIHRoZSBFeGNlbCBmaWxlIGZvcm1hdC4gVGhpcyBmZWF0dXJlIGlzIG9ubHkgYXZhaWxhYmxlIGF0IHJ1bnRpbWUgZnJvbSB3aXRoaW4gRXhjZWwuCisKK0FzIHVzdWFsIHRoZSBDPCRmb3JtYXQ+IHBhcmFtZXRlciBpcyBvcHRpb25hbCwgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHNlZSBMPENFTEwgRk9STUFUVElORz4uIElmIHlvdSB3aXNoIHRvIHNldCB0aGUgZm9ybWF0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIHdpZHRoIHlvdSBjYW4gcGFzcyBDPHVuZGVmPiBhcyB0aGUgd2lkdGggcGFyYW1ldGVyOgorCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAwLCB1bmRlZiwgJGZvcm1hdCk7CisKK1RoZSBDPCRmb3JtYXQ+IHBhcmFtZXRlciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGNlbGxzIGluIHRoZSBjb2x1bW4gdGhhdCBkb24ndCAgaGF2ZSBhIGZvcm1hdC4gRm9yIGV4YW1wbGUKKworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIHVuZGVmLCAkZm9ybWF0MSk7ICMgU2V0IGZvcm1hdCBmb3IgY29sIDEKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnSGVsbG8nKTsgICAgICAgICAgICAgICAjIERlZmF1bHRzIHRvICRmb3JtYXQxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJ0hlbGxvJywgJGZvcm1hdDIpOyAgICAgIyBLZWVwcyAkZm9ybWF0MgorCitJZiB5b3Ugd2lzaCB0byBkZWZpbmUgYSBjb2x1bW4gZm9ybWF0IGluIHRoaXMgd2F5IHlvdSBzaG91bGQgY2FsbCB0aGUgbWV0aG9kIGJlZm9yZSBhbnkgY2FsbHMgdG8gQzx3cml0ZSgpPi4gSWYgeW91IGNhbGwgaXQgYWZ0ZXJ3YXJkcyBpdCB3b24ndCBoYXZlIGFueSBlZmZlY3QuCisKK0EgZGVmYXVsdCByb3cgZm9ybWF0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBhIGRlZmF1bHQgY29sdW1uIGZvcm1hdAorCisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygwLCB1bmRlZiwgICAgICAgICRmb3JtYXQxKTsgIyBTZXQgZm9ybWF0IGZvciByb3cgMQorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIHVuZGVmLCAkZm9ybWF0Mik7ICMgU2V0IGZvcm1hdCBmb3IgY29sIDEKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnSGVsbG8nKTsgICAgICAgICAgICAgICAjIERlZmF1bHRzIHRvICRmb3JtYXQxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJ0hlbGxvJyk7ICAgICAgICAgICAgICAgIyBEZWZhdWx0cyB0byAkZm9ybWF0MgorCitUaGUgQzwkaGlkZGVuPiBwYXJhbWV0ZXIgc2hvdWxkIGJlIHNldCB0byAxIGlmIHlvdSB3aXNoIHRvIGhpZGUgYSBjb2x1bW4uIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBoaWRlIGludGVybWVkaWFyeSBzdGVwcyBpbiBhIGNvbXBsaWNhdGVkIGNhbGN1bGF0aW9uOgorCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignRDpEJywgMjAsICAgICRmb3JtYXQsIDEpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0U6RScsIHVuZGVmLCB1bmRlZiwgICAxKTsKKworVGhlIEM8JGxldmVsPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZXQgdGhlIG91dGxpbmUgbGV2ZWwgb2YgdGhlIGNvbHVtbi4gT3V0bGluZXMgYXJlIGRlc2NyaWJlZCBpbiBMPE9VVExJTkVTIEFORCBHUk9VUElORyBJTiBFWENFTD4uIEFkamFjZW50IGNvbHVtbnMgd2l0aCB0aGUgc2FtZSBvdXRsaW5lIGxldmVsIGFyZSBncm91cGVkIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgb3V0bGluZS4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNldHMgYW4gb3V0bGluZSBsZXZlbCBvZiAxIGZvciBjb2x1bW5zIEIgdG8gRzoKKworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0I6RycsIHVuZGVmLCB1bmRlZiwgMCwgMSk7CisKK1RoZSBDPCRoaWRkZW4+IHBhcmFtZXRlciBjYW4gYWxzbyBiZSB1c2VkIHRvIGhpZGUgY29sbGFwc2VkIG91dGxpbmVkIGNvbHVtbnMgd2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEM8JGxldmVsPiBwYXJhbWV0ZXIuCisKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkcnLCB1bmRlZiwgdW5kZWYsIDEsIDEpOworCitGb3IgY29sbGFwc2VkIG91dGxpbmVzIHlvdSBzaG91bGQgYWxzbyBpbmRpY2F0ZSB3aGljaCByb3cgaGFzIHRoZSBjb2xsYXBzZWQgQzwrPiBzeW1ib2wgdXNpbmcgdGhlIG9wdGlvbmFsIEM8JGNvbGxhcHNlZD4gcGFyYW1ldGVyLgorCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignSDpIJywgdW5kZWYsIHVuZGVmLCAwLCAwLCAxKTsKKworRm9yIGEgbW9yZSBjb21wbGV0ZSBleGFtcGxlIHNlZSB0aGUgQzxvdXRsaW5lLnBsPiBhbmQgQzxvdXRsaW5lX2NvbGxhcHNlZC5wbD4gcHJvZ3JhbXMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCitFeGNlbCBhbGxvd3MgdXAgdG8gNyBvdXRsaW5lIGxldmVscy4gVGhlcmVmb3JlIHRoZSBDPCRsZXZlbD4gcGFyYW1ldGVyIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgQzwwIEU8bHQ+PSAkbGV2ZWwgRTxsdD49IDc+LgorCisKKworCis9aGVhZDIgb3V0bGluZV9zZXR0aW5ncygkdmlzaWJsZSwgJHN5bWJvbHNfYmVsb3csICRzeW1ib2xzX3JpZ2h0LCAkYXV0b19zdHlsZSkKKworVGhlIEM8b3V0bGluZV9zZXR0aW5ncygpPiBtZXRob2QgaXMgdXNlZCB0byBjb250cm9sIHRoZSBhcHBlYXJhbmNlIG9mIG91dGxpbmVzIGluIEV4Y2VsLiBPdXRsaW5lcyBhcmUgZGVzY3JpYmVkIGluIEw8T1VUTElORVMgQU5EIEdST1VQSU5HIElOIEVYQ0VMPi4KKworVGhlIEM8JHZpc2libGU+IHBhcmFtZXRlciBpcyB1c2VkIHRvIGNvbnRyb2wgd2hldGhlciBvciBub3Qgb3V0bGluZXMgYXJlIHZpc2libGUuIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gMCB3aWxsIGNhdXNlIGFsbCBvdXRsaW5lcyBvbiB0aGUgd29ya3NoZWV0IHRvIGJlIGhpZGRlbi4gVGhleSBjYW4gYmUgdW5oaWRkZW4gaW4gRXhjZWwgYnkgbWVhbnMgb2YgdGhlICJTaG93IE91dGxpbmUgU3ltYm9scyIgY29tbWFuZCBidXR0b24uIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgMSBmb3IgdmlzaWJsZSBvdXRsaW5lcy4KKworICAgICR3b3Jrc2hlZXQtPm91dGxpbmVfc2V0dGluZ3MoMCk7CisKK1RoZSBDPCRzeW1ib2xzX2JlbG93PiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgdGhlIHJvdyBvdXRsaW5lIHN5bWJvbCB3aWxsIGFwcGVhciBhYm92ZSBvciBiZWxvdyB0aGUgb3V0bGluZSBsZXZlbCBiYXIuIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgMSBmb3Igc3ltYm9scyB0byBhcHBlYXIgYmVsb3cgdGhlIG91dGxpbmUgbGV2ZWwgYmFyLgorCitUaGUgQzxzeW1ib2xzX3JpZ2h0PiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgdGhlIGNvbHVtbiBvdXRsaW5lIHN5bWJvbCB3aWxsIGFwcGVhciB0byB0aGUgbGVmdCBvciB0aGUgcmlnaHQgb2YgdGhlIG91dGxpbmUgbGV2ZWwgYmFyLiBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzIDEgZm9yIHN5bWJvbHMgdG8gYXBwZWFyIHRvIHRoZSByaWdodCBvZiB0aGUgb3V0bGluZSBsZXZlbCBiYXIuCisKK1RoZSBDPCRhdXRvX3N0eWxlPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgdGhlIGF1dG9tYXRpYyBvdXRsaW5lIGdlbmVyYXRvciBpbiBFeGNlbCB1c2VzIGF1dG9tYXRpYyBzdHlsZXMgd2hlbiBjcmVhdGluZyBhbiBvdXRsaW5lLiBUaGlzIGhhcyBubyBlZmZlY3Qgb24gYSBmaWxlIGdlbmVyYXRlZCBieSBDPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPiBidXQgaXQgZG9lcyBoYXZlIGFuIGVmZmVjdCBvbiBob3cgdGhlIHdvcmtzaGVldCBiZWhhdmVzIGFmdGVyIGl0IGlzIGNyZWF0ZWQuIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgMCBmb3IgIkF1dG9tYXRpYyBTdHlsZXMiIHRvIGJlIHR1cm5lZCBvZmYuCisKK1RoZSBkZWZhdWx0IHNldHRpbmdzIGZvciBhbGwgb2YgdGhlc2UgcGFyYW1ldGVycyBjb3JyZXNwb25kIHRvIEV4Y2VsJ3MgZGVmYXVsdCBwYXJhbWV0ZXJzLgorCisKK1RoZSB3b3Jrc2hlZXQgcGFyYW1ldGVycyBjb250cm9sbGVkIGJ5IEM8b3V0bGluZV9zZXR0aW5ncygpPiBhcmUgcmFyZWx5IHVzZWQuCisKKworCisKKz1oZWFkMiBmcmVlemVfcGFuZXMoJHJvdywgJGNvbCwgJHRvcF9yb3csICRsZWZ0X2NvbCkKKworVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZGl2aWRlIGEgd29ya3NoZWV0IGludG8gaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCByZWdpb25zIGtub3duIGFzIHBhbmVzIGFuZCB0byBhbHNvICJmcmVlemUiIHRoZXNlIHBhbmVzIHNvIHRoYXQgdGhlIHNwbGl0dGVyIGJhcnMgYXJlIG5vdCB2aXNpYmxlLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBDPFdpbmRvdy1FPGd0PkZyZWV6ZSBQYW5lcz4gbWVudSBjb21tYW5kIGluIEV4Y2VsCisKK1RoZSBwYXJhbWV0ZXJzIEM8JHJvdz4gYW5kIEM8JGNvbD4gYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIHNwbGl0LiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgc3BsaXQgaXMgc3BlY2lmaWVkIGF0IHRoZSB0b3Agb3IgbGVmdCBvZiBhIGNlbGwgYW5kIHRoYXQgdGhlIG1ldGhvZCB1c2VzIHplcm8gYmFzZWQgaW5kZXhpbmcuIFRoZXJlZm9yZSB0byBmcmVlemUgdGhlIGZpcnN0IHJvdyBvZiBhIHdvcmtzaGVldCBpdCBpcyBuZWNlc3NhcnkgdG8gc3BlY2lmeSB0aGUgc3BsaXQgYXQgcm93IDIgKHdoaWNoIGlzIDEgYXMgdGhlIHplcm8tYmFzZWQgaW5kZXgpLiBUaGlzIG1pZ2h0IGxlYWQgeW91IHRvIHRoaW5rIHRoYXQgeW91IGFyZSB1c2luZyBhIDEgYmFzZWQgaW5kZXggYnV0IHRoaXMgaXMgbm90IHRoZSBjYXNlLgorCitZb3UgY2FuIHNldCBvbmUgb2YgdGhlIEM8JHJvdz4gYW5kIEM8JGNvbD4gcGFyYW1ldGVycyBhcyB6ZXJvIGlmIHlvdSBkbyBub3Qgd2FudCBlaXRoZXIgYSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIHNwbGl0LgorCitFeGFtcGxlczoKKworICAgICR3b3Jrc2hlZXQtPmZyZWV6ZV9wYW5lcygxLCAwKTsgIyBGcmVlemUgdGhlIGZpcnN0IHJvdworICAgICR3b3Jrc2hlZXQtPmZyZWV6ZV9wYW5lcygnQTInKTsgIyBTYW1lIHVzaW5nIEExIG5vdGF0aW9uCisgICAgJHdvcmtzaGVldC0+ZnJlZXplX3BhbmVzKDAsIDEpOyAjIEZyZWV6ZSB0aGUgZmlyc3QgY29sdW1uCisgICAgJHdvcmtzaGVldC0+ZnJlZXplX3BhbmVzKCdCMScpOyAjIFNhbWUgdXNpbmcgQTEgbm90YXRpb24KKyAgICAkd29ya3NoZWV0LT5mcmVlemVfcGFuZXMoMSwgMik7ICMgRnJlZXplIGZpcnN0IHJvdyBhbmQgZmlyc3QgMiBjb2x1bW5zCisgICAgJHdvcmtzaGVldC0+ZnJlZXplX3BhbmVzKCdDMicpOyAjIFNhbWUgdXNpbmcgQTEgbm90YXRpb24KKworVGhlIHBhcmFtZXRlcnMgQzwkdG9wX3Jvdz4gYW5kIEM8JGxlZnRfY29sPiBhcmUgb3B0aW9uYWwuIFRoZXkgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdG9wLW1vc3Qgb3IgbGVmdC1tb3N0IHZpc2libGUgcm93IG9yIGNvbHVtbiBpbiB0aGUgc2Nyb2xsaW5nIHJlZ2lvbiBvZiB0aGUgcGFuZXMuIEZvciBleGFtcGxlIHRvIGZyZWV6ZSB0aGUgZmlyc3Qgcm93IGFuZCB0byBoYXZlIHRoZSBzY3JvbGxpbmcgcmVnaW9uIGJlZ2luIGF0IHJvdyB0d2VudHk6CisKKyAgICAkd29ya3NoZWV0LT5mcmVlemVfcGFuZXMoMSwgMCwgMjAsIDApOworCitZb3UgY2Fubm90IHVzZSBBMSBub3RhdGlvbiBmb3IgdGhlIEM8JHRvcF9yb3c+IGFuZCBDPCRsZWZ0X2NvbD4gcGFyYW1ldGVycy4KKworCitTZWUgYWxzbyB0aGUgQzxwYW5lcy5wbD4gcHJvZ3JhbSBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cmlidXRpb24uCisKKworCisKKz1oZWFkMiBzcGxpdF9wYW5lcygkeSwgJHgsICR0b3Bfcm93LCAkbGVmdF9jb2wpCisKK1RoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGRpdmlkZSBhIHdvcmtzaGVldCBpbnRvIGhvcml6b250YWwgb3IgdmVydGljYWwgcmVnaW9ucyBrbm93biBhcyBwYW5lcy4gVGhpcyBtZXRob2QgaXMgZGlmZmVyZW50IGZyb20gdGhlIEM8ZnJlZXplX3BhbmVzKCk+IG1ldGhvZCBpbiB0aGF0IHRoZSBzcGxpdHMgYmV0d2VlbiB0aGUgcGFuZXMgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyIGFuZCBlYWNoIHBhbmUgd2lsbCBoYXZlIGl0cyBvd24gc2Nyb2xsIGJhcnMuCisKK1RoZSBwYXJhbWV0ZXJzIEM8JHk+IGFuZCBDPCR4PiBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgc3BsaXQuIFRoZSB1bml0cyBmb3IgQzwkeT4gYW5kIEM8JHg+IGFyZSB0aGUgc2FtZSBhcyB0aG9zZSB1c2VkIGJ5IEV4Y2VsIHRvIHNwZWNpZnkgcm93IGhlaWdodCBhbmQgY29sdW1uIHdpZHRoLiBIb3dldmVyLCB0aGUgdmVydGljYWwgYW5kIGhvcml6b250YWwgdW5pdHMgYXJlIGRpZmZlcmVudCBmcm9tIGVhY2ggb3RoZXIuIFRoZXJlZm9yZSB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBDPCR5PiBhbmQgQzwkeD4gcGFyYW1ldGVycyBpbiB0ZXJtcyBvZiB0aGUgcm93IGhlaWdodHMgYW5kIGNvbHVtbiB3aWR0aHMgdGhhdCB5b3UgaGF2ZSBzZXQgb3IgdGhlIGRlZmF1bHQgdmFsdWVzIHdoaWNoIGFyZSBDPDEyLjc1PiBmb3IgYSByb3cgYW5kICBDPDguNDM+IGZvciBhIGNvbHVtbi4KKworWW91IGNhbiBzZXQgb25lIG9mIHRoZSBDPCR5PiBhbmQgQzwkeD4gcGFyYW1ldGVycyBhcyB6ZXJvIGlmIHlvdSBkbyBub3Qgd2FudCBlaXRoZXIgYSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIHNwbGl0LiBUaGUgcGFyYW1ldGVycyBDPCR0b3Bfcm93PiBhbmQgQzwkbGVmdF9jb2w+IGFyZSBvcHRpb25hbC4gVGhleSBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0b3AtbW9zdCBvciBsZWZ0LW1vc3QgdmlzaWJsZSByb3cgb3IgY29sdW1uIGluIHRoZSBib3R0b20tcmlnaHQgcGFuZS4KKworRXhhbXBsZToKKworICAgICR3b3Jrc2hlZXQtPnNwbGl0X3BhbmVzKDEyLjc1LCAwLCAgICAxLCAwKTsgIyBGaXJzdCByb3cKKyAgICAkd29ya3NoZWV0LT5zcGxpdF9wYW5lcygwLCAgICAgOC40MywgMCwgMSk7ICMgRmlyc3QgY29sdW1uCisgICAgJHdvcmtzaGVldC0+c3BsaXRfcGFuZXMoMTIuNzUsIDguNDMsIDEsIDEpOyAjIEZpcnN0IHJvdyBhbmQgY29sdW1uCisKK1lvdSBjYW5ub3QgdXNlIEExIG5vdGF0aW9uIHdpdGggdGhpcyBtZXRob2QuCisKK1NlZSBhbHNvIHRoZSBDPGZyZWV6ZV9wYW5lcygpPiBtZXRob2QgYW5kIHRoZSBDPHBhbmVzLnBsPiBwcm9ncmFtIGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3Rvcnkgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKworCitOb3RlOiBUaGlzIEM8c3BsaXRfcGFuZXMoKT4gbWV0aG9kIHdhcyBjYWxsZWQgQzx0aGF3X3BhbmVzKCk+IGluIG9sZGVyIHZlcnNpb25zLiBUaGUgb2xkZXIgbmFtZSBpcyBzdGlsbCBhdmFpbGFibGUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorCisKKworCis9aGVhZDIgbWVyZ2VfcmFuZ2UoJGZpcnN0X3JvdywgJGZpcnN0X2NvbCwgJGxhc3Rfcm93LCAkbGFzdF9jb2wsICR0b2tlbiwgJGZvcm1hdCwgJHV0Zl8xNl9iZSkKKworTWVyZ2luZyBjZWxscyBjYW4gYmUgYWNoaWV2ZWQgYnkgc2V0dGluZyB0aGUgQzxtZXJnZT4gcHJvcGVydHkgb2YgYSBGb3JtYXQgb2JqZWN0LCBzZWUgTDxDRUxMIEZPUk1BVFRJTkc+LiBIb3dldmVyLCB0aGlzIG9ubHkgYWxsb3dzIHNpbXBsZSBFeGNlbDUgc3R5bGUgaG9yaXpvbnRhbCBtZXJnaW5nIHdoaWNoIEV4Y2VsIHJlZmVycyB0byBhcyAiY2VudGVyIGFjcm9zcyBzZWxlY3Rpb24iLgorCitUaGUgQzxtZXJnZV9yYW5nZSgpPiBtZXRob2QgYWxsb3dzIHlvdSB0byBkbyBFeGNlbDk3KyBzdHlsZSBmb3JtYXR0aW5nIHdoZXJlIHRoZSBjZWxscyBjYW4gY29udGFpbiBvdGhlciB0eXBlcyBvZiBhbGlnbm1lbnQgaW4gYWRkaXRpb24gdG8gdGhlIG1lcmdpbmc6CisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZ24gID0+ICd2Y2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgID0+ICdjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0IzOkQ0JywgJ1ZlcnRpY2FsIGFuZCBob3Jpem9udGFsJywgJGZvcm1hdCk7CisKK0I8V0FSTklORz4uIFRoZSBmb3JtYXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB3aXRoIGEgQzxtZXJnZV9yYW5nZSgpPiBtZXRob2QgY2FsbCBpcyBtYXJrZWQgaW50ZXJuYWxseSBhcyBiZWluZyBhc3NvY2lhdGVkIHdpdGggYSBtZXJnZWQgcmFuZ2UuIEl0IGlzIGEgZmF0YWwgZXJyb3IgdG8gdXNlIGEgbWVyZ2VkIGZvcm1hdCBpbiBhIG5vbi1tZXJnZWQgY2VsbC4gSW5zdGVhZCB5b3Ugc2hvdWxkIHVzZSBzZXBhcmF0ZSBmb3JtYXRzIGZvciBtZXJnZWQgYW5kIG5vbi1tZXJnZWQgY2VsbHMuIFRoaXMgcmVzdHJpY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisKK1RoZSBDPCR1dGZfMTZfYmU+IHBhcmFtZXRlciBpcyBvcHRpb25hbCwgc2VlIGJlbG93LgorCitDPG1lcmdlX3JhbmdlKCk+IHdyaXRlcyBpdHMgQzwkdG9rZW4+IGFyZ3VtZW50IHVzaW5nIHRoZSB3b3Jrc2hlZXQgQzx3cml0ZSgpPiBtZXRob2QuIFRoZXJlZm9yZSBpdCB3aWxsIGhhbmRsZSBudW1iZXJzLCBzdHJpbmdzLCBmb3JtdWxhcyBvciB1cmxzIGFzIHJlcXVpcmVkLgorCitTZXR0aW5nIHRoZSBDPG1lcmdlPiBwcm9wZXJ0eSBvZiB0aGUgZm9ybWF0IGlzbid0IHJlcXVpcmVkIHdoZW4geW91IGFyZSB1c2luZyBDPG1lcmdlX3JhbmdlKCk+LiBJbiBmYWN0IHVzaW5nIGl0IHdpbGwgZXhjbHVkZSB0aGUgdXNlIG9mIGFueSBvdGhlciBob3Jpem9udGFsIGFsaWdubWVudCBvcHRpb24uCisKK09uIHN5c3RlbXMgd2l0aCBDPHBlcmwgNS44PiBhbmQgbGF0ZXIgdGhlIEM8bWVyZ2VfcmFuZ2UoKT4gbWV0aG9kIHdpbGwgYWxzbyBoYW5kbGUgc3RyaW5ncyBpbiBDPFVURi04PiBmb3JtYXQuCisKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjM6RDQnLCAiXHh7MjYzYX0iLCAkZm9ybWF0KTsgIyBTbWlsZXkKKworT24gZWFybGllciBQZXJsIHN5c3RlbXMgeW91ciBjYW4gc3BlY2lmeSBDPFVURi0xNkJFPiB3b3Jrc2hlZXQgbmFtZXMgdXNpbmcgYW4gYWRkaXRpb25hbCBvcHRpb25hbCBwYXJhbWV0ZXI6CisKKyAgICBteSAkc3RyID0gcGFjayAnbicsIDB4MjYzYTsKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjM6RDQnLCAkc3RyLCAkZm9ybWF0LCAxKTsgIyBTbWlsZXkKKworVGhlIGZ1bGwgcG9zc2liaWxpdGllcyBvZiB0aGlzIG1ldGhvZCBhcmUgc2hvd24gaW4gdGhlIEM8bWVyZ2UzLnBsPiB0byBDPG1lcmdlNi5wbD4gcHJvZ3JhbXMgaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorCisKKworCis9aGVhZDIgc2V0X3pvb20oJHNjYWxlKQorCitTZXQgdGhlIHdvcmtzaGVldCB6b29tIGZhY3RvciBpbiB0aGUgcmFuZ2UgQzwxMCBFPGx0Pj0gJHNjYWxlIEU8bHQ+PSA0MDA+OgorCisgICAgJHdvcmtzaGVldDEtPnNldF96b29tKDUwKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3pvb20oNzUpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfem9vbSgzMDApOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfem9vbSg0MDApOworCitUaGUgZGVmYXVsdCB6b29tIGZhY3RvciBpcyAxMDAuIFlvdSBjYW5ub3Qgem9vbSB0byAiU2VsZWN0aW9uIiBiZWNhdXNlIGl0IGlzIGNhbGN1bGF0ZWQgYnkgRXhjZWwgYXQgcnVuLXRpbWUuCisKK05vdGUsIEM8c2V0X3pvb20oKT4gZG9lcyBub3QgYWZmZWN0IHRoZSBzY2FsZSBvZiB0aGUgcHJpbnRlZCBwYWdlLiBGb3IgdGhhdCB5b3Ugc2hvdWxkIHVzZSBDPHNldF9wcmludF9zY2FsZSgpPi4KKworCisKKworPWhlYWQyIHJpZ2h0X3RvX2xlZnQoKQorCitUaGUgQzxyaWdodF90b19sZWZ0KCk+IG1ldGhvZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBkaXJlY3Rpb24gb2YgdGhlIHdvcmtzaGVldCBmcm9tIGxlZnQtdG8tcmlnaHQsIHdpdGggdGhlIEExIGNlbGwgaW4gdGhlIHRvcCBsZWZ0LCB0byByaWdodC10by1sZWZ0LCB3aXRoIHRoZSBoZSBBMSBjZWxsIGluIHRoZSB0b3AgcmlnaHQuCisKKyAgICAkd29ya3NoZWV0LT5yaWdodF90b19sZWZ0KCk7CisKK1RoaXMgaXMgdXNlZnVsIHdoZW4gY3JlYXRpbmcgQXJhYmljLCBIZWJyZXcgb3Igb3RoZXIgbmVhciBvciBmYXIgZWFzdGVybiB3b3Jrc2hlZXRzIHRoYXQgdXNlIHJpZ2h0LXRvLWxlZnQgYXMgdGhlIGRlZmF1bHQgZGlyZWN0aW9uLgorCisKKworCis9aGVhZDIgaGlkZV96ZXJvKCkKKworVGhlIEM8aGlkZV96ZXJvKCk+IG1ldGhvZCBpcyB1c2VkIHRvIGhpZGUgYW55IHplcm8gdmFsdWVzIHRoYXQgYXBwZWFyIGluIGNlbGxzLgorCisgICAgJHdvcmtzaGVldC0+aGlkZV96ZXJvKCk7CisKK0luIEV4Y2VsIHRoaXMgb3B0aW9uIGlzIGZvdW5kIHVuZGVyIFRvb2xzLT5PcHRpb25zLT5WaWV3LgorCisKKworCis9aGVhZDIgc2V0X3RhYl9jb2xvcigpCisKK1RoZSBDPHNldF90YWJfY29sb3IoKT4gbWV0aG9kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBjb2xvdXIgb2YgdGhlIHdvcmtzaGVldCB0YWIuIFRoaXMgZmVhdHVyZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBFeGNlbCAyMDAyIGFuZCBsYXRlci4gWW91IGNhbiB1c2Ugb25lIG9mIHRoZSBzdGFuZGFyZCBjb2xvdXIgbmFtZXMgcHJvdmlkZWQgYnkgdGhlIEZvcm1hdCBvYmplY3Qgb3IgYSBjb2xvdXIgaW5kZXguIFNlZSBMPENPTE9VUlMgSU4gRVhDRUw+IGFuZCB0aGUgQzxzZXRfY3VzdG9tX2NvbG9yKCk+IG1ldGhvZC4KKworICAgICR3b3Jrc2hlZXQxLT5zZXRfdGFiX2NvbG9yKCdyZWQnKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3RhYl9jb2xvcigweDBDKTsKKworU2VlIHRoZSBDPHRhYl9jb2xvcnMucGw+IHByb2dyYW0gaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDIgYXV0b2ZpbHRlcigkZmlyc3Rfcm93LCAkZmlyc3RfY29sLCAkbGFzdF9yb3csICRsYXN0X2NvbCkKKworVGhpcyBtZXRob2QgYWxsb3dzIGFuIGF1dG9maWx0ZXIgdG8gYmUgYWRkZWQgdG8gYSB3b3Jrc2hlZXQuIEFuIGF1dG9maWx0ZXIgaXMgYSB3YXkgb2YgYWRkaW5nIGRyb3AgZG93biBsaXN0cyB0byB0aGUgaGVhZGVycyBvZiBhIDJEIHJhbmdlIG9mIHdvcmtzaGVldCBkYXRhLiBUaGlzIGlzIHR1cm4gYWxsb3cgdXNlcnMgdG8gZmlsdGVyIHRoZSBkYXRhIGJhc2VkIG9uIHNpbXBsZSBjcml0ZXJpYSBzbyB0aGF0IHNvbWUgZGF0YSBpcyBzaG93biBhbmQgc29tZSBpcyBoaWRkZW4uCisKK1RvIGFkZCBhbiBhdXRvZmlsdGVyIHRvIGEgd29ya3NoZWV0OgorCisgICAgJHdvcmtzaGVldC0+YXV0b2ZpbHRlcigwLCAwLCAxMCwgMyk7CisgICAgJHdvcmtzaGVldC0+YXV0b2ZpbHRlcignQTE6RDExJyk7ICAgICMgU2FtZSBhcyBhYm92ZSBpbiBBMSBub3RhdGlvbi4KKworRmlsdGVyIGNvbmRpdGlvbnMgY2FuIGJlIGFwcGxpZWQgdXNpbmcgdGhlIEM8ZmlsdGVyX2NvbHVtbigpPiBtZXRob2QuCisKK1NlZSB0aGUgQzxhdXRvZmlsdGVyLnBsPiBwcm9ncmFtIGluIHRoZSBleGFtcGxlcyBkaXJlY3Rvcnkgb2YgdGhlIGRpc3RybyBmb3IgYSBtb3JlIGRldGFpbGVkIGV4YW1wbGUuCisKKworCisKKz1oZWFkMiBmaWx0ZXJfY29sdW1uKCRjb2x1bW4sICRleHByZXNzaW9uKQorCisKK1RoZSBDPGZpbHRlcl9jb2x1bW4+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgY29sdW1ucyBpbiBhIGF1dG9maWx0ZXIgcmFuZ2UgYmFzZWQgb24gc2ltcGxlIGNvbmRpdGlvbnMuCisKK0I8Tk9URTo+IEl0IGlzbid0IHN1ZmZpY2llbnQgdG8ganVzdCBzcGVjaWZ5IHRoZSBmaWx0ZXIgY29uZGl0aW9uLiBZb3UgbXVzdCBhbHNvIGhpZGUgYW55IHJvd3MgdGhhdCBkb24ndCBtYXRjaCB0aGUgZmlsdGVyIGNvbmRpdGlvbi4gUm93cyBhcmUgaGlkZGVuIHVzaW5nIHRoZSBDPHNldF9yb3coKT4gQzx2aXNpYmxlPiBwYXJhbWV0ZXIuIEM8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+IGNhbm5vdCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgc2luY2UgaXQgaXNuJ3QgcGFydCBvZiB0aGUgZmlsZSBmb3JtYXQuIFNlZSB0aGUgQzxhdXRvZmlsdGVyLnBsPiBwcm9ncmFtIGluIHRoZSBleGFtcGxlcyBkaXJlY3Rvcnkgb2YgdGhlIGRpc3RybyBmb3IgYW4gZXhhbXBsZS4KKworVGhlIGNvbmRpdGlvbnMgZm9yIHRoZSBmaWx0ZXIgYXJlIHNwZWNpZmllZCB1c2luZyBzaW1wbGUgZXhwcmVzc2lvbnM6CisKKyAgICAkd29ya3NoZWV0LT5maWx0ZXJfY29sdW1uKCdBJywgJ3ggPiAyMDAwJyk7CisgICAgJHdvcmtzaGVldC0+ZmlsdGVyX2NvbHVtbignQicsICd4ID4gMjAwMCBhbmQgeCA8IDUwMDAnKTsKKworVGhlIEM8JGNvbHVtbj4gcGFyYW1ldGVyIGNhbiBlaXRoZXIgYmUgYSB6ZXJvIGluZGV4ZWQgY29sdW1uIG51bWJlciBvciBhIHN0cmluZyBjb2x1bW4gbmFtZS4KKworVGhlIGZvbGxvd2luZyBvcGVyYXRvcnMgYXJlIGF2YWlsYWJsZToKKworICAgIE9wZXJhdG9yICAgICAgICBTeW5vbnltcworICAgICAgID09ICAgICAgICAgICA9ICAgZXEgID1+CisgICAgICAgIT0gICAgICAgICAgIDw+ICBuZSAgIT0KKyAgICAgICA+CisgICAgICAgPAorICAgICAgID49CisgICAgICAgPD0KKworICAgICAgIGFuZCAgICAgICAgICAmJgorICAgICAgIG9yICAgICAgICAgICB8fAorCitUaGUgb3BlcmF0b3Igc3lub255bXMgYXJlIGp1c3Qgc3ludGFjdGljIHN1Z2FyIHRvIG1ha2UgeW91IG1vcmUgY29tZm9ydGFibGUgdXNpbmcgdGhlIGV4cHJlc3Npb25zLiBJdCBpcyBpbXBvcnRhbnQgdG8gcmVtZW1iZXIgdGhhdCB0aGUgZXhwcmVzc2lvbnMgd2lsbCBiZSBpbnRlcnByZXRlZCBieSBFeGNlbCBhbmQgbm90IGJ5IHBlcmwuCisKK0FuIGV4cHJlc3Npb24gY2FuIGNvbXByaXNlIGEgc2luZ2xlIHN0YXRlbWVudCBvciB0d28gc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgdGhlIEM8YW5kPiBhbmQgQzxvcj4gb3BlcmF0b3JzLiBGb3IgZXhhbXBsZToKKworICAgICd4IDwgIDIwMDAnCisgICAgJ3ggPiAgMjAwMCcKKyAgICAneCA9PSAyMDAwJworICAgICd4ID4gIDIwMDAgYW5kIHggPCAgNTAwMCcKKyAgICAneCA9PSAyMDAwIG9yICB4ID09IDUwMDAnCisKK0ZpbHRlcmluZyBvZiBibGFuayBvciBub24tYmxhbmsgZGF0YSBjYW4gYmUgYWNoaWV2ZWQgYnkgdXNpbmcgYSB2YWx1ZSBvZiBDPEJsYW5rcz4gb3IgQzxOb25CbGFua3M+IGluIHRoZSBleHByZXNzaW9uOgorCisgICAgJ3ggPT0gQmxhbmtzJworICAgICd4ID09IE5vbkJsYW5rcycKKworVG9wIDEwIHN0eWxlIGZpbHRlcnMgY2FuIGJlIHNwZWNpZmllZCB1c2luZyBhIGV4cHJlc3Npb24gbGlrZSB0aGUgZm9sbG93aW5nOgorCisgICAgVG9wfEJvdHRvbSAxLTUwMCBJdGVtc3wlCisKK0ZvciBleGFtcGxlOgorCisgICAgJ1RvcCAgICAxMCBJdGVtcycKKyAgICAnQm90dG9tICA1IEl0ZW1zJworICAgICdUb3AgICAgMjUgJScKKyAgICAnQm90dG9tIDUwICUnCisKK0V4Y2VsIGFsc28gYWxsb3dzIHNvbWUgc2ltcGxlIHN0cmluZyBtYXRjaGluZyBvcGVyYXRpb25zOgorCisgICAgJ3ggPX4gYionICAgIyBiZWdpbnMgd2l0aCBiCisgICAgJ3ggIX4gYionICAgIyBkb2Vzbid0IGJlZ2luIHdpdGggYgorICAgICd4ID1+ICpiJyAgICMgZW5kcyB3aXRoIGIKKyAgICAneCAhfiAqYicgICAjIGRvZXNuJ3QgZW5kIHdpdGggYgorICAgICd4ID1+ICpiKicgICMgY29udGFpbnMgYgorICAgICd4ICF+ICpiKicgICMgZG9lc24ndCBjb250YWlucyBiCisKK1lvdSBjYW4gYWxzbyB1c2UgQzwqPiB0byBtYXRjaCBhbnkgY2hhcmFjdGVyIG9yIG51bWJlciBhbmQgQzw/PiB0byBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlciBvciBudW1iZXIuIE5vIG90aGVyIHJlZ3VsYXIgZXhwcmVzc2lvbiBxdWFudGlmaWVyIGlzIHN1cHBvcnRlZCBieSBFeGNlbCdzIGZpbHRlcnMuIEV4Y2VsJ3MgcmVndWxhciBleHByZXNzaW9uIGNoYXJhY3RlcnMgY2FuIGJlIGVzY2FwZWQgdXNpbmcgQzx+Pi4KKworVGhlIHBsYWNlaG9sZGVyIHZhcmlhYmxlIEM8eD4gaW4gdGhlIGFib3ZlIGV4YW1wbGVzIGNhbiBiZSByZXBsYWNlZCBieSBhbnkgc2ltcGxlIHN0cmluZy4gVGhlIGFjdHVhbCBwbGFjZWhvbGRlciBuYW1lIGlzIGlnbm9yZWQgaW50ZXJuYWxseSBzbyB0aGUgZm9sbG93aW5nIGFyZSBhbGwgZXF1aXZhbGVudDoKKworICAgICd4ICAgICA8IDIwMDAnCisgICAgJ2NvbCAgIDwgMjAwMCcKKyAgICAnUHJpY2UgPCAyMDAwJworCitBbHNvLCBub3RlIHRoYXQgYSBmaWx0ZXIgY29uZGl0aW9uIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBjb2x1bW4gaW4gYSByYW5nZSBzcGVjaWZpZWQgYnkgdGhlIEM8YXV0b2ZpbHRlcigpPiBXb3Jrc2hlZXQgbWV0aG9kLgorCitTZWUgdGhlIEM8YXV0b2ZpbHRlci5wbD4gcHJvZ3JhbSBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8gZm9yIGEgbW9yZSBkZXRhaWxlZCBleGFtcGxlLgorCisKKworCis9aGVhZDEgUEFHRSBTRVQtVVAgTUVUSE9EUworCitQYWdlIHNldC11cCBtZXRob2RzIGFmZmVjdCB0aGUgd2F5IHRoYXQgYSB3b3Jrc2hlZXQgbG9va3Mgd2hlbiBpdCBpcyBwcmludGVkLiBUaGV5IGNvbnRyb2wgZmVhdHVyZXMgc3VjaCBhcyBwYWdlIGhlYWRlcnMgYW5kIGZvb3RlcnMgYW5kIG1hcmdpbnMuIFRoZXNlIG1ldGhvZHMgYXJlIHJlYWxseSBqdXN0IHN0YW5kYXJkIHdvcmtzaGVldCBtZXRob2RzLiBUaGV5IGFyZSBkb2N1bWVudGVkIGhlcmUgaW4gYSBzZXBhcmF0ZSBzZWN0aW9uIGZvciB0aGUgc2FrZSBvZiBjbGFyaXR5LgorCitUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSBmb3IgcGFnZSBzZXQtdXA6CisKKyAgICBzZXRfbGFuZHNjYXBlKCkKKyAgICBzZXRfcG9ydHJhaXQoKQorICAgIHNldF9wYWdlX3ZpZXcoKQorICAgIHNldF9wYXBlcigpCisgICAgY2VudGVyX2hvcml6b250YWxseSgpCisgICAgY2VudGVyX3ZlcnRpY2FsbHkoKQorICAgIHNldF9tYXJnaW5zKCkKKyAgICBzZXRfaGVhZGVyKCkKKyAgICBzZXRfZm9vdGVyKCkKKyAgICByZXBlYXRfcm93cygpCisgICAgcmVwZWF0X2NvbHVtbnMoKQorICAgIGhpZGVfZ3JpZGxpbmVzKCkKKyAgICBwcmludF9yb3dfY29sX2hlYWRlcnMoKQorICAgIHByaW50X2FyZWEoKQorICAgIHByaW50X2Fjcm9zcygpCisgICAgZml0X3RvX3BhZ2VzKCkKKyAgICBzZXRfc3RhcnRfcGFnZSgpCisgICAgc2V0X3ByaW50X3NjYWxlKCkKKyAgICBzZXRfaF9wYWdlYnJlYWtzKCkKKyAgICBzZXRfdl9wYWdlYnJlYWtzKCkKKworCitBIGNvbW1vbiByZXF1aXJlbWVudCB3aGVuIHdvcmtpbmcgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBpcyB0byBhcHBseSB0aGUgc2FtZSBwYWdlIHNldC11cCBmZWF0dXJlcyB0byBhbGwgb2YgdGhlIHdvcmtzaGVldHMgaW4gYSB3b3JrYm9vay4gVG8gZG8gdGhpcyB5b3UgY2FuIHVzZSB0aGUgQzxzaGVldHMoKT4gbWV0aG9kIG9mIHRoZSBDPHdvcmtib29rPiBjbGFzcyB0byBhY2Nlc3MgdGhlIGFycmF5IG9mIHdvcmtzaGVldHMgaW4gYSB3b3JrYm9vazoKKworICAgIGZvcmVhY2ggJHdvcmtzaGVldCAoJHdvcmtib29rLT5zaGVldHMoKSkgeworICAgICAgICR3b3Jrc2hlZXQtPnNldF9sYW5kc2NhcGUoKTsKKyAgICB9CisKKworCisKKz1oZWFkMiBzZXRfbGFuZHNjYXBlKCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlIG9yaWVudGF0aW9uIG9mIGEgd29ya3NoZWV0J3MgcHJpbnRlZCBwYWdlIHRvIGxhbmRzY2FwZToKKworICAgICR3b3Jrc2hlZXQtPnNldF9sYW5kc2NhcGUoKTsgIyBMYW5kc2NhcGUgbW9kZQorCisKKworCis9aGVhZDIgc2V0X3BvcnRyYWl0KCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlIG9yaWVudGF0aW9uIG9mIGEgd29ya3NoZWV0J3MgcHJpbnRlZCBwYWdlIHRvIHBvcnRyYWl0LiBUaGUgZGVmYXVsdCB3b3Jrc2hlZXQgb3JpZW50YXRpb24gaXMgcG9ydHJhaXQsIHNvIHlvdSB3b24ndCBnZW5lcmFsbHkgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kLgorCisgICAgJHdvcmtzaGVldC0+c2V0X3BvcnRyYWl0KCk7ICMgUG9ydHJhaXQgbW9kZQorCisKKworPWhlYWQyIHNldF9wYWdlX3ZpZXcoKQorCitUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIHdvcmtzaGVldCBpbiAiUGFnZSBWaWV3IiBtb2RlLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBieSBNYWMgRXhjZWwsIHdoZXJlIGl0IGlzIHRoZSBkZWZhdWx0LgorCisgICAgJHdvcmtzaGVldC0+c2V0X3BhZ2VfdmlldygpOworCisKKworPWhlYWQyIHNldF9wYXBlcigkaW5kZXgpCisKK1RoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSBwYXBlciBmb3JtYXQgZm9yIHRoZSBwcmludGVkIG91dHB1dCBvZiBhIHdvcmtzaGVldC4gVGhlIGZvbGxvd2luZyBwYXBlciBzdHlsZXMgYXJlIGF2YWlsYWJsZToKKworICAgIEluZGV4ICAgUGFwZXIgZm9ybWF0ICAgICAgICAgICAgUGFwZXIgc2l6ZQorICAgID09PT09ICAgPT09PT09PT09PT09ICAgICAgICAgICAgPT09PT09PT09PQorICAgICAgMCAgICAgUHJpbnRlciBkZWZhdWx0ICAgICAgICAgLQorICAgICAgMSAgICAgTGV0dGVyICAgICAgICAgICAgICAgICAgOCAxLzIgeCAxMSBpbgorICAgICAgMiAgICAgTGV0dGVyIFNtYWxsICAgICAgICAgICAgOCAxLzIgeCAxMSBpbgorICAgICAgMyAgICAgVGFibG9pZCAgICAgICAgICAgICAgICAgMTEgeCAxNyBpbgorICAgICAgNCAgICAgTGVkZ2VyICAgICAgICAgICAgICAgICAgMTcgeCAxMSBpbgorICAgICAgNSAgICAgTGVnYWwgICAgICAgICAgICAgICAgICAgOCAxLzIgeCAxNCBpbgorICAgICAgNiAgICAgU3RhdGVtZW50ICAgICAgICAgICAgICAgNSAxLzIgeCA4IDEvMiBpbgorICAgICAgNyAgICAgRXhlY3V0aXZlICAgICAgICAgICAgICAgNyAxLzQgeCAxMCAxLzIgaW4KKyAgICAgIDggICAgIEEzICAgICAgICAgICAgICAgICAgICAgIDI5NyB4IDQyMCBtbQorICAgICAgOSAgICAgQTQgICAgICAgICAgICAgICAgICAgICAgMjEwIHggMjk3IG1tCisgICAgIDEwICAgICBBNCBTbWFsbCAgICAgICAgICAgICAgICAyMTAgeCAyOTcgbW0KKyAgICAgMTEgICAgIEE1ICAgICAgICAgICAgICAgICAgICAgIDE0OCB4IDIxMCBtbQorICAgICAxMiAgICAgQjQgICAgICAgICAgICAgICAgICAgICAgMjUwIHggMzU0IG1tCisgICAgIDEzICAgICBCNSAgICAgICAgICAgICAgICAgICAgICAxODIgeCAyNTcgbW0KKyAgICAgMTQgICAgIEZvbGlvICAgICAgICAgICAgICAgICAgIDggMS8yIHggMTMgaW4KKyAgICAgMTUgICAgIFF1YXJ0byAgICAgICAgICAgICAgICAgIDIxNSB4IDI3NSBtbQorICAgICAxNiAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgMTB4MTQgaW4KKyAgICAgMTcgICAgIC0gICAgICAgICAgICAgICAgICAgICAgIDExeDE3IGluCisgICAgIDE4ICAgICBOb3RlICAgICAgICAgICAgICAgICAgICA4IDEvMiB4IDExIGluCisgICAgIDE5ICAgICBFbnZlbG9wZSAgOSAgICAgICAgICAgICAzIDcvOCB4IDggNy84CisgICAgIDIwICAgICBFbnZlbG9wZSAxMCAgICAgICAgICAgICA0IDEvOCB4IDkgMS8yCisgICAgIDIxICAgICBFbnZlbG9wZSAxMSAgICAgICAgICAgICA0IDEvMiB4IDEwIDMvOAorICAgICAyMiAgICAgRW52ZWxvcGUgMTIgICAgICAgICAgICAgNCAzLzQgeCAxMQorICAgICAyMyAgICAgRW52ZWxvcGUgMTQgICAgICAgICAgICAgNSB4IDExIDEvMgorICAgICAyNCAgICAgQyBzaXplIHNoZWV0ICAgICAgICAgICAgLQorICAgICAyNSAgICAgRCBzaXplIHNoZWV0ICAgICAgICAgICAgLQorICAgICAyNiAgICAgRSBzaXplIHNoZWV0ICAgICAgICAgICAgLQorICAgICAyNyAgICAgRW52ZWxvcGUgREwgICAgICAgICAgICAgMTEwIHggMjIwIG1tCisgICAgIDI4ICAgICBFbnZlbG9wZSBDMyAgICAgICAgICAgICAzMjQgeCA0NTggbW0KKyAgICAgMjkgICAgIEVudmVsb3BlIEM0ICAgICAgICAgICAgIDIyOSB4IDMyNCBtbQorICAgICAzMCAgICAgRW52ZWxvcGUgQzUgICAgICAgICAgICAgMTYyIHggMjI5IG1tCisgICAgIDMxICAgICBFbnZlbG9wZSBDNiAgICAgICAgICAgICAxMTQgeCAxNjIgbW0KKyAgICAgMzIgICAgIEVudmVsb3BlIEM2NSAgICAgICAgICAgIDExNCB4IDIyOSBtbQorICAgICAzMyAgICAgRW52ZWxvcGUgQjQgICAgICAgICAgICAgMjUwIHggMzUzIG1tCisgICAgIDM0ICAgICBFbnZlbG9wZSBCNSAgICAgICAgICAgICAxNzYgeCAyNTAgbW0KKyAgICAgMzUgICAgIEVudmVsb3BlIEI2ICAgICAgICAgICAgIDE3NiB4IDEyNSBtbQorICAgICAzNiAgICAgRW52ZWxvcGUgICAgICAgICAgICAgICAgMTEwIHggMjMwIG1tCisgICAgIDM3ICAgICBNb25hcmNoICAgICAgICAgICAgICAgICAzLjg3NSB4IDcuNSBpbgorICAgICAzOCAgICAgRW52ZWxvcGUgICAgICAgICAgICAgICAgMyA1LzggeCA2IDEvMiBpbgorICAgICAzOSAgICAgRmFuZm9sZCAgICAgICAgICAgICAgICAgMTQgNy84IHggMTEgaW4KKyAgICAgNDAgICAgIEdlcm1hbiBTdGQgRmFuZm9sZCAgICAgIDggMS8yIHggMTIgaW4KKyAgICAgNDEgICAgIEdlcm1hbiBMZWdhbCBGYW5mb2xkICAgIDggMS8yIHggMTMgaW4KKworCitOb3RlLCBpdCBpcyBsaWtlbHkgdGhhdCBub3QgYWxsIG9mIHRoZXNlIHBhcGVyIHR5cGVzIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBlbmQgdXNlciBzaW5jZSBpdCB3aWxsIGRlcGVuZCBvbiB0aGUgcGFwZXIgZm9ybWF0cyB0aGF0IHRoZSB1c2VyJ3MgcHJpbnRlciBzdXBwb3J0cy4gVGhlcmVmb3JlLCBpdCBpcyBiZXN0IHRvIHN0aWNrIHRvIHN0YW5kYXJkIHBhcGVyIHR5cGVzLgorCisgICAgJHdvcmtzaGVldC0+c2V0X3BhcGVyKDEpOyAjIFVTIExldHRlcgorICAgICR3b3Jrc2hlZXQtPnNldF9wYXBlcig5KTsgIyBBNAorCitJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBwYXBlciB0eXBlIHRoZSB3b3Jrc2hlZXQgd2lsbCBwcmludCB1c2luZyB0aGUgcHJpbnRlcidzIGRlZmF1bHQgcGFwZXIuCisKKworCisKKz1oZWFkMiBjZW50ZXJfaG9yaXpvbnRhbGx5KCkKKworQ2VudGVyIHRoZSB3b3Jrc2hlZXQgZGF0YSBob3Jpem9udGFsbHkgYmV0d2VlbiB0aGUgbWFyZ2lucyBvbiB0aGUgcHJpbnRlZCBwYWdlOgorCisgICAgJHdvcmtzaGVldC0+Y2VudGVyX2hvcml6b250YWxseSgpOworCisKKworCis9aGVhZDIgY2VudGVyX3ZlcnRpY2FsbHkoKQorCitDZW50ZXIgdGhlIHdvcmtzaGVldCBkYXRhIHZlcnRpY2FsbHkgYmV0d2VlbiB0aGUgbWFyZ2lucyBvbiB0aGUgcHJpbnRlZCBwYWdlOgorCisgICAgJHdvcmtzaGVldC0+Y2VudGVyX3ZlcnRpY2FsbHkoKTsKKworCisKKworPWhlYWQyIHNldF9tYXJnaW5zKCRpbmNoZXMpCisKK1RoZXJlIGFyZSBzZXZlcmFsIG1ldGhvZHMgYXZhaWxhYmxlIGZvciBzZXR0aW5nIHRoZSB3b3Jrc2hlZXQgbWFyZ2lucyBvbiB0aGUgcHJpbnRlZCBwYWdlOgorCisgICAgc2V0X21hcmdpbnMoKSAgICAgICAgIyBTZXQgYWxsIG1hcmdpbnMgdG8gdGhlIHNhbWUgdmFsdWUKKyAgICBzZXRfbWFyZ2luc19MUigpICAgICAjIFNldCBsZWZ0IGFuZCByaWdodCBtYXJnaW5zIHRvIHRoZSBzYW1lIHZhbHVlCisgICAgc2V0X21hcmdpbnNfVEIoKSAgICAgIyBTZXQgdG9wIGFuZCBib3R0b20gbWFyZ2lucyB0byB0aGUgc2FtZSB2YWx1ZQorICAgIHNldF9tYXJnaW5fbGVmdCgpOyAgICMgU2V0IGxlZnQgbWFyZ2luCisgICAgc2V0X21hcmdpbl9yaWdodCgpOyAgIyBTZXQgcmlnaHQgbWFyZ2luCisgICAgc2V0X21hcmdpbl90b3AoKTsgICAgIyBTZXQgdG9wIG1hcmdpbgorICAgIHNldF9tYXJnaW5fYm90dG9tKCk7ICMgU2V0IGJvdHRvbSBtYXJnaW4KKworQWxsIG9mIHRoZXNlIG1ldGhvZHMgdGFrZSBhIGRpc3RhbmNlIGluIGluY2hlcyBhcyBhIHBhcmFtZXRlci4gTm90ZTogMSBpbmNoID0gMjUuNG1tLiA7LSkgVGhlIGRlZmF1bHQgbGVmdCBhbmQgcmlnaHQgbWFyZ2luIGlzIDAuNzUgaW5jaC4gVGhlIGRlZmF1bHQgdG9wIGFuZCBib3R0b20gbWFyZ2luIGlzIDEuMDAgaW5jaC4KKworCisKKz1oZWFkMiBzZXRfaGVhZGVyKCRzdHJpbmcsICRtYXJnaW4pCisKK0hlYWRlcnMgYW5kIGZvb3RlcnMgYXJlIGdlbmVyYXRlZCB1c2luZyBhIEM8JHN0cmluZz4gd2hpY2ggaXMgYSBjb21iaW5hdGlvbiBvZiBwbGFpbiB0ZXh0IGFuZCBjb250cm9sIGNoYXJhY3RlcnMuIFRoZSBDPCRtYXJnaW4+IHBhcmFtZXRlciBpcyBvcHRpb25hbC4KKworVGhlIGF2YWlsYWJsZSBjb250cm9sIGNoYXJhY3RlciBhcmU6CisKKyAgICBDb250cm9sICAgICAgICAgICAgIENhdGVnb3J5ICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAgICA9PT09PT09ICAgICAgICAgICAgID09PT09PT09ICAgICAgICAgICAgPT09PT09PT09PT0KKyAgICAmTCAgICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICAgICAgTGVmdAorICAgICZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZW50ZXIKKyAgICAmUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQKKworICAgICZQICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb24gICAgICAgICBQYWdlIG51bWJlcgorICAgICZOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbCBudW1iZXIgb2YgcGFnZXMKKyAgICAmRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZQorICAgICZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lCisgICAgJkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgbmFtZQorICAgICZBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXQgbmFtZQorICAgICZaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrYm9vayBwYXRoCisKKyAgICAmZm9udHNpemUgICAgICAgICAgIEZvbnQgICAgICAgICAgICAgICAgRm9udCBzaXplCisgICAgJiJmb250LHN0eWxlIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnQgbmFtZSBhbmQgc3R5bGUKKyAgICAmVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlIHVuZGVybGluZQorICAgICZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUgdW5kZXJsaW5lCisgICAgJlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlrZXRocm91Z2gKKyAgICAmWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwZXJzY3JpcHQKKyAgICAmWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic2NyaXB0CisKKyAgICAmJiAgICAgICAgICAgICAgICAgIE1pc2NlbGxhbmVvdXMgICAgICAgTGl0ZXJhbCBhbXBlcnNhbmQgJgorCisKK1RleHQgaW4gaGVhZGVycyBhbmQgZm9vdGVycyBjYW4gYmUganVzdGlmaWVkIChhbGlnbmVkKSB0byB0aGUgbGVmdCwgY2VudGVyIGFuZCByaWdodCBieSBwcmVmaXhpbmcgdGhlIHRleHQgd2l0aCB0aGUgY29udHJvbCBjaGFyYWN0ZXJzIEM8Jkw+LCBDPCZDPiBhbmQgQzwmUj4uCisKK0ZvciBleGFtcGxlICh3aXRoIEFTQ0lJIGFydCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVzdWx0cyk6CisKKyAgICAkd29ya3NoZWV0LT5zZXRfaGVhZGVyKCcmTEhlbGxvJyk7CisKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8IEhlbGxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKKworICAgICR3b3Jrc2hlZXQtPnNldF9oZWFkZXIoJyZDSGVsbG8nKTsKKworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIEhlbGxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKworCisgICAgJHdvcmtzaGVldC0+c2V0X2hlYWRlcignJlJIZWxsbycpOworCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlbGxvIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisKK0ZvciBzaW1wbGUgdGV4dCwgaWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBqdXN0aWZpY2F0aW9uIHRoZSB0ZXh0IHdpbGwgYmUgY2VudHJlZC4gSG93ZXZlciwgeW91IG11c3QgcHJlZml4IHRoZSB0ZXh0IHdpdGggQzwmQz4gaWYgeW91IHNwZWNpZnkgYSBmb250IG5hbWUgb3IgYW55IG90aGVyIGZvcm1hdHRpbmc6CisKKyAgICAkd29ya3NoZWV0LT5zZXRfaGVhZGVyKCdIZWxsbycpOworCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgSGVsbG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisKK1lvdSBjYW4gaGF2ZSB0ZXh0IGluIGVhY2ggb2YgdGhlIGp1c3RpZmljYXRpb24gcmVnaW9uczoKKworICAgICR3b3Jrc2hlZXQtPnNldF9oZWFkZXIoJyZMQ2lhbyZDQmVsbG8mUkNpZWxvJyk7CisKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8IENpYW8gICAgICAgICAgICAgICAgICAgICBCZWxsbyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2llbG8gfAorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKKworVGhlIGluZm9ybWF0aW9uIGNvbnRyb2wgY2hhcmFjdGVycyBhY3QgYXMgdmFyaWFibGVzIHRoYXQgRXhjZWwgd2lsbCB1cGRhdGUgYXMgdGhlIHdvcmtib29rIG9yIHdvcmtzaGVldCBjaGFuZ2VzLiBUaW1lcyBhbmQgZGF0ZXMgYXJlIGluIHRoZSB1c2VycyBkZWZhdWx0IGZvcm1hdDoKKworICAgICR3b3Jrc2hlZXQtPnNldF9oZWFkZXIoJyZDUGFnZSAmUCBvZiAmTicpOworCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2UgMSBvZiA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisKKyAgICAkd29ya3NoZWV0LT5zZXRfaGVhZGVyKCcmQ1VwZGF0ZWQgYXQgJlQnKTsKKworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgICAgIFVwZGF0ZWQgYXQgMTI6MzAgUE0gICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKworCisKK1lvdSBjYW4gc3BlY2lmeSB0aGUgZm9udCBzaXplIG9mIGEgc2VjdGlvbiBvZiB0aGUgdGV4dCBieSBwcmVmaXhpbmcgaXQgd2l0aCB0aGUgY29udHJvbCBjaGFyYWN0ZXIgQzwmbj4gd2hlcmUgQzxuPiBpcyB0aGUgZm9udCBzaXplOgorCisgICAgJHdvcmtzaGVldDEtPnNldF9oZWFkZXIoJyZDJjMwSGVsbG8gQmlnJyAgKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2hlYWRlcignJkMmMTBIZWxsbyBTbWFsbCcpOworCitZb3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgb2YgYSBzZWN0aW9uIG9mIHRoZSB0ZXh0IGJ5IHByZWZpeGluZyBpdCB3aXRoIHRoZSBjb250cm9sIHNlcXVlbmNlIEM8JiJmb250LHN0eWxlIj4gd2hlcmUgQzxmb250bmFtZT4gaXMgYSBmb250IG5hbWUgc3VjaCBhcyAiQ291cmllciBOZXciIG9yICJUaW1lcyBOZXcgUm9tYW4iIGFuZCBDPHN0eWxlPiBpcyBvbmUgb2YgdGhlIHN0YW5kYXJkIFdpbmRvd3MgZm9udCBkZXNjcmlwdGlvbnM6ICJSZWd1bGFyIiwgIkl0YWxpYyIsICJCb2xkIiBvciAiQm9sZCBJdGFsaWMiOgorCisgICAgJHdvcmtzaGVldDEtPnNldF9oZWFkZXIoJyZDJiJDb3VyaWVyIE5ldyxJdGFsaWMiSGVsbG8nKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2hlYWRlcignJkMmIkNvdXJpZXIgTmV3LEJvbGQgSXRhbGljIkhlbGxvJyk7CisgICAgJHdvcmtzaGVldDMtPnNldF9oZWFkZXIoJyZDJiJUaW1lcyBOZXcgUm9tYW4sUmVndWxhciJIZWxsbycpOworCitJdCBpcyBwb3NzaWJsZSB0byBjb21iaW5lIGFsbCBvZiB0aGVzZSBmZWF0dXJlcyB0b2dldGhlciB0byBjcmVhdGUgc29waGlzdGljYXRlZCBoZWFkZXJzIGFuZCBmb290ZXJzLiBBcyBhbiBhaWQgdG8gc2V0dGluZyB1cCBjb21wbGljYXRlZCBoZWFkZXJzIGFuZCBmb290ZXJzIHlvdSBjYW4gcmVjb3JkIGEgcGFnZSBzZXQtdXAgYXMgYSBtYWNybyBpbiBFeGNlbCBhbmQgbG9vayBhdCB0aGUgZm9ybWF0IHN0cmluZ3MgdGhhdCBWQkEgcHJvZHVjZXMuIFJlbWVtYmVyIGhvd2V2ZXIgdGhhdCBWQkEgdXNlcyB0d28gZG91YmxlIHF1b3RlcyBDPCIiPiB0byBpbmRpY2F0ZSBhIHNpbmdsZSBkb3VibGUgcXVvdGUuIEZvciB0aGUgbGFzdCBleGFtcGxlIGFib3ZlIHRoZSBlcXVpdmFsZW50IFZCQSBjb2RlIGxvb2tzIGxpa2UgdGhpczoKKworICAgIC5MZWZ0SGVhZGVyICAgPSAiIgorICAgIC5DZW50ZXJIZWFkZXIgPSAiJiIiVGltZXMgTmV3IFJvbWFuLFJlZ3VsYXIiIkhlbGxvIgorICAgIC5SaWdodEhlYWRlciAgPSAiIgorCisKK1RvIGluY2x1ZGUgYSBzaW5nbGUgbGl0ZXJhbCBhbXBlcnNhbmQgQzwmPiBpbiBhIGhlYWRlciBvciBmb290ZXIgeW91IHNob3VsZCB1c2UgYSBkb3VibGUgYW1wZXJzYW5kIEM8JiY+OgorCisgICAgJHdvcmtzaGVldDEtPnNldF9oZWFkZXIoJyZDQ3VyaW91c2VyICYmIEN1cmlvdXNlciAtIEF0dG9ybmV5cyBhdCBMYXcnKTsKKworQXMgc3RhdGVkIGFib3ZlIHRoZSBtYXJnaW4gcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBBcyB3aXRoIHRoZSBvdGhlciBtYXJnaW5zIHRoZSB2YWx1ZSBzaG91bGQgYmUgaW4gaW5jaGVzLiBUaGUgZGVmYXVsdCBoZWFkZXIgYW5kIGZvb3RlciBtYXJnaW4gaXMgMC41MCBpbmNoLiBUaGUgaGVhZGVyIGFuZCBmb290ZXIgbWFyZ2luIHNpemUgY2FuIGJlIHNldCBhcyBmb2xsb3dzOgorCisgICAgJHdvcmtzaGVldC0+c2V0X2hlYWRlcignJkNIZWxsbycsIDAuNzUpOworCitUaGUgaGVhZGVyIGFuZCBmb290ZXIgbWFyZ2lucyBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMuCisKK05vdGUsIHRoZSBoZWFkZXIgb3IgZm9vdGVyIHN0cmluZyBtdXN0IGJlIGxlc3MgdGhhbiAyNTUgY2hhcmFjdGVycy4gU3RyaW5ncyBsb25nZXIgdGhhbiB0aGlzIHdpbGwgbm90IGJlIHdyaXR0ZW4gYW5kIGEgd2FybmluZyB3aWxsIGJlIGdlbmVyYXRlZC4KKworT24gc3lzdGVtcyB3aXRoIEM8cGVybCA1Ljg+IGFuZCBsYXRlciB0aGUgQzxzZXRfaGVhZGVyKCk+IG1ldGhvZCBjYW4gYWxzbyBoYW5kbGUgVW5pY29kZSBzdHJpbmdzIGluIEM8VVRGLTg+IGZvcm1hdC4KKworICAgICR3b3Jrc2hlZXQtPnNldF9oZWFkZXIoIiZDXHh7MjYzYX0iKQorCisKK1NlZSwgYWxzbyB0aGUgQzxoZWFkZXJzLnBsPiBwcm9ncmFtIGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3Rvcnkgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKworCisKKworPWhlYWQyIHNldF9mb290ZXIoKQorCitUaGUgc3ludGF4IG9mIHRoZSBDPHNldF9mb290ZXIoKT4gbWV0aG9kIGlzIHRoZSBzYW1lIGFzIEM8c2V0X2hlYWRlcigpPiwgIHNlZSBhYm92ZS4KKworCisKKworPWhlYWQyIHJlcGVhdF9yb3dzKCRmaXJzdF9yb3csICRsYXN0X3JvdykKKworU2V0IHRoZSBudW1iZXIgb2Ygcm93cyB0byByZXBlYXQgYXQgdGhlIHRvcCBvZiBlYWNoIHByaW50ZWQgcGFnZS4KKworRm9yIGxhcmdlIEV4Y2VsIGRvY3VtZW50cyBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gaGF2ZSB0aGUgZmlyc3Qgcm93IG9yIHJvd3Mgb2YgdGhlIHdvcmtzaGVldCBwcmludCBvdXQgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSBDPHJlcGVhdF9yb3dzKCk+IG1ldGhvZC4gVGhlIHBhcmFtZXRlcnMgQzwkZmlyc3Rfcm93PiBhbmQgQzwkbGFzdF9yb3c+IGFyZSB6ZXJvIGJhc2VkLiBUaGUgQzwkbGFzdF9yb3c+IHBhcmFtZXRlciBpcyBvcHRpb25hbCBpZiB5b3Ugb25seSB3aXNoIHRvIHNwZWNpZnkgb25lIHJvdzoKKworICAgICR3b3Jrc2hlZXQxLT5yZXBlYXRfcm93cygwKTsgICAgIyBSZXBlYXQgdGhlIGZpcnN0IHJvdworICAgICR3b3Jrc2hlZXQyLT5yZXBlYXRfcm93cygwLCAxKTsgIyBSZXBlYXQgdGhlIGZpcnN0IHR3byByb3dzCisKKworCisKKz1oZWFkMiByZXBlYXRfY29sdW1ucygkZmlyc3RfY29sLCAkbGFzdF9jb2wpCisKK1NldCB0aGUgY29sdW1ucyB0byByZXBlYXQgYXQgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIGVhY2ggcHJpbnRlZCBwYWdlLgorCitGb3IgbGFyZ2UgRXhjZWwgZG9jdW1lbnRzIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBoYXZlIHRoZSBmaXJzdCBjb2x1bW4gb3IgY29sdW1ucyBvZiB0aGUgd29ya3NoZWV0IHByaW50IG91dCBhdCB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgZWFjaCBwYWdlLiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyB0aGUgQzxyZXBlYXRfY29sdW1ucygpPiBtZXRob2QuIFRoZSBwYXJhbWV0ZXJzIEM8JGZpcnN0X2NvbHVtbj4gYW5kIEM8JGxhc3RfY29sdW1uPiBhcmUgemVybyBiYXNlZC4gVGhlIEM8JGxhc3RfY29sdW1uPiBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgaWYgeW91IG9ubHkgd2lzaCB0byBzcGVjaWZ5IG9uZSBjb2x1bW4uIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBjb2x1bW5zIHVzaW5nIEExIGNvbHVtbiBub3RhdGlvbiwgc2VlIHRoZSBub3RlIGFib3V0IEw8Q2VsbCBub3RhdGlvbj4uCisKKyAgICAkd29ya3NoZWV0MS0+cmVwZWF0X2NvbHVtbnMoMCk7ICAgICAjIFJlcGVhdCB0aGUgZmlyc3QgY29sdW1uCisgICAgJHdvcmtzaGVldDItPnJlcGVhdF9jb2x1bW5zKDAsIDEpOyAgIyBSZXBlYXQgdGhlIGZpcnN0IHR3byBjb2x1bW5zCisgICAgJHdvcmtzaGVldDMtPnJlcGVhdF9jb2x1bW5zKCdBOkEnKTsgIyBSZXBlYXQgdGhlIGZpcnN0IGNvbHVtbgorICAgICR3b3Jrc2hlZXQ0LT5yZXBlYXRfY29sdW1ucygnQTpCJyk7ICMgUmVwZWF0IHRoZSBmaXJzdCB0d28gY29sdW1ucworCisKKworCis9aGVhZDIgaGlkZV9ncmlkbGluZXMoJG9wdGlvbikKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBoaWRlIHRoZSBncmlkbGluZXMgb24gdGhlIHNjcmVlbiBhbmQgcHJpbnRlZCBwYWdlLiBHcmlkbGluZXMgYXJlIHRoZSBsaW5lcyB0aGF0IGRpdmlkZSB0aGUgY2VsbHMgb24gYSB3b3Jrc2hlZXQuIFNjcmVlbiBhbmQgcHJpbnRlZCBncmlkbGluZXMgYXJlIHR1cm5lZCBvbiBieSBkZWZhdWx0IGluIGFuIEV4Y2VsIHdvcmtzaGVldC4gSWYgeW91IGhhdmUgZGVmaW5lZCB5b3VyIG93biBjZWxsIGJvcmRlcnMgeW91IG1heSB3aXNoIHRvIGhpZGUgdGhlIGRlZmF1bHQgZ3JpZGxpbmVzLgorCisgICAgJHdvcmtzaGVldC0+aGlkZV9ncmlkbGluZXMoKTsKKworVGhlIGZvbGxvd2luZyB2YWx1ZXMgb2YgQzwkb3B0aW9uPiBhcmUgdmFsaWQ6CisKKyAgICAwIDogRG9uJ3QgaGlkZSBncmlkbGluZXMKKyAgICAxIDogSGlkZSBwcmludGVkIGdyaWRsaW5lcyBvbmx5CisgICAgMiA6IEhpZGUgc2NyZWVuIGFuZCBwcmludGVkIGdyaWRsaW5lcworCitJZiB5b3UgZG9uJ3Qgc3VwcGx5IGFuIGFyZ3VtZW50IG9yIHVzZSBDPHVuZGVmPiB0aGUgZGVmYXVsdCBvcHRpb24gaXMgMSwgaS5lLiBvbmx5IHRoZSBwcmludGVkIGdyaWRsaW5lcyBhcmUgaGlkZGVuLgorCisKKworCis9aGVhZDIgcHJpbnRfcm93X2NvbF9oZWFkZXJzKCkKKworU2V0IHRoZSBvcHRpb24gdG8gcHJpbnQgdGhlIHJvdyBhbmQgY29sdW1uIGhlYWRlcnMgb24gdGhlIHByaW50ZWQgcGFnZS4KKworQW4gRXhjZWwgd29ya3NoZWV0IGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc7CisKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgfCAgIHwgICBBICAgfCAgIEIgICB8ICAgQyAgIHwgICBEICAgfCAgLi4uCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgMSB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgIHwgMiB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgIHwgMyB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgIHwgNCB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgIHwuLi58ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLgorCitUaGUgaGVhZGVycyBhcmUgdGhlIGxldHRlcnMgYW5kIG51bWJlcnMgYXQgdGhlIHRvcCBhbmQgdGhlIGxlZnQgb2YgdGhlIHdvcmtzaGVldC4gU2luY2UgdGhlc2UgaGVhZGVycyBzZXJ2ZSBtYWlubHkgYXMgYSBpbmRpY2F0aW9uIG9mIHBvc2l0aW9uIG9uIHRoZSB3b3Jrc2hlZXQgdGhleSBnZW5lcmFsbHkgZG8gbm90IGFwcGVhciBvbiB0aGUgcHJpbnRlZCBwYWdlLiBJZiB5b3Ugd2lzaCB0byBoYXZlIHRoZW0gcHJpbnRlZCB5b3UgY2FuIHVzZSB0aGUgQzxwcmludF9yb3dfY29sX2hlYWRlcnMoKT4gbWV0aG9kIDoKKworICAgICR3b3Jrc2hlZXQtPnByaW50X3Jvd19jb2xfaGVhZGVycygpOworCitEbyBub3QgY29uZnVzZSB0aGVzZSBoZWFkZXJzIHdpdGggcGFnZSBoZWFkZXJzIGFzIGRlc2NyaWJlZCBpbiB0aGUgQzxzZXRfaGVhZGVyKCk+IHNlY3Rpb24gYWJvdmUuCisKKworCisKKz1oZWFkMiBwcmludF9hcmVhKCRmaXJzdF9yb3csICRmaXJzdF9jb2wsICRsYXN0X3JvdywgJGxhc3RfY29sKQorCitUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGFyZWEgb2YgdGhlIHdvcmtzaGVldCB0aGF0IHdpbGwgYmUgcHJpbnRlZC4gQWxsIGZvdXIgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZC4gWW91IGNhbiBhbHNvIHVzZSBBMSBub3RhdGlvbiwgc2VlIHRoZSBub3RlIGFib3V0IEw8Q2VsbCBub3RhdGlvbj4uCisKKworICAgICR3b3Jrc2hlZXQxLT5wcmludF9hcmVhKCdBMTpIMjAnKTsgICAgIyBDZWxscyBBMSB0byBIMjAKKyAgICAkd29ya3NoZWV0Mi0+cHJpbnRfYXJlYSgwLCAwLCAxOSwgNyk7ICMgVGhlIHNhbWUKKyAgICAkd29ya3NoZWV0Mi0+cHJpbnRfYXJlYSgnQTpIJyk7ICAgICAgICMgQ29sdW1ucyBBIHRvIEggaWYgcm93cyBoYXZlIGRhdGEKKworCisKKworPWhlYWQyIHByaW50X2Fjcm9zcygpCisKK1RoZSBDPHByaW50X2Fjcm9zcz4gbWV0aG9kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHByaW50IGRpcmVjdGlvbi4gVGhpcyBpcyByZWZlcnJlZCB0byBieSBFeGNlbCBhcyB0aGUgc2hlZXQgInBhZ2Ugb3JkZXIiLgorCisgICAgJHdvcmtzaGVldC0+cHJpbnRfYWNyb3NzKCk7CisKK1RoZSBkZWZhdWx0IHBhZ2Ugb3JkZXIgaXMgc2hvd24gYmVsb3cgZm9yIGEgd29ya3NoZWV0IHRoYXQgZXh0ZW5kcyBvdmVyIDQgcGFnZXMuIFRoZSBvcmRlciBpcyBjYWxsZWQgImRvd24gdGhlbiBhY3Jvc3MiOgorCisgICAgWzFdIFszXQorICAgIFsyXSBbNF0KKworSG93ZXZlciwgYnkgdXNpbmcgdGhlIEM8cHJpbnRfYWNyb3NzPiBtZXRob2QgdGhlIHByaW50IG9yZGVyIHdpbGwgYmUgY2hhbmdlZCB0byAiYWNyb3NzIHRoZW4gZG93biI6CisKKyAgICBbMV0gWzJdCisgICAgWzNdIFs0XQorCisKKworCis9aGVhZDIgZml0X3RvX3BhZ2VzKCR3aWR0aCwgJGhlaWdodCkKKworVGhlIEM8Zml0X3RvX3BhZ2VzKCk+IG1ldGhvZCBpcyB1c2VkIHRvIGZpdCB0aGUgcHJpbnRlZCBhcmVhIHRvIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHBhZ2VzIGJvdGggdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5LiBJZiB0aGUgcHJpbnRlZCBhcmVhIGV4Y2VlZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcGFnZXMgaXQgd2lsbCBiZSBzY2FsZWQgZG93biB0byBmaXQuIFRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZSBwcmludGVkIGFyZWEgd2lsbCBhbHdheXMgYXBwZWFyIG9uIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHBhZ2VzIGV2ZW4gaWYgdGhlIHBhZ2Ugc2l6ZSBvciBtYXJnaW5zIGNoYW5nZS4KKworICAgICR3b3Jrc2hlZXQxLT5maXRfdG9fcGFnZXMoMSwgMSk7ICMgRml0IHRvIDF4MSBwYWdlcworICAgICR3b3Jrc2hlZXQyLT5maXRfdG9fcGFnZXMoMiwgMSk7ICMgRml0IHRvIDJ4MSBwYWdlcworICAgICR3b3Jrc2hlZXQzLT5maXRfdG9fcGFnZXMoMSwgMik7ICMgRml0IHRvIDF4MiBwYWdlcworCitUaGUgcHJpbnQgYXJlYSBjYW4gYmUgZGVmaW5lZCB1c2luZyB0aGUgQzxwcmludF9hcmVhKCk+IG1ldGhvZCBhcyBkZXNjcmliZWQgYWJvdmUuCisKK0EgY29tbW9uIHJlcXVpcmVtZW50IGlzIHRvIGZpdCB0aGUgcHJpbnRlZCBvdXRwdXQgdG8gSTxuPiBwYWdlcyB3aWRlIGJ1dCBoYXZlIHRoZSBoZWlnaHQgYmUgYXMgbG9uZyBhcyBuZWNlc3NhcnkuIFRvIGFjaGlldmUgdGhpcyBzZXQgdGhlIEM8JGhlaWdodD4gdG8gemVybyBvciBsZWF2ZSBpdCBibGFuazoKKworICAgICR3b3Jrc2hlZXQxLT5maXRfdG9fcGFnZXMoMSwgMCk7ICMgMSBwYWdlIHdpZGUgYW5kIGFzIGxvbmcgYXMgbmVjZXNzYXJ5CisgICAgJHdvcmtzaGVldDItPmZpdF90b19wYWdlcygxKTsgICAgIyBUaGUgc2FtZQorCisKK05vdGUgdGhhdCBhbHRob3VnaCBpdCBpcyB2YWxpZCB0byB1c2UgYm90aCBDPGZpdF90b19wYWdlcygpPiBhbmQgQzxzZXRfcHJpbnRfc2NhbGUoKT4gb24gdGhlIHNhbWUgd29ya3NoZWV0IG9ubHkgb25lIG9mIHRoZXNlIG9wdGlvbnMgY2FuIGJlIGFjdGl2ZSBhdCBhIHRpbWUuIFRoZSBsYXN0IG1ldGhvZCBjYWxsIG1hZGUgd2lsbCBzZXQgdGhlIGFjdGl2ZSBvcHRpb24uCisKK05vdGUgdGhhdCBDPGZpdF90b19wYWdlcygpPiB3aWxsIG92ZXJyaWRlIGFueSBtYW51YWwgcGFnZSBicmVha3MgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgd29ya3NoZWV0LgorCisKKworCis9aGVhZDIgc2V0X3N0YXJ0X3BhZ2UoJHN0YXJ0X3BhZ2UpCisKK1RoZSBDPHNldF9zdGFydF9wYWdlKCk+IG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHRoZSBzdGFydGluZyBwYWdlIHdoZW4gdGhlIHdvcmtzaGVldCBpcyBwcmludGVkIG91dC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS4KKworICAgICR3b3Jrc2hlZXQtPnNldF9zdGFydF9wYWdlKDIpOworCisKKworCis9aGVhZDIgc2V0X3ByaW50X3NjYWxlKCRzY2FsZSkKKworU2V0IHRoZSBzY2FsZSBmYWN0b3Igb2YgdGhlIHByaW50ZWQgcGFnZS4gU2NhbGUgZmFjdG9ycyBpbiB0aGUgcmFuZ2UgQzwxMCBFPGx0Pj0gJHNjYWxlIEU8bHQ+PSA0MDA+IGFyZSB2YWxpZDoKKworICAgICR3b3Jrc2hlZXQxLT5zZXRfcHJpbnRfc2NhbGUoNTApOworICAgICR3b3Jrc2hlZXQyLT5zZXRfcHJpbnRfc2NhbGUoNzUpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcHJpbnRfc2NhbGUoMzAwKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3ByaW50X3NjYWxlKDQwMCk7CisKK1RoZSBkZWZhdWx0IHNjYWxlIGZhY3RvciBpcyAxMDAuIE5vdGUsIEM8c2V0X3ByaW50X3NjYWxlKCk+IGRvZXMgbm90IGFmZmVjdCB0aGUgc2NhbGUgb2YgdGhlIHZpc2libGUgcGFnZSBpbiBFeGNlbC4gRm9yIHRoYXQgeW91IHNob3VsZCB1c2UgQzxzZXRfem9vbSgpPi4KKworTm90ZSBhbHNvIHRoYXQgYWx0aG91Z2ggaXQgaXMgdmFsaWQgdG8gdXNlIGJvdGggQzxmaXRfdG9fcGFnZXMoKT4gYW5kIEM8c2V0X3ByaW50X3NjYWxlKCk+IG9uIHRoZSBzYW1lIHdvcmtzaGVldCBvbmx5IG9uZSBvZiB0aGVzZSBvcHRpb25zIGNhbiBiZSBhY3RpdmUgYXQgYSB0aW1lLiBUaGUgbGFzdCBtZXRob2QgY2FsbCBtYWRlIHdpbGwgc2V0IHRoZSBhY3RpdmUgb3B0aW9uLgorCisKKworCis9aGVhZDIgc2V0X2hfcGFnZWJyZWFrcyhAYnJlYWtzKQorCitBZGQgaG9yaXpvbnRhbCBwYWdlIGJyZWFrcyB0byBhIHdvcmtzaGVldC4gQSBwYWdlIGJyZWFrIGNhdXNlcyBhbGwgdGhlIGRhdGEgdGhhdCBmb2xsb3dzIGl0IHRvIGJlIHByaW50ZWQgb24gdGhlIG5leHQgcGFnZS4gSG9yaXpvbnRhbCBwYWdlIGJyZWFrcyBhY3QgYmV0d2VlbiByb3dzLiBUbyBjcmVhdGUgYSBwYWdlIGJyZWFrIGJldHdlZW4gcm93cyAyMCBhbmQgMjEgeW91IG11c3Qgc3BlY2lmeSB0aGUgYnJlYWsgYXQgcm93IDIxLiBIb3dldmVyIGluIHplcm8gaW5kZXggbm90YXRpb24gdGhpcyBpcyBhY3R1YWxseSByb3cgMjAuIFNvIHlvdSBjYW4gcHJldGVuZCBmb3IgYSBzbWFsbCB3aGlsZSB0aGF0IHlvdSBhcmUgdXNpbmcgMSBpbmRleCBub3RhdGlvbjoKKworICAgICR3b3Jrc2hlZXQxLT5zZXRfaF9wYWdlYnJlYWtzKDIwKTsgIyBCcmVhayBiZXR3ZWVuIHJvdyAyMCBhbmQgMjEKKworVGhlIEM8c2V0X2hfcGFnZWJyZWFrcygpPiBtZXRob2Qgd2lsbCBhY2NlcHQgYSBsaXN0IG9mIHBhZ2UgYnJlYWtzIGFuZCB5b3UgY2FuIGNhbGwgaXQgbW9yZSB0aGFuIG9uY2U6CisKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2hfcGFnZWJyZWFrcyggMjAsICA0MCwgIDYwLCAgODAsIDEwMCk7ICMgQWRkIGJyZWFrcworICAgICR3b3Jrc2hlZXQyLT5zZXRfaF9wYWdlYnJlYWtzKDEyMCwgMTQwLCAxNjAsIDE4MCwgMjAwKTsgIyBBZGQgc29tZSBtb3JlCisKK05vdGU6IElmIHlvdSBzcGVjaWZ5IHRoZSAiZml0IHRvIHBhZ2UiIG9wdGlvbiB2aWEgdGhlIEM8Zml0X3RvX3BhZ2VzKCk+IG1ldGhvZCBpdCB3aWxsIG92ZXJyaWRlIGFsbCBtYW51YWwgcGFnZSBicmVha3MuCisKK1RoZXJlIGlzIGEgc2lsZW50IGxpbWl0YXRpb24gb2YgYWJvdXQgMTAwMCBob3Jpem9udGFsIHBhZ2UgYnJlYWtzIHBlciB3b3Jrc2hlZXQgaW4gbGluZSB3aXRoIGFuIEV4Y2VsIGludGVybmFsIGxpbWl0YXRpb24uCisKKworCisKKz1oZWFkMiBzZXRfdl9wYWdlYnJlYWtzKEBicmVha3MpCisKK0FkZCB2ZXJ0aWNhbCBwYWdlIGJyZWFrcyB0byBhIHdvcmtzaGVldC4gQSBwYWdlIGJyZWFrIGNhdXNlcyBhbGwgdGhlIGRhdGEgdGhhdCBmb2xsb3dzIGl0IHRvIGJlIHByaW50ZWQgb24gdGhlIG5leHQgcGFnZS4gVmVydGljYWwgcGFnZSBicmVha3MgYWN0IGJldHdlZW4gY29sdW1ucy4gVG8gY3JlYXRlIGEgcGFnZSBicmVhayBiZXR3ZWVuIGNvbHVtbnMgMjAgYW5kIDIxIHlvdSBtdXN0IHNwZWNpZnkgdGhlIGJyZWFrIGF0IGNvbHVtbiAyMS4gSG93ZXZlciBpbiB6ZXJvIGluZGV4IG5vdGF0aW9uIHRoaXMgaXMgYWN0dWFsbHkgY29sdW1uIDIwLiBTbyB5b3UgY2FuIHByZXRlbmQgZm9yIGEgc21hbGwgd2hpbGUgdGhhdCB5b3UgYXJlIHVzaW5nIDEgaW5kZXggbm90YXRpb246CisKKyAgICAkd29ya3NoZWV0MS0+c2V0X3ZfcGFnZWJyZWFrcygyMCk7ICMgQnJlYWsgYmV0d2VlbiBjb2x1bW4gMjAgYW5kIDIxCisKK1RoZSBDPHNldF92X3BhZ2VicmVha3MoKT4gbWV0aG9kIHdpbGwgYWNjZXB0IGEgbGlzdCBvZiBwYWdlIGJyZWFrcyBhbmQgeW91IGNhbiBjYWxsIGl0IG1vcmUgdGhhbiBvbmNlOgorCisgICAgJHdvcmtzaGVldDItPnNldF92X3BhZ2VicmVha3MoIDIwLCAgNDAsICA2MCwgIDgwLCAxMDApOyAjIEFkZCBicmVha3MKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3ZfcGFnZWJyZWFrcygxMjAsIDE0MCwgMTYwLCAxODAsIDIwMCk7ICMgQWRkIHNvbWUgbW9yZQorCitOb3RlOiBJZiB5b3Ugc3BlY2lmeSB0aGUgImZpdCB0byBwYWdlIiBvcHRpb24gdmlhIHRoZSBDPGZpdF90b19wYWdlcygpPiBtZXRob2QgaXQgd2lsbCBvdmVycmlkZSBhbGwgbWFudWFsIHBhZ2UgYnJlYWtzLgorCisKKworCis9aGVhZDEgQ0VMTCBGT1JNQVRUSU5HCisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciBmb3JtYXR0aW5nIGNlbGxzIGluIEV4Y2VsLiBUaGUgcHJvcGVydGllcyBvZiBhIGNlbGwgdGhhdCBjYW4gYmUgZm9ybWF0dGVkIGluY2x1ZGU6IGZvbnRzLCBjb2xvdXJzLCBwYXR0ZXJucywgYm9yZGVycywgYWxpZ25tZW50IGFuZCBudW1iZXIgZm9ybWF0dGluZy4KKworCis9aGVhZDIgQ3JlYXRpbmcgYW5kIHVzaW5nIGEgRm9ybWF0IG9iamVjdAorCitDZWxsIGZvcm1hdHRpbmcgaXMgZGVmaW5lZCB0aHJvdWdoIGEgRm9ybWF0IG9iamVjdC4gRm9ybWF0IG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgd29ya2Jvb2sgQzxhZGRfZm9ybWF0KCk+IG1ldGhvZCBhcyBmb2xsb3dzOgorCisgICAgbXkgJGZvcm1hdDEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsgICAgICAgIyBTZXQgcHJvcGVydGllcyBsYXRlcgorICAgIG15ICRmb3JtYXQyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCVwcm9wcyk7ICMgU2V0IGF0IGNyZWF0aW9uCisKK1RoZSBmb3JtYXQgb2JqZWN0IGhvbGRzIGFsbCB0aGUgZm9ybWF0dGluZyBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjZWxsLCBhIHJvdyBvciBhIGNvbHVtbi4gVGhlIHByb2Nlc3Mgb2Ygc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzIGlzIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgorCitPbmNlIGEgRm9ybWF0IG9iamVjdCBoYXMgYmVlbiBjb25zdHJ1Y3RlZCBhbmQgaXQgcHJvcGVydGllcyBoYXZlIGJlZW4gc2V0IGl0IGNhbiBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIHdvcmtzaGVldCBDPHdyaXRlPiBtZXRob2RzIGFzIGZvbGxvd3M6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnT25lJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nKDEsIDAsICdUd28nLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9udW1iZXIoMiwgMCwgMywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfYmxhbmsoMywgMCwgJGZvcm1hdCk7CisKK0Zvcm1hdHMgY2FuIGFsc28gYmUgcGFzc2VkIHRvIHRoZSB3b3Jrc2hlZXQgQzxzZXRfcm93KCk+IGFuZCBDPHNldF9jb2x1bW4oKT4gbWV0aG9kcyB0byBkZWZpbmUgdGhlIGRlZmF1bHQgcHJvcGVydHkgZm9yIGEgcm93IG9yIGNvbHVtbi4KKworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgMTUsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgMTUsICRmb3JtYXQpOworCisKKworCis9aGVhZDIgRm9ybWF0IG1ldGhvZHMgYW5kIEZvcm1hdCBwcm9wZXJ0aWVzCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIEV4Y2VsIGZvcm1hdCBjYXRlZ29yaWVzLCB0aGUgZm9ybWF0dGluZyBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgYW5kIHRoZSBlcXVpdmFsZW50IG9iamVjdCBtZXRob2Q6CisKKworICAgIENhdGVnb3J5ICAgRGVzY3JpcHRpb24gICAgICAgUHJvcGVydHkgICAgICAgIE1ldGhvZCBOYW1lCisgICAgLS0tLS0tLS0gICAtLS0tLS0tLS0tLSAgICAgICAtLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0KKyAgICBGb250ICAgICAgIEZvbnQgdHlwZSAgICAgICAgIGZvbnQgICAgICAgICAgICBzZXRfZm9udCgpCisgICAgICAgICAgICAgICBGb250IHNpemUgICAgICAgICBzaXplICAgICAgICAgICAgc2V0X3NpemUoKQorICAgICAgICAgICAgICAgRm9udCBjb2xvciAgICAgICAgY29sb3IgICAgICAgICAgIHNldF9jb2xvcigpCisgICAgICAgICAgICAgICBCb2xkICAgICAgICAgICAgICBib2xkICAgICAgICAgICAgc2V0X2JvbGQoKQorICAgICAgICAgICAgICAgSXRhbGljICAgICAgICAgICAgaXRhbGljICAgICAgICAgIHNldF9pdGFsaWMoKQorICAgICAgICAgICAgICAgVW5kZXJsaW5lICAgICAgICAgdW5kZXJsaW5lICAgICAgIHNldF91bmRlcmxpbmUoKQorICAgICAgICAgICAgICAgU3RyaWtlb3V0ICAgICAgICAgZm9udF9zdHJpa2VvdXQgIHNldF9mb250X3N0cmlrZW91dCgpCisgICAgICAgICAgICAgICBTdXBlci9TdWJzY3JpcHQgICBmb250X3NjcmlwdCAgICAgc2V0X2ZvbnRfc2NyaXB0KCkKKyAgICAgICAgICAgICAgIE91dGxpbmUgICAgICAgICAgIGZvbnRfb3V0bGluZSAgICBzZXRfZm9udF9vdXRsaW5lKCkKKyAgICAgICAgICAgICAgIFNoYWRvdyAgICAgICAgICAgIGZvbnRfc2hhZG93ICAgICBzZXRfZm9udF9zaGFkb3coKQorCisgICAgTnVtYmVyICAgICBOdW1lcmljIGZvcm1hdCAgICBudW1fZm9ybWF0ICAgICAgc2V0X251bV9mb3JtYXQoKQorCisgICAgUHJvdGVjdGlvbiBMb2NrIGNlbGxzICAgICAgICBsb2NrZWQgICAgICAgICAgc2V0X2xvY2tlZCgpCisgICAgICAgICAgICAgICBIaWRlIGZvcm11bGFzICAgICBoaWRkZW4gICAgICAgICAgc2V0X2hpZGRlbigpCisKKyAgICBBbGlnbm1lbnQgIEhvcml6b250YWwgYWxpZ24gIGFsaWduICAgICAgICAgICBzZXRfYWxpZ24oKQorICAgICAgICAgICAgICAgVmVydGljYWwgYWxpZ24gICAgdmFsaWduICAgICAgICAgIHNldF9hbGlnbigpCisgICAgICAgICAgICAgICBSb3RhdGlvbiAgICAgICAgICByb3RhdGlvbiAgICAgICAgc2V0X3JvdGF0aW9uKCkKKyAgICAgICAgICAgICAgIFRleHQgd3JhcCAgICAgICAgIHRleHRfd3JhcCAgICAgICBzZXRfdGV4dF93cmFwKCkKKyAgICAgICAgICAgICAgIEp1c3RpZnkgbGFzdCAgICAgIHRleHRfanVzdGxhc3QgICBzZXRfdGV4dF9qdXN0bGFzdCgpCisgICAgICAgICAgICAgICBDZW50ZXIgYWNyb3NzICAgICBjZW50ZXJfYWNyb3NzICAgc2V0X2NlbnRlcl9hY3Jvc3MoKQorICAgICAgICAgICAgICAgSW5kZW50YXRpb24gICAgICAgaW5kZW50ICAgICAgICAgIHNldF9pbmRlbnQoKQorICAgICAgICAgICAgICAgU2hyaW5rIHRvIGZpdCAgICAgc2hyaW5rICAgICAgICAgIHNldF9zaHJpbmsoKQorCisgICAgUGF0dGVybiAgICBDZWxsIHBhdHRlcm4gICAgICBwYXR0ZXJuICAgICAgICAgc2V0X3BhdHRlcm4oKQorICAgICAgICAgICAgICAgQmFja2dyb3VuZCBjb2xvciAgYmdfY29sb3IgICAgICAgIHNldF9iZ19jb2xvcigpCisgICAgICAgICAgICAgICBGb3JlZ3JvdW5kIGNvbG9yICBmZ19jb2xvciAgICAgICAgc2V0X2ZnX2NvbG9yKCkKKworICAgIEJvcmRlciAgICAgQ2VsbCBib3JkZXIgICAgICAgYm9yZGVyICAgICAgICAgIHNldF9ib3JkZXIoKQorICAgICAgICAgICAgICAgQm90dG9tIGJvcmRlciAgICAgYm90dG9tICAgICAgICAgIHNldF9ib3R0b20oKQorICAgICAgICAgICAgICAgVG9wIGJvcmRlciAgICAgICAgdG9wICAgICAgICAgICAgIHNldF90b3AoKQorICAgICAgICAgICAgICAgTGVmdCBib3JkZXIgICAgICAgbGVmdCAgICAgICAgICAgIHNldF9sZWZ0KCkKKyAgICAgICAgICAgICAgIFJpZ2h0IGJvcmRlciAgICAgIHJpZ2h0ICAgICAgICAgICBzZXRfcmlnaHQoKQorICAgICAgICAgICAgICAgQm9yZGVyIGNvbG9yICAgICAgYm9yZGVyX2NvbG9yICAgIHNldF9ib3JkZXJfY29sb3IoKQorICAgICAgICAgICAgICAgQm90dG9tIGNvbG9yICAgICAgYm90dG9tX2NvbG9yICAgIHNldF9ib3R0b21fY29sb3IoKQorICAgICAgICAgICAgICAgVG9wIGNvbG9yICAgICAgICAgdG9wX2NvbG9yICAgICAgIHNldF90b3BfY29sb3IoKQorICAgICAgICAgICAgICAgTGVmdCBjb2xvciAgICAgICAgbGVmdF9jb2xvciAgICAgIHNldF9sZWZ0X2NvbG9yKCkKKyAgICAgICAgICAgICAgIFJpZ2h0IGNvbG9yICAgICAgIHJpZ2h0X2NvbG9yICAgICBzZXRfcmlnaHRfY29sb3IoKQorCitUaGVyZSBhcmUgdHdvIHdheXMgb2Ygc2V0dGluZyBGb3JtYXQgcHJvcGVydGllczogYnkgdXNpbmcgdGhlIG9iamVjdCBtZXRob2QgaW50ZXJmYWNlIG9yIGJ5IHNldHRpbmcgdGhlIHByb3BlcnR5IGRpcmVjdGx5LiBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIHVzZSBvZiB0aGUgbWV0aG9kIGludGVyZmFjZSB3b3VsZCBiZSBhcyBmb2xsb3dzOgorCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdyZWQnKTsKKworQnkgY29tcGFyaXNvbiB0aGUgcHJvcGVydGllcyBjYW4gYmUgc2V0IGRpcmVjdGx5IGJ5IHBhc3NpbmcgYSBoYXNoIG9mIHByb3BlcnRpZXMgdG8gdGhlIEZvcm1hdCBjb25zdHJ1Y3RvcjoKKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoYm9sZCA9PiAxLCBjb2xvciA9PiAncmVkJyk7CisKK29yIGFmdGVyIHRoZSBGb3JtYXQgaGFzIGJlZW4gY29uc3RydWN0ZWQgYnkgbWVhbnMgb2YgdGhlIEM8c2V0X2Zvcm1hdF9wcm9wZXJ0aWVzKCk+IG1ldGhvZCBhcyBmb2xsb3dzOgorCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9mb3JtYXRfcHJvcGVydGllcyhib2xkID0+IDEsIGNvbG9yID0+ICdyZWQnKTsKKworWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBwcm9wZXJ0aWVzIGluIG9uZSBvciBtb3JlIG5hbWVkIGhhc2hlcyBhbmQgcGFzcyB0aGVtIHRvIHRoZSByZXF1aXJlZCBtZXRob2Q6CisKKyAgICBteSAlZm9udCAgICA9ICgKKyAgICAgICAgICAgICAgICAgICAgZm9udCAgPT4gJ0FyaWFsJywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSAgPT4gMTIsCisgICAgICAgICAgICAgICAgICAgIGNvbG9yID0+ICdibHVlJywKKyAgICAgICAgICAgICAgICAgICAgYm9sZCAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICk7CisKKyAgICBteSAlc2hhZGluZyA9ICgKKyAgICAgICAgICAgICAgICAgICAgYmdfY29sb3IgPT4gJ2dyZWVuJywKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybiAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICk7CisKKworICAgIG15ICRmb3JtYXQxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCVmb250KTsgICAgICAgICAgICMgRm9udCBvbmx5CisgICAgbXkgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWZvbnQsICVzaGFkaW5nKTsgIyBGb250IGFuZCBzaGFkaW5nCisKKworVGhlIHByb3Zpc2lvbiBvZiB0d28gd2F5cyBvZiBzZXR0aW5nIHByb3BlcnRpZXMgbWlnaHQgbGVhZCB5b3UgdG8gd29uZGVyIHdoaWNoIGlzIHRoZSBiZXN0IHdheS4gVGhlIG1ldGhvZCBtZWNoYW5pc20gbWF5IGJlIGJldHRlciBpcyB5b3UgcHJlZmVyIHNldHRpbmcgcHJvcGVydGllcyB2aWEgbWV0aG9kIGNhbGxzICh3aGljaCB0aGUgYXV0aG9yIGRpZCB3aGVuIHRoZXkgd2VyZSBjb2RlIHdhcyBmaXJzdCB3cml0dGVuKSBvdGhlcndpc2UgcGFzc2luZyBwcm9wZXJ0aWVzIHRvIHRoZSBjb25zdHJ1Y3RvciBoYXMgcHJvdmVkIHRvIGJlIGEgbGl0dGxlIG1vcmUgZmxleGlibGUgYW5kIHNlbGYgZG9jdW1lbnRpbmcgaW4gcHJhY3RpY2UuIEFuIGFkZGl0aW9uYWwgYWR2YW50YWdlIG9mIHdvcmtpbmcgd2l0aCBwcm9wZXJ0eSBoYXNoZXMgaXMgdGhhdCBpdCBhbGxvd3MgeW91IHRvIHNoYXJlIGZvcm1hdHRpbmcgYmV0d2VlbiB3b3JrYm9vayBvYmplY3RzIGFzIHNob3duIGluIHRoZSBleGFtcGxlIGFib3ZlLgorCitUaGUgUGVybC9UayBzdHlsZSBvZiBhZGRpbmcgcHJvcGVydGllcyBpcyBhbHNvIHN1cHBvcnRlZDoKKworICAgIG15ICVmb250ICAgID0gKAorICAgICAgICAgICAgICAgICAgICAtZm9udCAgICAgID0+ICdBcmlhbCcsCisgICAgICAgICAgICAgICAgICAgIC1zaXplICAgICAgPT4gMTIsCisgICAgICAgICAgICAgICAgICAgIC1jb2xvciAgICAgPT4gJ2JsdWUnLAorICAgICAgICAgICAgICAgICAgICAtYm9sZCAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICApOworCisKKworCis9aGVhZDIgV29ya2luZyB3aXRoIGZvcm1hdHMKKworVGhlIGRlZmF1bHQgZm9ybWF0IGlzIEFyaWFsIDEwIHdpdGggYWxsIG90aGVyIHByb3BlcnRpZXMgb2ZmLgorCitFYWNoIHVuaXF1ZSBmb3JtYXQgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBGb3JtYXQgb2JqZWN0LiBJdCBpc24ndCBwb3NzaWJsZSB0byB1c2UgYSBGb3JtYXQgd2l0aCBhIHdyaXRlKCkgbWV0aG9kIGFuZCB0aGVuIHJlZGVmaW5lIHRoZSBGb3JtYXQgZm9yIHVzZSBhdCBhIGxhdGVyIHN0YWdlLiBUaGlzIGlzIGJlY2F1c2UgYSBGb3JtYXQgaXMgYXBwbGllZCB0byBhIGNlbGwgbm90IGluIGl0cyBjdXJyZW50IHN0YXRlIGJ1dCBpbiBpdHMgZmluYWwgc3RhdGUuIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworICAgICRmb3JtYXQtPnNldF9jb2xvcigncmVkJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ0NlbGwgQTEnLCAkZm9ybWF0KTsKKyAgICAkZm9ybWF0LT5zZXRfY29sb3IoJ2dyZWVuJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJ0NlbGwgQjEnLCAkZm9ybWF0KTsKKworQ2VsbCBBMSBpcyBhc3NpZ25lZCB0aGUgRm9ybWF0IEM8JGZvcm1hdD4gd2hpY2ggaXMgaW5pdGlhbGx5IHNldCB0byB0aGUgY29sb3VyIHJlZC4gSG93ZXZlciwgdGhlIGNvbG91ciBpcyBzdWJzZXF1ZW50bHkgc2V0IHRvIGdyZWVuLiBXaGVuIEV4Y2VsIGRpc3BsYXlzIENlbGwgQTEgaXQgd2lsbCBkaXNwbGF5IHRoZSBmaW5hbCBzdGF0ZSBvZiB0aGUgRm9ybWF0IHdoaWNoIGluIHRoaXMgY2FzZSB3aWxsIGJlIHRoZSBjb2xvdXIgZ3JlZW4uCisKK0luIGdlbmVyYWwgYSBtZXRob2QgY2FsbCB3aXRob3V0IGFuIGFyZ3VtZW50IHdpbGwgdHVybiBhIHByb3BlcnR5IG9uLCBmb3IgZXhhbXBsZToKKworICAgIG15ICRmb3JtYXQxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdDEtPnNldF9ib2xkKCk7ICAjIFR1cm5zIGJvbGQgb24KKyAgICAkZm9ybWF0MS0+c2V0X2JvbGQoMSk7ICMgQWxzbyB0dXJucyBib2xkIG9uCisgICAgJGZvcm1hdDEtPnNldF9ib2xkKDApOyAjIFR1cm5zIGJvbGQgb2ZmCisKKworCisKKz1oZWFkMSBGT1JNQVQgTUVUSE9EUworCitUaGUgRm9ybWF0IG9iamVjdCBtZXRob2RzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4gSW4gYWRkaXRpb24sIHRoZXJlIGlzIGEgUGVybCBwcm9ncmFtIGNhbGxlZCBDPGZvcm1hdHMucGw+IGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3Rvcnkgb2YgdGhlIFdyaXRlRXhjZWwgZGlzdHJpYnV0aW9uLiBUaGlzIHByb2dyYW0gY3JlYXRlcyBhbiBFeGNlbCB3b3JrYm9vayBjYWxsZWQgQzxmb3JtYXRzLnhscz4gd2hpY2ggY29udGFpbnMgZXhhbXBsZXMgb2YgYWxtb3N0IGFsbCB0aGUgZm9ybWF0IHR5cGVzLgorCitUaGUgZm9sbG93aW5nIEZvcm1hdCBtZXRob2RzIGFyZSBhdmFpbGFibGU6CisKKyAgICBzZXRfZm9udCgpCisgICAgc2V0X3NpemUoKQorICAgIHNldF9jb2xvcigpCisgICAgc2V0X2JvbGQoKQorICAgIHNldF9pdGFsaWMoKQorICAgIHNldF91bmRlcmxpbmUoKQorICAgIHNldF9mb250X3N0cmlrZW91dCgpCisgICAgc2V0X2ZvbnRfc2NyaXB0KCkKKyAgICBzZXRfZm9udF9vdXRsaW5lKCkKKyAgICBzZXRfZm9udF9zaGFkb3coKQorICAgIHNldF9udW1fZm9ybWF0KCkKKyAgICBzZXRfbG9ja2VkKCkKKyAgICBzZXRfaGlkZGVuKCkKKyAgICBzZXRfYWxpZ24oKQorICAgIHNldF9yb3RhdGlvbigpCisgICAgc2V0X3RleHRfd3JhcCgpCisgICAgc2V0X3RleHRfanVzdGxhc3QoKQorICAgIHNldF9jZW50ZXJfYWNyb3NzKCkKKyAgICBzZXRfaW5kZW50KCkKKyAgICBzZXRfc2hyaW5rKCkKKyAgICBzZXRfcGF0dGVybigpCisgICAgc2V0X2JnX2NvbG9yKCkKKyAgICBzZXRfZmdfY29sb3IoKQorICAgIHNldF9ib3JkZXIoKQorICAgIHNldF9ib3R0b20oKQorICAgIHNldF90b3AoKQorICAgIHNldF9sZWZ0KCkKKyAgICBzZXRfcmlnaHQoKQorICAgIHNldF9ib3JkZXJfY29sb3IoKQorICAgIHNldF9ib3R0b21fY29sb3IoKQorICAgIHNldF90b3BfY29sb3IoKQorICAgIHNldF9sZWZ0X2NvbG9yKCkKKyAgICBzZXRfcmlnaHRfY29sb3IoKQorCisKK1RoZSBhYm92ZSBtZXRob2RzIGNhbiBhbHNvIGJlIGFwcGxpZWQgZGlyZWN0bHkgYXMgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUgQzw8ICRmb3JtYXQtPnNldF9ib2xkKCkgPj4gaXMgZXF1aXZhbGVudCB0byBDPDwgJHdvcmtib29rLT5hZGRfZm9ybWF0KGJvbGQgPT4gMSkgPj4uCisKKworPWhlYWQyIHNldF9mb3JtYXRfcHJvcGVydGllcyglcHJvcGVydGllcykKKworVGhlIHByb3BlcnRpZXMgb2YgYW4gZXhpc3RpbmcgRm9ybWF0IG9iamVjdCBjYW4gYmUgYWxzbyBiZSBzZXQgYnkgbWVhbnMgb2YgQzxzZXRfZm9ybWF0X3Byb3BlcnRpZXMoKT46CisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2Zvcm1hdF9wcm9wZXJ0aWVzKGJvbGQgPT4gMSwgY29sb3IgPT4gJ3JlZCcpOworCitIb3dldmVyLCB0aGlzIG1ldGhvZCBpcyBoZXJlIG1haW5seSBmb3IgbGVnYWN5IHJlYXNvbnMuIEl0IGlzIHByZWZlcmFibGUgdG8gc2V0IHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBmb3JtYXQgY29uc3RydWN0b3I6CisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGJvbGQgPT4gMSwgY29sb3IgPT4gJ3JlZCcpOworCisKKz1oZWFkMiBzZXRfZm9udCgkZm9udG5hbWUpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIEZvbnQgaXMgQXJpYWwKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIE5vbmUKKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIEFueSB2YWxpZCBmb250IG5hbWUKKworU3BlY2lmeSB0aGUgZm9udCB1c2VkOgorCisgICAgJGZvcm1hdC0+c2V0X2ZvbnQoJ1RpbWVzIE5ldyBSb21hbicpOworCitFeGNlbCBjYW4gb25seSBkaXNwbGF5IGZvbnRzIHRoYXQgYXJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIHRoYXQgaXQgaXMgcnVubmluZyBvbi4gVGhlcmVmb3JlIGl0IGlzIGJlc3QgdG8gdXNlIHRoZSBmb250cyB0aGF0IGNvbWUgYXMgc3RhbmRhcmQgc3VjaCBhcyAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJyBhbmQgJ0NvdXJpZXIgTmV3Jy4gU2VlIGFsc28gdGhlIEZvbnRzIHdvcmtzaGVldCBjcmVhdGVkIGJ5IGZvcm1hdHMucGwKKworCisKKworPWhlYWQyIHNldF9zaXplKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgRm9udCBzaXplIGlzIDEwCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBTZXQgZm9udCBzaXplIHRvIDEKKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIEludGVnZXIgdmFsdWVzIGZyb20gMSB0byBhcyBiaWcgYXMgeW91ciBzY3JlZW4uCisKKworU2V0IHRoZSBmb250IHNpemUuIEV4Y2VsIGFkanVzdHMgdGhlIGhlaWdodCBvZiBhIHJvdyB0byBhY2NvbW1vZGF0ZSB0aGUgbGFyZ2VzdCBmb250IHNpemUgaW4gdGhlIHJvdy4gWW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgaGVpZ2h0IG9mIGEgcm93IHVzaW5nIHRoZSBzZXRfcm93KCkgd29ya3NoZWV0IG1ldGhvZC4KKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfc2l6ZSgzMCk7CisKKworCisKKworPWhlYWQyIHNldF9jb2xvcigpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIEV4Y2VscyBkZWZhdWx0IGNvbG9yLCB1c3VhbGx5IGJsYWNrCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBTZXQgdGhlIGRlZmF1bHQgY29sb3IKKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIEludGVnZXJzIGZyb20gOC4uNjMgb3IgdGhlIGZvbGxvd2luZyBzdHJpbmdzOgorICAgICAgICAgICAgICAgICAgICAgICAgJ2JsYWNrJworICAgICAgICAgICAgICAgICAgICAgICAgJ2JsdWUnCisgICAgICAgICAgICAgICAgICAgICAgICAnYnJvd24nCisgICAgICAgICAgICAgICAgICAgICAgICAnY3lhbicKKyAgICAgICAgICAgICAgICAgICAgICAgICdncmF5JworICAgICAgICAgICAgICAgICAgICAgICAgJ2dyZWVuJworICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbWUnCisgICAgICAgICAgICAgICAgICAgICAgICAnbWFnZW50YScKKyAgICAgICAgICAgICAgICAgICAgICAgICduYXZ5JworICAgICAgICAgICAgICAgICAgICAgICAgJ29yYW5nZScKKyAgICAgICAgICAgICAgICAgICAgICAgICdwaW5rJworICAgICAgICAgICAgICAgICAgICAgICAgJ3B1cnBsZScKKyAgICAgICAgICAgICAgICAgICAgICAgICdyZWQnCisgICAgICAgICAgICAgICAgICAgICAgICAnc2lsdmVyJworICAgICAgICAgICAgICAgICAgICAgICAgJ3doaXRlJworICAgICAgICAgICAgICAgICAgICAgICAgJ3llbGxvdycKKworU2V0IHRoZSBmb250IGNvbG91ci4gVGhlIEM8c2V0X2NvbG9yKCk+IG1ldGhvZCBpcyB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdyZWQnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnd2hlZWxiYXJyb3cnLCAkZm9ybWF0KTsKKworTm90ZTogVGhlIEM8c2V0X2NvbG9yKCk+IG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgY29sb3VyIG9mIHRoZSBmb250IGluIGEgY2VsbC4gVG8gc2V0IHRoZSBjb2xvdXIgb2YgYSBjZWxsIHVzZSB0aGUgQzxzZXRfYmdfY29sb3IoKT4gYW5kIEM8c2V0X3BhdHRlcm4oKT4gbWV0aG9kcy4KKworRm9yIGFkZGl0aW9uYWwgZXhhbXBsZXMgc2VlIHRoZSAnTmFtZWQgY29sb3JzJyBhbmQgJ1N0YW5kYXJkIGNvbG9ycycgd29ya3NoZWV0cyBjcmVhdGVkIGJ5IGZvcm1hdHMucGwgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeS4KKworU2VlIGFsc28gTDxDT0xPVVJTIElOIEVYQ0VMPi4KKworCisKKworPWhlYWQyIHNldF9ib2xkKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgYm9sZCBpcyBvZmYKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFR1cm4gYm9sZCBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMSBbMV0KKworU2V0IHRoZSBib2xkIHByb3BlcnR5IG9mIHRoZSBmb250OgorCisgICAgJGZvcm1hdC0+c2V0X2JvbGQoKTsgICMgVHVybiBib2xkIG9uCisKK1sxXSBBY3R1YWxseSwgdmFsdWVzIGluIHRoZSByYW5nZSAxMDAuLjEwMDAgYXJlIGFsc28gdmFsaWQuIDQwMCBpcyBub3JtYWwsIDcwMCBpcyBib2xkIGFuZCAxMDAwIGlzIHZlcnkgYm9sZCBpbmRlZWQuIEl0IGlzIHByb2JhYmx5IGJlc3QgdG8gc2V0IHRoZSB2YWx1ZSB0byAxIGFuZCB1c2Ugbm9ybWFsIGJvbGQuCisKKworCisKKz1oZWFkMiBzZXRfaXRhbGljKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgSXRhbGljIGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgVHVybiBpdGFsaWMgb24KKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIDAsIDEKKworU2V0IHRoZSBpdGFsaWMgcHJvcGVydHkgb2YgdGhlIGZvbnQ6CisKKyAgICAkZm9ybWF0LT5zZXRfaXRhbGljKCk7ICAjIFR1cm4gaXRhbGljIG9uCisKKworCisKKz1oZWFkMiBzZXRfdW5kZXJsaW5lKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgVW5kZXJsaW5lIGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgVHVybiBvbiBzaW5nbGUgdW5kZXJsaW5lCisgICAgVmFsaWQgYXJnczogICAgICAgICAwICA9IE5vIHVuZGVybGluZQorICAgICAgICAgICAgICAgICAgICAgICAgMSAgPSBTaW5nbGUgdW5kZXJsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAyICA9IERvdWJsZSB1bmRlcmxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIDMzID0gU2luZ2xlIGFjY291bnRpbmcgdW5kZXJsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAzNCA9IERvdWJsZSBhY2NvdW50aW5nIHVuZGVybGluZQorCitTZXQgdGhlIHVuZGVybGluZSBwcm9wZXJ0eSBvZiB0aGUgZm9udC4KKworICAgICRmb3JtYXQtPnNldF91bmRlcmxpbmUoKTsgICAjIFNpbmdsZSB1bmRlcmxpbmUKKworCisKKworPWhlYWQyIHNldF9mb250X3N0cmlrZW91dCgpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIFN0cmlrZW91dCBpcyBvZmYKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFR1cm4gc3RyaWtlb3V0IG9uCisgICAgVmFsaWQgYXJnczogICAgICAgICAwLCAxCisKK1NldCB0aGUgc3RyaWtlb3V0IHByb3BlcnR5IG9mIHRoZSBmb250LgorCisKKworCis9aGVhZDIgc2V0X2ZvbnRfc2NyaXB0KCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgU3VwZXIvU3Vic2NyaXB0IGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgVHVybiBTdXBlcnNjcmlwdCBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCAgPSBOb3JtYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEgID0gU3VwZXJzY3JpcHQKKyAgICAgICAgICAgICAgICAgICAgICAgIDIgID0gU3Vic2NyaXB0CisKK1NldCB0aGUgc3VwZXJzY3JpcHQvc3Vic2NyaXB0IHByb3BlcnR5IG9mIHRoZSBmb250LiBUaGlzIGZvcm1hdCBpcyBjdXJyZW50bHkgbm90IHZlcnkgdXNlZnVsLgorCisKKworCis9aGVhZDIgc2V0X2ZvbnRfb3V0bGluZSgpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIE91dGxpbmUgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBUdXJuIG91dGxpbmUgb24KKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIDAsIDEKKworTWFjaW50b3NoIG9ubHkuCisKKworCisKKz1oZWFkMiBzZXRfZm9udF9zaGFkb3coKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBTaGFkb3cgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBUdXJuIHNoYWRvdyBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMQorCitNYWNpbnRvc2ggb25seS4KKworCisKKworPWhlYWQyIHNldF9udW1fZm9ybWF0KCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgR2VuZXJhbCBmb3JtYXQKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIEZvcm1hdCBpbmRleCAxCisgICAgVmFsaWQgYXJnczogICAgICAgICBTZWUgdGhlIGZvbGxvd2luZyB0YWJsZQorCitUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGRlZmluZSB0aGUgbnVtZXJpY2FsIGZvcm1hdCBvZiBhIG51bWJlciBpbiBFeGNlbC4gSXQgY29udHJvbHMgd2hldGhlciBhIG51bWJlciBpcyBkaXNwbGF5ZWQgYXMgYW4gaW50ZWdlciwgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIGEgZGF0ZSwgYSBjdXJyZW5jeSB2YWx1ZSBvciBzb21lIG90aGVyIHVzZXIgZGVmaW5lZCBmb3JtYXQuCisKK1RoZSBudW1lcmljYWwgZm9ybWF0IG9mIGEgY2VsbCBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGEgZm9ybWF0IHN0cmluZyBvciBhbiBpbmRleCB0byBvbmUgb2YgRXhjZWwncyBidWlsdC1pbiBmb3JtYXRzOgorCisgICAgbXkgJGZvcm1hdDEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICBteSAkZm9ybWF0MiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQxLT5zZXRfbnVtX2Zvcm1hdCgnZCBtbW0geXl5eScpOyAjIEZvcm1hdCBzdHJpbmcKKyAgICAkZm9ybWF0Mi0+c2V0X251bV9mb3JtYXQoMHgwZik7ICAgICAgICAgIyBGb3JtYXQgaW5kZXgKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsIDM2ODkyLjUyMSwgJGZvcm1hdDEpOyAgICAgICMgMSBKYW4gMjAwMQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsIDM2ODkyLjUyMSwgJGZvcm1hdDIpOyAgICAgICMgMS1KYW4tMDEKKworCitVc2luZyBmb3JtYXQgc3RyaW5ncyB5b3UgY2FuIGRlZmluZSB2ZXJ5IHNvcGhpc3RpY2F0ZWQgZm9ybWF0dGluZyBvZiBudW1iZXJzLgorCisgICAgJGZvcm1hdDAxLT5zZXRfbnVtX2Zvcm1hdCgnMC4wMDAnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAgMCwgMy4xNDE1OTI2LCAkZm9ybWF0MDEpOyAgICAjIDMuMTQyCisKKyAgICAkZm9ybWF0MDItPnNldF9udW1fZm9ybWF0KCcjLCMjMCcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsICAwLCAxMjM0LjU2LCAgICRmb3JtYXQwMik7ICAgICMgMSwyMzUKKworICAgICRmb3JtYXQwMy0+c2V0X251bV9mb3JtYXQoJyMsIyMwLjAwJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgIDAsIDEyMzQuNTYsICAgJGZvcm1hdDAzKTsgICAgIyAxLDIzNC41NgorCisgICAgJGZvcm1hdDA0LT5zZXRfbnVtX2Zvcm1hdCgnJDAuMDAnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAgMCwgNDkuOTksICAgICAkZm9ybWF0MDQpOyAgICAjICQ0OS45OQorCisgICAgIyBOb3RlIHlvdSBjYW4gdXNlIG90aGVyIGN1cnJlbmN5IHN5bWJvbHMgc3VjaCBhcyB0aGUgcG91bmQgb3IgeWVuIGFzIHdlbGwuCisgICAgIyBPdGhlciBjdXJyZW5jaWVzIG1heSByZXF1aXJlIHRoZSB1c2Ugb2YgVW5pY29kZS4KKworICAgICRmb3JtYXQwNy0+c2V0X251bV9mb3JtYXQoJ21tL2RkL3l5Jyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoNiwgIDAsIDM2ODkyLjUyMSwgJGZvcm1hdDA3KTsgICAgIyAwMS8wMS8wMQorCisgICAgJGZvcm1hdDA4LT5zZXRfbnVtX2Zvcm1hdCgnbW1tIGQgeXl5eScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsICAwLCAzNjg5Mi41MjEsICRmb3JtYXQwOCk7ICAgICMgSmFuIDEgMjAwMQorCisgICAgJGZvcm1hdDA5LT5zZXRfbnVtX2Zvcm1hdCgnZCBtbW1tIHl5eXknKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg4LCAgMCwgMzY4OTIuNTIxLCAkZm9ybWF0MDkpOyAgICAjIDEgSmFudWFyeSAyMDAxCisKKyAgICAkZm9ybWF0MTAtPnNldF9udW1fZm9ybWF0KCdkZC9tbS95eXl5IGhoOm1tIEFNL1BNJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoOSwgIDAsIDM2ODkyLjUyMSwgJGZvcm1hdDEwKTsgICAgIyAwMS8wMS8yMDAxIDEyOjMwIEFNCisKKyAgICAkZm9ybWF0MTEtPnNldF9udW1fZm9ybWF0KCcwICJkb2xsYXIgYW5kIiAuMDAgImNlbnRzIicpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEwLCAwLCAxLjg3LCAgICAgICRmb3JtYXQxMSk7ICAgICMgMSBkb2xsYXIgYW5kIC44NyBjZW50cworCisgICAgIyBDb25kaXRpb25hbCBmb3JtYXR0aW5nCisgICAgJGZvcm1hdDEyLT5zZXRfbnVtX2Zvcm1hdCgnW0dyZWVuXUdlbmVyYWw7W1JlZF0tR2VuZXJhbDtHZW5lcmFsJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMTEsIDAsIDEyMywgICAgICAgJGZvcm1hdDEyKTsgICAgIyA+IDAgR3JlZW4KKyAgICAkd29ya3NoZWV0LT53cml0ZSgxMiwgMCwgLTQ1LCAgICAgICAkZm9ybWF0MTIpOyAgICAjIDwgMCBSZWQKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxMywgMCwgMCwgICAgICAgICAkZm9ybWF0MTIpOyAgICAjID0gMCBEZWZhdWx0IGNvbG91cgorCisgICAgIyBaaXAgY29kZQorICAgICRmb3JtYXQxMy0+c2V0X251bV9mb3JtYXQoJzAwMDAwJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMTQsIDAsICcwMTIwOScsICAgJGZvcm1hdDEzKTsKKworCitUaGUgbnVtYmVyIHN5c3RlbSB1c2VkIGZvciBkYXRlcyBpcyBkZXNjcmliZWQgaW4gTDxEQVRFUyBBTkQgVElNRSBJTiBFWENFTD4uCisKK1RoZSBjb2xvdXIgZm9ybWF0IHNob3VsZCBoYXZlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworICAgIFtCbGFja10gW0JsdWVdIFtDeWFuXSBbR3JlZW5dIFtNYWdlbnRhXSBbUmVkXSBbV2hpdGVdIFtZZWxsb3ddCisKK0FsdGVybmF0aXZlbHkgeW91IGNhbiBzcGVjaWZ5IHRoZSBjb2xvdXIgYmFzZWQgb24gYSBjb2xvdXIgaW5kZXggYXMgZm9sbG93czogQzxbQ29sb3Igbl0+LCB3aGVyZSBuIGlzIGEgc3RhbmRhcmQgRXhjZWwgY29sb3VyIGluZGV4IC0gNy4gU2VlIHRoZSAnU3RhbmRhcmQgY29sb3JzJyB3b3Jrc2hlZXQgY3JlYXRlZCBieSBmb3JtYXRzLnBsLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvbiBmb3JtYXR0aW5nIGluIHRoZSBDPGRvY3M+IGRpcmVjdG9yeSBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZGlzdHJvLCB0aGUgRXhjZWwgb24tbGluZSBoZWxwIG9yIEw8aHR0cDovL29mZmljZS5taWNyb3NvZnQuY29tL2VuLWdiL2Fzc2lzdGFuY2UvSFAwNTE5OTUwMDEwMzMuYXNweD4uCisKK1lvdSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGZvcm1hdCBzdHJpbmcgaXMgdmFsaWQgaW4gRXhjZWwgcHJpb3IgdG8gdXNpbmcgaXQgaW4gV3JpdGVFeGNlbC4KKworRXhjZWwncyBidWlsdC1pbiBmb3JtYXRzIGFyZSBzaG93biBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCisgICAgSW5kZXggICBJbmRleCAgIEZvcm1hdCBTdHJpbmcKKyAgICAwICAgICAgIDB4MDAgICAgR2VuZXJhbAorICAgIDEgICAgICAgMHgwMSAgICAwCisgICAgMiAgICAgICAweDAyICAgIDAuMDAKKyAgICAzICAgICAgIDB4MDMgICAgIywjIzAKKyAgICA0ICAgICAgIDB4MDQgICAgIywjIzAuMDAKKyAgICA1ICAgICAgIDB4MDUgICAgKCQjLCMjMF8pOygkIywjIzApCisgICAgNiAgICAgICAweDA2ICAgICgkIywjIzBfKTtbUmVkXSgkIywjIzApCisgICAgNyAgICAgICAweDA3ICAgICgkIywjIzAuMDBfKTsoJCMsIyMwLjAwKQorICAgIDggICAgICAgMHgwOCAgICAoJCMsIyMwLjAwXyk7W1JlZF0oJCMsIyMwLjAwKQorICAgIDkgICAgICAgMHgwOSAgICAwJQorICAgIDEwICAgICAgMHgwYSAgICAwLjAwJQorICAgIDExICAgICAgMHgwYiAgICAwLjAwRSswMAorICAgIDEyICAgICAgMHgwYyAgICAjID8vPworICAgIDEzICAgICAgMHgwZCAgICAjID8/Lz8/CisgICAgMTQgICAgICAweDBlICAgIG0vZC95eQorICAgIDE1ICAgICAgMHgwZiAgICBkLW1tbS15eQorICAgIDE2ICAgICAgMHgxMCAgICBkLW1tbQorICAgIDE3ICAgICAgMHgxMSAgICBtbW0teXkKKyAgICAxOCAgICAgIDB4MTIgICAgaDptbSBBTS9QTQorICAgIDE5ICAgICAgMHgxMyAgICBoOm1tOnNzIEFNL1BNCisgICAgMjAgICAgICAweDE0ICAgIGg6bW0KKyAgICAyMSAgICAgIDB4MTUgICAgaDptbTpzcworICAgIDIyICAgICAgMHgxNiAgICBtL2QveXkgaDptbQorICAgIC4uICAgICAgLi4uLiAgICAuLi4uLi4uLi4uLgorICAgIDM3ICAgICAgMHgyNSAgICAoIywjIzBfKTsoIywjIzApCisgICAgMzggICAgICAweDI2ICAgICgjLCMjMF8pO1tSZWRdKCMsIyMwKQorICAgIDM5ICAgICAgMHgyNyAgICAoIywjIzAuMDBfKTsoIywjIzAuMDApCisgICAgNDAgICAgICAweDI4ICAgICgjLCMjMC4wMF8pO1tSZWRdKCMsIyMwLjAwKQorICAgIDQxICAgICAgMHgyOSAgICBfKCogIywjIzBfKTtfKCogKCMsIyMwKTtfKCogIi0iXyk7XyhAXykKKyAgICA0MiAgICAgIDB4MmEgICAgXygkKiAjLCMjMF8pO18oJCogKCMsIyMwKTtfKCQqICItIl8pO18oQF8pCisgICAgNDMgICAgICAweDJiICAgIF8oKiAjLCMjMC4wMF8pO18oKiAoIywjIzAuMDApO18oKiAiLSI/P18pO18oQF8pCisgICAgNDQgICAgICAweDJjICAgIF8oJCogIywjIzAuMDBfKTtfKCQqICgjLCMjMC4wMCk7XygkKiAiLSI/P18pO18oQF8pCisgICAgNDUgICAgICAweDJkICAgIG1tOnNzCisgICAgNDYgICAgICAweDJlICAgIFtoXTptbTpzcworICAgIDQ3ICAgICAgMHgyZiAgICBtbTpzcy4wCisgICAgNDggICAgICAweDMwICAgICMjMC4wRSswCisgICAgNDkgICAgICAweDMxICAgIEAKKworCitGb3IgZXhhbXBsZXMgb2YgdGhlc2UgZm9ybWF0dGluZyBjb2RlcyBzZWUgdGhlICdOdW1lcmljYWwgZm9ybWF0cycgd29ya3NoZWV0IGNyZWF0ZWQgYnkgZm9ybWF0cy5wbC4gU2VlIGFsc28gdGhlIG51bWJlcl9mb3JtYXRzMS5odG1sIGFuZCB0aGUgbnVtYmVyX2Zvcm1hdHMyLmh0bWwgZG9jdW1lbnRzIGluIHRoZSBDPGRvY3M+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCitOb3RlIDEuIE51bWVyaWMgZm9ybWF0cyAyMyB0byAzNiBhcmUgbm90IGRvY3VtZW50ZWQgYnkgTWljcm9zb2Z0IGFuZCBtYXkgZGlmZmVyIGluIGludGVybmF0aW9uYWwgdmVyc2lvbnMuCisKK05vdGUgMi4gSW4gRXhjZWwgNSB0aGUgZG9sbGFyIHNpZ24gYXBwZWFycyBhcyBhIGRvbGxhciBzaWduLiBJbiBFeGNlbCA5Ny0yMDAwIGl0IGFwcGVhcnMgYXMgdGhlIGRlZmluZWQgbG9jYWwgY3VycmVuY3kgc3ltYm9sLgorCitOb3RlIDMuIFRoZSByZWQgbmVnYXRpdmUgbnVtZXJpYyBmb3JtYXRzIGRpc3BsYXkgc2xpZ2h0bHkgZGlmZmVyZW50bHkgaW4gRXhjZWwgNSBhbmQgRXhjZWwgOTctMjAwMC4KKworCisKKworPWhlYWQyIHNldF9sb2NrZWQoKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBDZWxsIGxvY2tpbmcgaXMgb24KKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFR1cm4gbG9ja2luZyBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMQorCitUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIGEgY2VsbHMgY29udGVudHMuIEZvbGxvd2luZyBFeGNlbCdzIGNvbnZlbnRpb24sIGNlbGwgbG9ja2luZyBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdC4gSG93ZXZlciwgaXQgb25seSBoYXMgYW4gZWZmZWN0IGlmIHRoZSB3b3Jrc2hlZXQgaGFzIGJlZW4gcHJvdGVjdGVkLCBzZWUgdGhlIHdvcmtzaGVldCBDPHByb3RlY3QoKT4gbWV0aG9kLgorCisgICAgbXkgJGxvY2tlZCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkbG9ja2VkLT5zZXRfbG9ja2VkKDEpOyAjIEEgbm9uLW9wCisKKyAgICBteSAkdW5sb2NrZWQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkbG9ja2VkLT5zZXRfbG9ja2VkKDApOworCisgICAgIyBFbmFibGUgd29ya3NoZWV0IHByb3RlY3Rpb24KKyAgICAkd29ya3NoZWV0LT5wcm90ZWN0KCk7CisKKyAgICAjIFRoaXMgY2VsbCBjYW5ub3QgYmUgZWRpdGVkLgorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICc9MSsyJywgJGxvY2tlZCk7CisKKyAgICAjIFRoaXMgY2VsbCBjYW4gYmUgZWRpdGVkLgorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICc9MSsyJywgJHVubG9ja2VkKTsKKworTm90ZTogVGhpcyBvZmZlcnMgd2VhayBwcm90ZWN0aW9uIGV2ZW4gd2l0aCBhIHBhc3N3b3JkLCBzZWUgdGhlIG5vdGUgaW4gcmVsYXRpb24gdG8gdGhlIEM8cHJvdGVjdCgpPiBtZXRob2QuCisKKworCisKKz1oZWFkMiBzZXRfaGlkZGVuKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgRm9ybXVsYSBoaWRpbmcgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBUdXJuIGhpZGluZyBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMQorCitUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gaGlkZSBhIGZvcm11bGEgd2hpbGUgc3RpbGwgZGlzcGxheWluZyBpdHMgcmVzdWx0LiBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIGhpZGUgY29tcGxleCBjYWxjdWxhdGlvbnMgZnJvbSBlbmQgdXNlcnMgd2hvIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIHJlc3VsdC4gSXQgb25seSBoYXMgYW4gZWZmZWN0IGlmIHRoZSB3b3Jrc2hlZXQgaGFzIGJlZW4gcHJvdGVjdGVkLCBzZWUgdGhlIHdvcmtzaGVldCBDPHByb3RlY3QoKT4gbWV0aG9kLgorCisgICAgbXkgJGhpZGRlbiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRoaWRkZW4tPnNldF9oaWRkZW4oKTsKKworICAgICMgRW5hYmxlIHdvcmtzaGVldCBwcm90ZWN0aW9uCisgICAgJHdvcmtzaGVldC0+cHJvdGVjdCgpOworCisgICAgIyBUaGUgZm9ybXVsYSBpbiB0aGlzIGNlbGwgaXNuJ3QgdmlzaWJsZQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICc9MSsyJywgJGhpZGRlbik7CisKKworTm90ZTogVGhpcyBvZmZlcnMgd2VhayBwcm90ZWN0aW9uIGV2ZW4gd2l0aCBhIHBhc3N3b3JkLCBzZWUgdGhlIG5vdGUgaW4gcmVsYXRpb24gdG8gdGhlIEM8cHJvdGVjdCgpPiBtZXRob2QuCisKKworCisKKz1oZWFkMiBzZXRfYWxpZ24oKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBBbGlnbm1lbnQgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBMZWZ0IGFsaWdubWVudAorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgJ2xlZnQnICAgICAgICAgICAgICBIb3Jpem9udGFsCisgICAgICAgICAgICAgICAgICAgICAgICAnY2VudGVyJworICAgICAgICAgICAgICAgICAgICAgICAgJ3JpZ2h0JworICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGwnCisgICAgICAgICAgICAgICAgICAgICAgICAnanVzdGlmeScKKyAgICAgICAgICAgICAgICAgICAgICAgICdjZW50ZXJfYWNyb3NzJworCisgICAgICAgICAgICAgICAgICAgICAgICAndG9wJyAgICAgICAgICAgICAgIFZlcnRpY2FsCisgICAgICAgICAgICAgICAgICAgICAgICAndmNlbnRlcicKKyAgICAgICAgICAgICAgICAgICAgICAgICdib3R0b20nCisgICAgICAgICAgICAgICAgICAgICAgICAndmp1c3RpZnknCisKK1RoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCB0ZXh0IGFsaWdubWVudCB3aXRoaW4gYSBjZWxsLiBWZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBhbGlnbm1lbnRzIGNhbiBiZSBjb21iaW5lZC4gVGhlIG1ldGhvZCBpcyB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2FsaWduKCdjZW50ZXInKTsKKyAgICAkZm9ybWF0LT5zZXRfYWxpZ24oJ3ZjZW50ZXInKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDAsIDMwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnWCcsICRmb3JtYXQpOworCitUZXh0IGNhbiBiZSBhbGlnbmVkIGFjcm9zcyB0d28gb3IgbW9yZSBhZGphY2VudCBjZWxscyB1c2luZyB0aGUgQzxjZW50ZXJfYWNyb3NzPiBwcm9wZXJ0eS4gSG93ZXZlciwgZm9yIGdlbnVpbmUgbWVyZ2VkIGNlbGxzIGl0IGlzIGJldHRlciB0byB1c2UgdGhlIEM8bWVyZ2VfcmFuZ2UoKT4gd29ya3NoZWV0IG1ldGhvZC4KKworVGhlIEM8dmp1c3RpZnk+ICh2ZXJ0aWNhbCBqdXN0aWZ5KSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhdXRvbWF0aWMgdGV4dCB3cmFwcGluZyBpbiBhIGNlbGwuIFRoZSBoZWlnaHQgb2YgdGhlIGNlbGwgd2lsbCBiZSBhZGp1c3RlZCB0byBhY2NvbW1vZGF0ZSB0aGUgd3JhcHBlZCB0ZXh0LiBUbyBzcGVjaWZ5IHdoZXJlIHRoZSB0ZXh0IHdyYXBzIHVzZSB0aGUgQzxzZXRfdGV4dF93cmFwKCk+IG1ldGhvZC4KKworCitGb3IgZnVydGhlciBleGFtcGxlcyBzZWUgdGhlICdBbGlnbm1lbnQnIHdvcmtzaGVldCBjcmVhdGVkIGJ5IGZvcm1hdHMucGwuCisKKworCisKKz1oZWFkMiBzZXRfY2VudGVyX2Fjcm9zcygpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIENlbnRlciBhY3Jvc3Mgc2VsZWN0aW9uIGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgVHVybiBjZW50ZXIgYWNyb3NzIG9uCisgICAgVmFsaWQgYXJnczogICAgICAgICAxCisKK1RleHQgY2FuIGJlIGFsaWduZWQgYWNyb3NzIHR3byBvciBtb3JlIGFkamFjZW50IGNlbGxzIHVzaW5nIHRoZSBDPHNldF9jZW50ZXJfYWNyb3NzKCk+IG1ldGhvZC4gVGhpcyBpcyBhbiBhbGlhcyBmb3IgdGhlIEM8c2V0X2FsaWduKCdjZW50ZXJfYWNyb3NzJyk+IG1ldGhvZCBjYWxsLgorCitPbmx5IG9uZSBjZWxsIHNob3VsZCBjb250YWluIHRoZSB0ZXh0LCB0aGUgb3RoZXIgY2VsbHMgc2hvdWxkIGJlIGJsYW5rOgorCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9jZW50ZXJfYWNyb3NzKCk7CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAxLCAnQ2VudGVyIGFjcm9zcyBzZWxlY3Rpb24nLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9ibGFuaygxLCAyLCAkZm9ybWF0KTsKKworU2VlIGFsc28gdGhlIEM8bWVyZ2UxLnBsPiB0byBDPG1lcmdlNi5wbD4gcHJvZ3JhbXMgaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBhbmQgdGhlIEM8bWVyZ2VfcmFuZ2UoKT4gbWV0aG9kLgorCisKKworPWhlYWQyIHNldF90ZXh0X3dyYXAoKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBUZXh0IHdyYXAgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBUdXJuIHRleHQgd3JhcCBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMQorCisKK0hlcmUgaXMgYW4gZXhhbXBsZSB1c2luZyB0aGUgdGV4dCB3cmFwIHByb3BlcnR5LCB0aGUgZXNjYXBlIGNoYXJhY3RlciBDPFxuPiBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgbGluZToKKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfdGV4dF93cmFwKCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkl0J3NcbmEgYnVtXG53cmFwIiwgJGZvcm1hdCk7CisKK0V4Y2VsIHdpbGwgYWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIHJvdyB0byBhY2NvbW1vZGF0ZSB0aGUgd3JhcHBlZCB0ZXh0LiBBIHNpbWlsYXIgZWZmZWN0IGNhbiBiZSBvYnRhaW5lZCB3aXRob3V0IG5ld2xpbmVzIHVzaW5nIHRoZSBDPHNldF9hbGlnbigndmp1c3RpZnknKT4gbWV0aG9kLiBTZWUgdGhlIEM8dGV4dHdyYXAucGw+IHByb2dyYW0gaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeS4KKworCisKKworPWhlYWQyIHNldF9yb3RhdGlvbigpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIFRleHQgcm90YXRpb24gaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBOb25lCisgICAgVmFsaWQgYXJnczogICAgICAgICBJbnRlZ2VycyBpbiB0aGUgcmFuZ2UgLTkwIHRvIDkwIGFuZCAyNzAKKworU2V0IHRoZSByb3RhdGlvbiBvZiB0aGUgdGV4dCBpbiBhIGNlbGwuIFRoZSByb3RhdGlvbiBjYW4gYmUgYW55IGFuZ2xlIGluIHRoZSByYW5nZSAtOTAgdG8gOTAgZGVncmVlcy4KKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfcm90YXRpb24oMzApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdUaGlzIHRleHQgaXMgcm90YXRlZCcsICRmb3JtYXQpOworCisKK1RoZSBhbmdsZSAyNzAgaXMgYWxzbyBzdXBwb3J0ZWQuIFRoaXMgaW5kaWNhdGVzIHRleHQgd2hlcmUgdGhlIGxldHRlcnMgcnVuIGZyb20gdG9wIHRvIGJvdHRvbS4KKworCisKKz1oZWFkMiBzZXRfaW5kZW50KCkKKworCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBUZXh0IGluZGVudGF0aW9uIGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgSW5kZW50IHRleHQgMSBsZXZlbAorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgUG9zaXRpdmUgaW50ZWdlcnMKKworCitUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBpbmRlbnQgdGV4dC4gVGhlIGFyZ3VtZW50LCB3aGljaCBzaG91bGQgYmUgYW4gaW50ZWdlciwgaXMgdGFrZW4gYXMgdGhlIGxldmVsIG9mIGluZGVudGF0aW9uOgorCisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2luZGVudCgyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnVGhpcyB0ZXh0IGlzIGluZGVudGVkJywgJGZvcm1hdCk7CisKKworSW5kZW50YXRpb24gaXMgYSBob3Jpem9udGFsIGFsaWdubWVudCBwcm9wZXJ0eS4gSXQgd2lsbCBvdmVycmlkZSBhbnkgb3RoZXIgaG9yaXpvbnRhbCBwcm9wZXJ0aWVzIGJ1dCBpdCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHZlcnRpY2FsIHByb3BlcnRpZXMuCisKKworCisKKz1oZWFkMiBzZXRfc2hyaW5rKCkKKworCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBUZXh0IHNocmlua2luZyBpcyBvZmYKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFR1cm4gInNocmluayB0byBmaXQiIG9uCisgICAgVmFsaWQgYXJnczogICAgICAgICAxCisKKworVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2hyaW5rIHRleHQgc28gdGhhdCBpdCBmaXRzIGluIGEgY2VsbC4KKworCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9zaHJpbmsoKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnSG9uZXksIEkgc2hydW5rIHRoZSB0ZXh0IScsICRmb3JtYXQpOworCisKKworCis9aGVhZDIgc2V0X3RleHRfanVzdGxhc3QoKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBKdXN0aWZ5IGxhc3QgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBUdXJuIGp1c3RpZnkgbGFzdCBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMQorCisKK09ubHkgYXBwbGllcyB0byBGYXIgRWFzdGVybiB2ZXJzaW9ucyBvZiBFeGNlbC4KKworCisKKworPWhlYWQyIHNldF9wYXR0ZXJuKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgUGF0dGVybiBpcyBvZmYKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFNvbGlkIGZpbGwgaXMgb24KKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIDAgLi4gMTgKKworU2V0IHRoZSBiYWNrZ3JvdW5kIHBhdHRlcm4gb2YgYSBjZWxsLgorCitFeGFtcGxlcyBvZiB0aGUgYXZhaWxhYmxlIHBhdHRlcm5zIGFyZSBzaG93biBpbiB0aGUgJ1BhdHRlcm5zJyB3b3Jrc2hlZXQgY3JlYXRlZCBieSBmb3JtYXRzLnBsLiBIb3dldmVyLCBpdCBpcyB1bmxpa2VseSB0aGF0IHlvdSB3aWxsIGV2ZXIgbmVlZCBhbnl0aGluZyBvdGhlciB0aGFuIFBhdHRlcm4gMSB3aGljaCBpcyBhIHNvbGlkIGZpbGwgb2YgdGhlIGJhY2tncm91bmQgY29sb3IuCisKKworCisKKz1oZWFkMiBzZXRfYmdfY29sb3IoKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBDb2xvciBpcyBvZmYKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFNvbGlkIGZpbGwuCisgICAgVmFsaWQgYXJnczogICAgICAgICBTZWUgc2V0X2NvbG9yKCkKKworVGhlIEM8c2V0X2JnX2NvbG9yKCk+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGJhY2tncm91bmQgY29sb3VyIG9mIGEgcGF0dGVybi4gUGF0dGVybnMgYXJlIGRlZmluZWQgdmlhIHRoZSBDPHNldF9wYXR0ZXJuKCk+IG1ldGhvZC4gSWYgYSBwYXR0ZXJuIGhhc24ndCBiZWVuIGRlZmluZWQgdGhlbiBhIHNvbGlkIGZpbGwgcGF0dGVybiBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0LgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHNldCB1cCBhIHNvbGlkIGZpbGwgaW4gYSBjZWxsOgorCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworCisgICAgJGZvcm1hdC0+c2V0X3BhdHRlcm4oKTsgIyBUaGlzIGlzIG9wdGlvbmFsIHdoZW4gdXNpbmcgYSBzb2xpZCBmaWxsCisKKyAgICAkZm9ybWF0LT5zZXRfYmdfY29sb3IoJ2dyZWVuJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ1JheScsICRmb3JtYXQpOworCitGb3IgZnVydGhlciBleGFtcGxlcyBzZWUgdGhlICdQYXR0ZXJucycgd29ya3NoZWV0IGNyZWF0ZWQgYnkgZm9ybWF0cy5wbC4KKworCisKKworPWhlYWQyIHNldF9mZ19jb2xvcigpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIENvbG9yIGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgU29saWQgZmlsbC4KKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIFNlZSBzZXRfY29sb3IoKQorCisKK1RoZSBDPHNldF9mZ19jb2xvcigpPiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG91ciBvZiBhIHBhdHRlcm4uCisKK0ZvciBmdXJ0aGVyIGV4YW1wbGVzIHNlZSB0aGUgJ1BhdHRlcm5zJyB3b3Jrc2hlZXQgY3JlYXRlZCBieSBmb3JtYXRzLnBsLgorCisKKworCis9aGVhZDIgc2V0X2JvcmRlcigpCisKKyAgICBBbHNvIGFwcGxpZXMgdG86ICAgIHNldF9ib3R0b20oKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfbGVmdCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcmlnaHQoKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBCb3JkZXIgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBTZXQgYm9yZGVyIHR5cGUgMQorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMC0xMywgU2VlIGJlbG93LgorCitBIGNlbGwgYm9yZGVyIGlzIGNvbXByaXNlZCBvZiBhIGJvcmRlciBvbiB0aGUgYm90dG9tLCB0b3AsIGxlZnQgYW5kIHJpZ2h0LiBUaGVzZSBjYW4gYmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIHVzaW5nIEM8c2V0X2JvcmRlcigpPiBvciBpbmRpdmlkdWFsbHkgdXNpbmcgdGhlIHJlbGV2YW50IG1ldGhvZCBjYWxscyBzaG93biBhYm92ZS4KKworVGhlIGZvbGxvd2luZyBzaG93cyB0aGUgYm9yZGVyIHN0eWxlcyBzb3J0ZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaW5kZXggbnVtYmVyOgorCisgICAgSW5kZXggICBOYW1lICAgICAgICAgICAgV2VpZ2h0ICAgU3R5bGUKKyAgICA9PT09PSAgID09PT09PT09PT09PT0gICA9PT09PT0gICA9PT09PT09PT09PQorICAgIDAgICAgICAgTm9uZSAgICAgICAgICAgIDAKKyAgICAxICAgICAgIENvbnRpbnVvdXMgICAgICAxICAgICAgICAtLS0tLS0tLS0tLQorICAgIDIgICAgICAgQ29udGludW91cyAgICAgIDIgICAgICAgIC0tLS0tLS0tLS0tCisgICAgMyAgICAgICBEYXNoICAgICAgICAgICAgMSAgICAgICAgLSAtIC0gLSAtIC0KKyAgICA0ICAgICAgIERvdCAgICAgICAgICAgICAxICAgICAgICAuIC4gLiAuIC4gLgorICAgIDUgICAgICAgQ29udGludW91cyAgICAgIDMgICAgICAgIC0tLS0tLS0tLS0tCisgICAgNiAgICAgICBEb3VibGUgICAgICAgICAgMyAgICAgICAgPT09PT09PT09PT0KKyAgICA3ICAgICAgIENvbnRpbnVvdXMgICAgICAwICAgICAgICAtLS0tLS0tLS0tLQorICAgIDggICAgICAgRGFzaCAgICAgICAgICAgIDIgICAgICAgIC0gLSAtIC0gLSAtCisgICAgOSAgICAgICBEYXNoIERvdCAgICAgICAgMSAgICAgICAgLSAuIC0gLiAtIC4KKyAgICAxMCAgICAgIERhc2ggRG90ICAgICAgICAyICAgICAgICAtIC4gLSAuIC0gLgorICAgIDExICAgICAgRGFzaCBEb3QgRG90ICAgIDEgICAgICAgIC0gLiAuIC0gLiAuCisgICAgMTIgICAgICBEYXNoIERvdCBEb3QgICAgMiAgICAgICAgLSAuIC4gLSAuIC4KKyAgICAxMyAgICAgIFNsYW50RGFzaCBEb3QgICAyICAgICAgICAvIC0gLiAvIC0gLgorCisKK1RoZSBmb2xsb3dpbmcgc2hvd3MgdGhlIGJvcmRlcnMgc29ydGVkIGJ5IHN0eWxlOgorCisgICAgTmFtZSAgICAgICAgICAgIFdlaWdodCAgIFN0eWxlICAgICAgICAgSW5kZXgKKyAgICA9PT09PT09PT09PT09ICAgPT09PT09ICAgPT09PT09PT09PT0gICA9PT09PQorICAgIENvbnRpbnVvdXMgICAgICAwICAgICAgICAtLS0tLS0tLS0tLSAgIDcKKyAgICBDb250aW51b3VzICAgICAgMSAgICAgICAgLS0tLS0tLS0tLS0gICAxCisgICAgQ29udGludW91cyAgICAgIDIgICAgICAgIC0tLS0tLS0tLS0tICAgMgorICAgIENvbnRpbnVvdXMgICAgICAzICAgICAgICAtLS0tLS0tLS0tLSAgIDUKKyAgICBEYXNoICAgICAgICAgICAgMSAgICAgICAgLSAtIC0gLSAtIC0gICAzCisgICAgRGFzaCAgICAgICAgICAgIDIgICAgICAgIC0gLSAtIC0gLSAtICAgOAorICAgIERhc2ggRG90ICAgICAgICAxICAgICAgICAtIC4gLSAuIC0gLiAgIDkKKyAgICBEYXNoIERvdCAgICAgICAgMiAgICAgICAgLSAuIC0gLiAtIC4gICAxMAorICAgIERhc2ggRG90IERvdCAgICAxICAgICAgICAtIC4gLiAtIC4gLiAgIDExCisgICAgRGFzaCBEb3QgRG90ICAgIDIgICAgICAgIC0gLiAuIC0gLiAuICAgMTIKKyAgICBEb3QgICAgICAgICAgICAgMSAgICAgICAgLiAuIC4gLiAuIC4gICA0CisgICAgRG91YmxlICAgICAgICAgIDMgICAgICAgID09PT09PT09PT09ICAgNgorICAgIE5vbmUgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICBTbGFudERhc2ggRG90ICAgMiAgICAgICAgLyAtIC4gLyAtIC4gICAxMworCisKK1RoZSBmb2xsb3dpbmcgc2hvd3MgdGhlIGJvcmRlcnMgaW4gdGhlIG9yZGVyIHNob3duIGluIHRoZSBFeGNlbCBEaWFsb2cuCisKKyAgICBJbmRleCAgIFN0eWxlICAgICAgICAgICAgIEluZGV4ICAgU3R5bGUKKyAgICA9PT09PSAgID09PT09ICAgICAgICAgICAgID09PT09ICAgPT09PT0KKyAgICAwICAgICAgIE5vbmUgICAgICAgICAgICAgIDEyICAgICAgLSAuIC4gLSAuIC4KKyAgICA3ICAgICAgIC0tLS0tLS0tLS0tICAgICAgIDEzICAgICAgLyAtIC4gLyAtIC4KKyAgICA0ICAgICAgIC4gLiAuIC4gLiAuICAgICAgIDEwICAgICAgLSAuIC0gLiAtIC4KKyAgICAxMSAgICAgIC0gLiAuIC0gLiAuICAgICAgIDggICAgICAgLSAtIC0gLSAtIC0KKyAgICA5ICAgICAgIC0gLiAtIC4gLSAuICAgICAgIDIgICAgICAgLS0tLS0tLS0tLS0KKyAgICAzICAgICAgIC0gLSAtIC0gLSAtICAgICAgIDUgICAgICAgLS0tLS0tLS0tLS0KKyAgICAxICAgICAgIC0tLS0tLS0tLS0tICAgICAgIDYgICAgICAgPT09PT09PT09PT0KKworCitFeGFtcGxlcyBvZiB0aGUgYXZhaWxhYmxlIGJvcmRlciBzdHlsZXMgYXJlIHNob3duIGluIHRoZSAnQm9yZGVycycgd29ya3NoZWV0IGNyZWF0ZWQgYnkgZm9ybWF0cy5wbC4KKworCisKKworPWhlYWQyIHNldF9ib3JkZXJfY29sb3IoKQorCisgICAgQWxzbyBhcHBsaWVzIHRvOiAgICBzZXRfYm90dG9tX2NvbG9yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF90b3BfY29sb3IoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2xlZnRfY29sb3IoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3JpZ2h0X2NvbG9yKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgQ29sb3IgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBVbmRlZmluZWQKKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIFNlZSBzZXRfY29sb3IoKQorCisKK1NldCB0aGUgY29sb3VyIG9mIHRoZSBjZWxsIGJvcmRlcnMuIEEgY2VsbCBib3JkZXIgaXMgY29tcHJpc2VkIG9mIGEgYm9yZGVyIG9uIHRoZSBib3R0b20sIHRvcCwgbGVmdCBhbmQgcmlnaHQuIFRoZXNlIGNhbiBiZSBzZXQgdG8gdGhlIHNhbWUgY29sb3VyIHVzaW5nIEM8c2V0X2JvcmRlcl9jb2xvcigpPiBvciBpbmRpdmlkdWFsbHkgdXNpbmcgdGhlIHJlbGV2YW50IG1ldGhvZCBjYWxscyBzaG93biBhYm92ZS4gRXhhbXBsZXMgb2YgdGhlIGJvcmRlciBzdHlsZXMgYW5kIGNvbG91cnMgYXJlIHNob3duIGluIHRoZSAnQm9yZGVycycgd29ya3NoZWV0IGNyZWF0ZWQgYnkgZm9ybWF0cy5wbC4KKworCisKKworCis9aGVhZDIgY29weSgkZm9ybWF0KQorCisKK1RoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29weSBhbGwgb2YgdGhlIHByb3BlcnRpZXMgZnJvbSBvbmUgRm9ybWF0IG9iamVjdCB0byBhbm90aGVyOgorCisgICAgbXkgJGxvcnJ5MSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRsb3JyeTEtPnNldF9ib2xkKCk7CisgICAgJGxvcnJ5MS0+c2V0X2l0YWxpYygpOworICAgICRsb3JyeTEtPnNldF9jb2xvcigncmVkJyk7ICAgICMgbG9ycnkxIGlzIGJvbGQsIGl0YWxpYyBhbmQgcmVkCisKKyAgICBteSAkbG9ycnkyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGxvcnJ5Mi0+Y29weSgkbG9ycnkxKTsKKyAgICAkbG9ycnkyLT5zZXRfY29sb3IoJ3llbGxvdycpOyAjIGxvcnJ5MiBpcyBib2xkLCBpdGFsaWMgYW5kIHllbGxvdworCitUaGUgQzxjb3B5KCk+IG1ldGhvZCBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBtZXRob2QgaW50ZXJmYWNlIHRvIEZvcm1hdCBwcm9wZXJ0aWVzLiBJdCBnZW5lcmFsbHkgaXNuJ3QgcmVxdWlyZWQgaWYgeW91IGFyZSBzZXR0aW5nIEZvcm1hdCBwcm9wZXJ0aWVzIGRpcmVjdGx5IHVzaW5nIGhhc2hlcy4KKworCitOb3RlOiB0aGlzIGlzIG5vdCBhIGNvcHkgY29uc3RydWN0b3IsIGJvdGggb2JqZWN0cyBtdXN0IGV4aXN0IHByaW9yIHRvIGNvcHlpbmcuCisKKworCisKKz1oZWFkMSBVTklDT0RFIElOIEVYQ0VMCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBicmllZiBpbnRyb2R1Y3Rpb24gdG8gaGFuZGxpbmcgVW5pY29kZSBpbiBDPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4KKworSTxGb3IgYSBtb3JlIGdlbmVyYWwgaW50cm9kdWN0aW9uIHRvIFVuaWNvZGUgaGFuZGxpbmcgaW4gUGVybCBzZWU+IEw8cGVybHVuaXR1dD4gYW5kIEw8cGVybHVuaWludHJvPi4KKworV2hlbiB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0aGUgYmVzdCBhbmQgZWFzaWVzdCB3YXkgdG8gd3JpdGUgdW5pY29kZSBzdHJpbmdzIHRvIGFuIEV4Y2VsIGZpbGUgaXMgdG8gdXNlIEM8VVRGLTg+IGVuY29kZWQgc3RyaW5ncyBhbmQgcGVybCA1LjggKG9yIGxhdGVyKS4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYWxzbyBhbGxvd3MgeW91IHRvIHdyaXRlIHVuaWNvZGUgc3RyaW5ncyB1c2luZyBvbGRlciBwZXJscyBidXQgaXQgZ2VuZXJhbGx5IHJlcXVpcmVzIG1vcmUgd29yaywgYXMgZXhwbGFpbmVkIGJlbG93LgorCitJbnRlcm5hbGx5LCBFeGNlbCBlbmNvZGVzIHVuaWNvZGUgZGF0YSBhcyBDPFVURi0xNkxFPiAod2hlcmUgTEUgbWVhbnMgbGl0dGxlLWVuZGlhbikuIElmIHlvdSBhcmUgdXNpbmcgcGVybCA1LjgrIHRoZW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgd2lsbCBjb252ZXJ0IEM8VVRGLTg+IHN0cmluZ3MgdG8gQzxVVEYtMTZMRT4gd2hlbiByZXF1aXJlZC4gTm8gZnVydGhlciBpbnRlcnZlbnRpb24gaXMgcmVxdWlyZWQgZnJvbSB0aGUgcHJvZ3JhbW1lciwgZm9yIGV4YW1wbGU6CisKKyAgICAjIHBlcmwgNS44KyBleGFtcGxlOgorICAgIG15ICRzbWlsZXkgPSAiXHh7MjYzQX0iOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ0hlbGxvIHdvcmxkJyk7ICMgQVNDSUkKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTInLCAkc21pbGV5KTsgICAgICAgIyBVVEYtOAorCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbHNvIGxldHMgeW91IHdyaXRlIHVuaWNvZGUgZGF0YSBhcyBDPFVURi0xNj4uIFNpbmNlIHRoZSBtYWpvcml0eSBvZiBDUEFOIG1vZHVsZXMgZGVmYXVsdCB0byBDPFVURi0xNkJFPiAoYmlnLWVuZGlhbikgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYWxzbyB1c2VzIEM8VVRGLTE2QkU+IGFuZCBjb252ZXJ0cyBpdCBpbnRlcm5hbGx5IHRvIEM8VVRGLTE2TEU+OgorCisgICAgIyBwZXJsIDUuMDA1IGV4YW1wbGU6CisgICAgbXkgJHNtaWxleSA9IHBhY2sgJ24nLCAweDI2M0E7CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSAgICAgICAgICAgICAgICgnQTMnLCAnSGVsbG8gd29ybGQnKTsgIyBBU0NJSQorICAgICR3b3Jrc2hlZXQtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCdBNCcsICRzbWlsZXkpOyAgICAgICAjIFVURi0xNgorCitBbHRob3VnaCB0aGUgYWJvdmUgZXhhbXBsZXMgbG9vayBzaW1pbGFyIHRoZXJlIGlzIGFuIGltcG9ydGFudCBkaWZmZXJlbmNlLiBXaXRoIEM8dWZ0OD4gYW5kIHBlcmwgNS44KyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0cmVhdHMgQzxVVEYtOD4gc3RyaW5ncyBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBhbnkgb3RoZXIgc3RyaW5nLiBIb3dldmVyLCB3aXRoIEM8VVRGMTY+IGRhdGEgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIG90aGVyIHN0cmluZ3MgZWl0aGVyIGJ5IGNhbGxpbmcgYSBzZXBhcmF0ZSBmdW5jdGlvbiBvciBieSBwYXNzaW5nIGFuIGFkZGl0aW9uYWwgZmxhZyB0byBpbmRpY2F0ZSB0aGUgZGF0YSB0eXBlLgorCitJZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyB0aGF0IGFyZW4ndCBpbiBDPFVURi04PiB0aGVuIHBlcmwgNS44KyBwcm92aWRlcyB1c2VmdWwgdG9vbHMgaW4gdGhlIGd1aXNlIG9mIHRoZSBDPEVuY29kZT4gbW9kdWxlIHRvIGhlbHAgeW91IHRvIGNvbnZlcnQgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC4gRm9yIGV4YW1wbGU6CisKKyAgICB1c2UgRW5jb2RlICdkZWNvZGUnOworCisgICAgbXkgJHN0cmluZyA9ICdzb21lIHN0cmluZyB3aXRoIGtvaTgtciBjaGFyYWN0ZXJzJzsKKyAgICAgICAkc3RyaW5nID0gZGVjb2RlKCdrb2k4LXInLCAkc3RyaW5nKTsgIyBrb2k4LXIgdG8gdXRmOAorCitBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcmVhZCBkYXRhIGZyb20gYW4gZW5jb2RlZCBmaWxlIGFuZCBjb252ZXJ0IGl0IHRvIEM8VVRGLTg+IGFzIHlvdSByZWFkIGl0IGluOgorCisKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlX2tvaThyLnR4dCc7CisgICAgb3BlbiBGSCwgJzw6ZW5jb2Rpbmcoa29pOC1yKScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworCisgICAgbXkgJHJvdyA9IDA7CisgICAgd2hpbGUgKDxGSD4pIHsKKyAgICAgICAgIyBEYXRhIHJlYWQgaW4gaXMgbm93IGluIHV0ZjggZm9ybWF0LgorICAgICAgICBjaG9tcDsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdysrLCAwLCAgJF8pOworICAgIH0KKworVGhlc2UgbWV0aG9kb2xvZ2llcyBhcmUgZXhwbGFpbmVkIGluIG1vcmUgZGV0YWlsIGluIEw8cGVybHVuaXR1dD4sIEw8cGVybHVuaWludHJvPiBhbmQgTDxwZXJsdW5pY29kZT4uCisKK1NlZSBhbHNvIHRoZSBDPHVuaWNvZGVfKi5wbD4gcHJvZ3JhbXMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDEgQ09MT1VSUyBJTiBFWENFTAorCitFeGNlbCBwcm92aWRlcyBhIGNvbG91ciBwYWxldHRlIG9mIDU2IGNvbG91cnMuIEluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRoZXNlIGNvbG91cnMgYXJlIGFjY2Vzc2VkIHZpYSB0aGVpciBwYWxldHRlIGluZGV4IGluIHRoZSByYW5nZSA4Li42My4gVGhpcyBpbmRleCBpcyB1c2VkIHRvIHNldCB0aGUgY29sb3VyIG9mIGZvbnRzLCBjZWxsIHBhdHRlcm5zIGFuZCBjZWxsIGJvcmRlcnMuIEZvciBleGFtcGxlOgorCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9PiAxMiwgIyBpbmRleCBmb3IgYmx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgID0+ICdBcmlhbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgPT4gMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZCAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitUaGUgbW9zdCBjb21tb25seSB1c2VkIGNvbG91cnMgY2FuIGFsc28gYmUgYWNjZXNzZWQgYnkgbmFtZS4gVGhlIG5hbWUgYWN0cyBhcyBhIHNpbXBsZSBhbGlhcyBmb3IgdGhlIGNvbG91ciBpbmRleDoKKworICAgIGJsYWNrICAgICA9PiAgICA4CisgICAgYmx1ZSAgICAgID0+ICAgMTIKKyAgICBicm93biAgICAgPT4gICAxNgorICAgIGN5YW4gICAgICA9PiAgIDE1CisgICAgZ3JheSAgICAgID0+ICAgMjMKKyAgICBncmVlbiAgICAgPT4gICAxNworICAgIGxpbWUgICAgICA9PiAgIDExCisgICAgbWFnZW50YSAgID0+ICAgMTQKKyAgICBuYXZ5ICAgICAgPT4gICAxOAorICAgIG9yYW5nZSAgICA9PiAgIDUzCisgICAgcGluayAgICAgID0+ICAgMzMKKyAgICBwdXJwbGUgICAgPT4gICAyMAorICAgIHJlZCAgICAgICA9PiAgIDEwCisgICAgc2lsdmVyICAgID0+ICAgMjIKKyAgICB3aGl0ZSAgICAgPT4gICAgOQorICAgIHllbGxvdyAgICA9PiAgIDEzCisKK0ZvciBleGFtcGxlOgorCisgICAgbXkgJGZvbnQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoY29sb3IgPT4gJ3JlZCcpOworCitVc2VycyBvZiBWQkEgaW4gRXhjZWwgc2hvdWxkIG5vdGUgdGhhdCB0aGUgZXF1aXZhbGVudCBjb2xvdXIgaW5kaWNlcyBhcmUgaW4gdGhlIHJhbmdlIDEuLjU2IGluc3RlYWQgb2YgOC4uNjMuCisKK0lmIHRoZSBkZWZhdWx0IHBhbGV0dGUgZG9lcyBub3QgcHJvdmlkZSBhIHJlcXVpcmVkIGNvbG91ciB5b3UgY2FuIG92ZXJyaWRlIG9uZSBvZiB0aGUgYnVpbHQtaW4gdmFsdWVzLiBUaGlzIGlzIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSBDPHNldF9jdXN0b21fY29sb3IoKT4gd29ya2Jvb2sgbWV0aG9kIHRvIGFkanVzdCB0aGUgUkdCIChyZWQgZ3JlZW4gYmx1ZSkgY29tcG9uZW50cyBvZiB0aGUgY29sb3VyOgorCisgICAgbXkgJGZlcnJhcmkgPSAkd29ya2Jvb2stPnNldF9jdXN0b21fY29sb3IoNDAsIDIxNiwgMTIsIDEyKTsKKworICAgIG15ICRmb3JtYXQgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnX2NvbG9yID0+ICRmZXJyYXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgPT4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgJHdvcmtzaGVldC0+d3JpdGVfYmxhbmsoJ0ExJywgJGZvcm1hdCk7CisKK1RoZSBkZWZhdWx0IEV4Y2VsIGNvbG91ciBwYWxldHRlIGlzIHNob3duIGluIEM8cGFsZXR0ZS5odG1sPiBpbiB0aGUgQzxkb2NzPiBkaXJlY3RvcnkgIG9mIHRoZSBkaXN0cm8uIFlvdSBjYW4gZ2VuZXJhdGUgYW4gRXhjZWwgdmVyc2lvbiBvZiB0aGUgcGFsZXR0ZSB1c2luZyBDPGNvbG9ycy5wbD4gaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeS4KKworCisKKworPWhlYWQxIERBVEVTIEFORCBUSU1FIElOIEVYQ0VMCisKK1RoZXJlIGFyZSB0d28gaW1wb3J0YW50IHRoaW5ncyB0byB1bmRlcnN0YW5kIGFib3V0IGRhdGVzIGFuZCB0aW1lcyBpbiBFeGNlbDoKKworPW92ZXIgNAorCis9aXRlbSAxIEEgZGF0ZS90aW1lIGluIEV4Y2VsIGlzIGEgcmVhbCBudW1iZXIgcGx1cyBhbiBFeGNlbCBudW1iZXIgZm9ybWF0LgorCis9aXRlbSAyIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvZXNuJ3QgYXV0b21hdGljYWxseSBjb252ZXJ0IGRhdGUvdGltZSBzdHJpbmdzIGluIEM8d3JpdGUoKT4gdG8gYW4gRXhjZWwgZGF0ZS90aW1lLgorCis9YmFjaworCitUaGVzZSB0d28gcG9pbnRzIGFyZSBleHBsYWluZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cgYWxvbmcgd2l0aCBzb21lIHN1Z2dlc3Rpb25zIG9uIGhvdyB0byBjb252ZXJ0IHRpbWVzIGFuZCBkYXRlcyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0LgorCisKKz1oZWFkMiBBbiBFeGNlbCBkYXRlL3RpbWUgaXMgYSBudW1iZXIgcGx1cyBhIGZvcm1hdAorCitJZiB5b3Ugd3JpdGUgYSBkYXRlIHN0cmluZyB3aXRoIEM8d3JpdGUoKT4gdGhlbiBhbGwgeW91IHdpbGwgZ2V0IGlzIGEgc3RyaW5nOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJzAyLzAzLzA0Jyk7ICMgISEgV3JpdGVzIGEgc3RyaW5nIG5vdCBhIGRhdGUuICEhCisKK0RhdGVzIGFuZCB0aW1lcyBpbiBFeGNlbCBhcmUgcmVwcmVzZW50ZWQgYnkgcmVhbCBudW1iZXJzLCBmb3IgZXhhbXBsZSAiSmFuIDEgMjAwMSAxMjozMCBBTSIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIG51bWJlciAzNjg5Mi41MjEuCisKK1RoZSBpbnRlZ2VyIHBhcnQgb2YgdGhlIG51bWJlciBzdG9yZXMgdGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBlcG9jaCBhbmQgdGhlIGZyYWN0aW9uYWwgcGFydCBzdG9yZXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGRheS4KKworQSBkYXRlIG9yIHRpbWUgaW4gRXhjZWwgaXMganVzdCBsaWtlIGFueSBvdGhlciBudW1iZXIuIFRvIGhhdmUgdGhlIG51bWJlciBkaXNwbGF5IGFzIGEgZGF0ZSB5b3UgbXVzdCBhcHBseSBhbiBFeGNlbCBudW1iZXIgZm9ybWF0IHRvIGl0LiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzLgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdkYXRlX2V4YW1wbGVzLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDMwKTsgIyBGb3IgZXh0cmEgdmlzaWJpbGl0eS4KKworICAgIG15ICRudW1iZXIgICAgPSAzOTUwNi41OworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJG51bWJlcik7ICAgICAgICAgICAgIyAgICAgMzk1MDYuNQorCisgICAgbXkgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnZGQvbW0veXknKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTInLCAkbnVtYmVyICwgJGZvcm1hdDIpOyAjICAgICAyOC8wMi8wOAorCisgICAgbXkgJGZvcm1hdDMgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnbW0vZGQveXknKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTMnLCAkbnVtYmVyICwgJGZvcm1hdDMpOyAjICAgICAwMi8yOC8wOAorCisgICAgbXkgJGZvcm1hdDQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnZC1tLXl5eXknKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTQnLCAkbnVtYmVyICwgJGZvcm1hdDQpOyAjICAgICAyOC0yLTIwMDgKKworICAgIG15ICRmb3JtYXQ1ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ2RkL21tL3l5IGhoOm1tJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E1JywgJG51bWJlciAsICRmb3JtYXQ1KTsgIyAgICAgMjgvMDIvMDggMTI6MDAKKworICAgIG15ICRmb3JtYXQ2ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ2QgbW1tIHl5eXknKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTYnLCAkbnVtYmVyICwgJGZvcm1hdDYpOyAjICAgICAyOCBGZWIgMjAwOAorCisgICAgbXkgJGZvcm1hdDcgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnbW1tIGQgeXl5eSBoaDptbSBBTS9QTScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNycsICRudW1iZXIgLCAkZm9ybWF0Nyk7ICMgICAgIEZlYiAyOCAyMDA4IDEyOjAwIFBNCisKKworPWhlYWQyIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvZXNuJ3QgYXV0b21hdGljYWxseSBjb252ZXJ0IGRhdGUvdGltZSBzdHJpbmdzCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvZXNuJ3QgYXV0b21hdGljYWxseSBjb252ZXJ0IGlucHV0IGRhdGUgc3RyaW5ncyBpbnRvIEV4Y2VsJ3MgZm9ybWF0dGVkIGRhdGUgbnVtYmVycyBkdWUgdG8gdGhlIGxhcmdlIG51bWJlciBvZiBwb3NzaWJsZSBkYXRlIGZvcm1hdHMgYW5kIGFsc28gZHVlIHRvIHRoZSBwb3NzaWJpbGl0eSBvZiBtaXNpbnRlcnByZXRhdGlvbi4KKworRm9yIGV4YW1wbGUsIGRvZXMgQzwwMi8wMy8wND4gbWVhbiBNYXJjaCAyIDIwMDQsIEZlYnJ1YXJ5IDMgMjAwNCBvciBldmVuIE1hcmNoIDQgMjAwMi4KKworVGhlcmVmb3JlLCBpbiBvcmRlciB0byBoYW5kbGUgZGF0ZXMgeW91IHdpbGwgaGF2ZSB0byBjb252ZXJ0IHRoZW0gdG8gbnVtYmVycyBhbmQgYXBwbHkgYW4gRXhjZWwgZm9ybWF0LiBTb21lIG1ldGhvZHMgZm9yIGNvbnZlcnRpbmcgZGF0ZXMgYXJlIGxpc3RlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgorCitUaGUgbW9zdCBkaXJlY3Qgd2F5IGlzIHRvIGNvbnZlcnQgeW91ciBkYXRlcyB0byB0aGUgSVNPODYwMSBDPHl5eXktbW0tZGRUaGg6bW06c3Muc3NzPiBkYXRlIGZvcm1hdCBhbmQgdXNlIHRoZSBDPHdyaXRlX2RhdGVfdGltZSgpPiB3b3Jrc2hlZXQgbWV0aG9kOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfZGF0ZV90aW1lKCdBMicsICcyMDAxLTAxLTAxVDEyOjIwJywgJGZvcm1hdCk7CisKK1NlZSB0aGUgQzx3cml0ZV9kYXRlX3RpbWUoKT4gc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorCitBIGdlbmVyYWwgbWV0aG9kb2xvZ3kgZm9yIGhhbmRsaW5nIGRhdGUgc3RyaW5ncyB3aXRoIEM8d3JpdGVfZGF0ZV90aW1lKCk+IGlzOgorCisgICAgMS4gSWRlbnRpZnkgaW5jb21pbmcgZGF0ZS90aW1lIHN0cmluZ3Mgd2l0aCBhIHJlZ2V4LgorICAgIDIuIEV4dHJhY3QgdGhlIGNvbXBvbmVudCBwYXJ0cyBvZiB0aGUgZGF0ZS90aW1lIHVzaW5nIHRoZSBzYW1lIHJlZ2V4LgorICAgIDMuIENvbnZlcnQgdGhlIGRhdGUvdGltZSB0byB0aGUgSVNPODYwMSBmb3JtYXQuCisgICAgNC4gV3JpdGUgdGhlIGRhdGUvdGltZSB1c2luZyB3cml0ZV9kYXRlX3RpbWUoKSBhbmQgYSBudW1iZXIgZm9ybWF0LgorCitIZXJlIGlzIGFuIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZXhhbXBsZS54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ICAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgICMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdCBmb3IgZGF0ZXMuCisgICAgbXkgJGRhdGVfZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ21tbSBkIHl5eXknKTsKKworICAgICMgSW5jcmVhc2UgY29sdW1uIHdpZHRoIHRvIGltcHJvdmUgdmlzaWJpbGl0eSBvZiBkYXRhLgorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QycsIDIwKTsKKworICAgICMgU2ltdWxhdGUgcmVhZGluZyBmcm9tIGEgZGF0YSBzb3VyY2UuCisgICAgbXkgJHJvdyA9IDA7CisKKyAgICB3aGlsZSAoPERBVEE+KSB7CisgICAgICAgIGNob21wOworCisgICAgICAgIG15ICRjb2wgID0gMDsKKyAgICAgICAgbXkgQGRhdGEgPSBzcGxpdCAnICc7CisKKyAgICAgICAgZm9yIG15ICRpdGVtIChAZGF0YSkgeworCisgICAgICAgICAgICAjIE1hdGNoIGRhdGVzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0czogZC9tL3l5LCBkL20veXl5eQorICAgICAgICAgICAgaWYgKCRpdGVtID1+IHFyW14oXGR7MSwyfSkvKFxkezEsMn0pLyhcZHs0fSkkXSkgeworCisgICAgICAgICAgICAgICAgIyBDaGFuZ2UgdG8gdGhlIGRhdGUgZm9ybWF0IHJlcXVpcmVkIGJ5IHdyaXRlX2RhdGVfdGltZSgpLgorICAgICAgICAgICAgICAgIG15ICRkYXRlID0gc3ByaW50ZiAiJTRkLSUwMmQtJTAyZFQiLCAkMywgJDIsICQxOworCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGVfZGF0ZV90aW1lKCRyb3csICRjb2wrKywgJGRhdGUsICRkYXRlX2Zvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAjIEp1c3QgcGxhaW4gZGF0YQorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csICRjb2wrKywgJGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICRyb3crKzsKKyAgICB9CisKKyAgICBfX0RBVEFfXworICAgIEl0ZW0gICAgQ29zdCAgICBEYXRlCisgICAgQm9vayAgICAxMCAgICAgIDEvOS8yMDA3CisgICAgQmVlciAgICA0ICAgICAgIDEyLzkvMjAwNworICAgIEJlZCAgICAgNTAwICAgICA1LzEwLzIwMDcKKworRm9yIGEgc2xpZ2h0bHkgbW9yZSBhZHZhbmNlZCBzb2x1dGlvbiB5b3UgY2FuIG1vZGlmeSB0aGUgQzx3cml0ZSgpPiBtZXRob2QgdG8gaGFuZGxlIGRhdGUgZm9ybWF0cyBvZiB5b3VyIGNob2ljZSB2aWEgdGhlIEM8YWRkX3dyaXRlX2hhbmRsZXIoKT4gbWV0aG9kLiBTZWUgdGhlIEM8YWRkX3dyaXRlX2hhbmRsZXIoKT4gc2VjdGlvbiBvZiB0aGUgZG9jcyBhbmQgdGhlIHdyaXRlX2hhbmRsZXIzLnBsIGFuZCB3cml0ZV9oYW5kbGVyNC5wbCBwcm9ncmFtcyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKKworPWhlYWQyIENvbnZlcnRpbmcgZGF0ZXMgYW5kIHRpbWVzIHRvIGFuIEV4Y2VsIGRhdGUgb3IgdGltZQorCitUaGUgQzx3cml0ZV9kYXRlX3RpbWUoKT4gbWV0aG9kIGFib3ZlIGlzIGp1c3Qgb25lIHdheSBvZiBoYW5kbGluZyBkYXRlcyBhbmQgdGltZXMuCisKK1RoZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5PiBtb2R1bGUgd2hpY2ggaXMgaW5jbHVkZWQgaW4gdGhlIGRpc3RybyBoYXMgZGF0ZS90aW1lIGhhbmRsaW5nIGZ1bmN0aW9uczoKKworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eTsKKworICAgICRkYXRlICAgICAgICAgICA9IHhsX2RhdGVfbGlzdCgyMDAyLCAxLCAxKTsgICAgICAgICAjIDM3MjU3CisgICAgJGRhdGUgICAgICAgICAgID0geGxfcGFyc2VfZGF0ZSgiMTEgSnVseSAxOTk3Iik7ICAgICMgMzU2MjIKKyAgICAkdGltZSAgICAgICAgICAgPSB4bF9wYXJzZV90aW1lKCczOjIxOjM2IFBNJyk7ICAgICAgIyAwLjY0CisgICAgJGRhdGUgICAgICAgICAgID0geGxfZGVjb2RlX2RhdGVfRVUoIjEzIE1heSAyMDAyIik7ICMgMzczODkKKworTm90ZTogc29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgcmVxdWlyZSBhZGRpdGlvbmFsIENQQU4gbW9kdWxlcy4KKworRm9yIGRhdGUgY29udmVyc2lvbnMgdXNpbmcgdGhlIENQQU4gQzxEYXRlVGltZT4gZnJhbWV3b3JrIHNlZSBMPERhdGVUaW1lOjpGb3JtYXQ6OkV4Y2VsPiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc2VhcmNoP2Rpc3Q9RGF0ZVRpbWUtRm9ybWF0LUV4Y2VsPi4KKworCisKKworPWhlYWQxIE9VVExJTkVTIEFORCBHUk9VUElORyBJTiBFWENFTAorCisKK0V4Y2VsIGFsbG93cyB5b3UgdG8gZ3JvdXAgcm93cyBvciBjb2x1bW5zIHNvIHRoYXQgdGhleSBjYW4gYmUgaGlkZGVuIG9yIGRpc3BsYXllZCB3aXRoIGEgc2luZ2xlIG1vdXNlIGNsaWNrLiBUaGlzIGZlYXR1cmUgaXMgcmVmZXJyZWQgdG8gYXMgb3V0bGluZXMuCisKK091dGxpbmVzIGNhbiByZWR1Y2UgY29tcGxleCBkYXRhIGRvd24gdG8gYSBmZXcgc2FsaWVudCBzdWItdG90YWxzIG9yIHN1bW1hcmllcy4KKworVGhpcyBmZWF0dXJlIGlzIGJlc3Qgdmlld2VkIGluIEV4Y2VsIGJ1dCB0aGUgZm9sbG93aW5nIGlzIGFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHdoYXQgYSB3b3Jrc2hlZXQgd2l0aCB0aHJlZSBvdXRsaW5lcyBtaWdodCBsb29rIGxpa2UuIFJvd3MgMy00IGFuZCByb3dzIDctOCBhcmUgZ3JvdXBlZCBhdCBsZXZlbCAyLiBSb3dzIDItOSBhcmUgZ3JvdXBlZCBhdCBsZXZlbCAxLiBUaGUgbGluZXMgYXQgdGhlIGxlZnQgaGFuZCBzaWRlIGFyZSBjYWxsZWQgb3V0bGluZSBsZXZlbCBiYXJzLgorCisKKyAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAxIDIgMyB8ICAgfCAgIEEgICB8ICAgQiAgIHwgICBDICAgfCAgIEQgICB8ICAuLi4KKyAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgXyAgICB8IDEgfCAgIEEgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCAgXyAgfCAyIHwgICBCICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgfCAgIHwgMyB8ICAoQykgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8IHwgICB8IDQgfCAgKEQpICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCAtICAgfCA1IHwgICBFICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgIF8gIHwgNiB8ICAgRiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8IHwgICB8IDcgfCAgKEcpICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCB8ICAgfCA4IHwgIChIKSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgLSAgIHwgOSB8ICAgSSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICAtICAgICB8IC4gfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4KKworCitDbGlja2luZyB0aGUgbWludXMgc2lnbiBvbiBlYWNoIG9mIHRoZSBsZXZlbCAyIG91dGxpbmVzIHdpbGwgY29sbGFwc2UgYW5kIGhpZGUgdGhlIGRhdGEgYXMgc2hvd24gaW4gdGhlIG5leHQgZmlndXJlLiBUaGUgbWludXMgc2lnbiBjaGFuZ2VzIHRvIGEgcGx1cyBzaWduIHRvIGluZGljYXRlIHRoYXQgdGhlIGRhdGEgaW4gdGhlIG91dGxpbmUgaXMgaGlkZGVuLgorCisgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgMSAyIDMgfCAgIHwgICBBICAgfCAgIEIgICB8ICAgQyAgIHwgICBEICAgfCAgLi4uCisgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIF8gICAgfCAxIHwgICBBICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgICAgIHwgMiB8ICAgQiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8ICsgICB8IDUgfCAgIEUgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCAgICAgfCA2IHwgICBGICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgKyAgIHwgOSB8ICAgSSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICAtICAgICB8IC4gfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4KKworCitDbGlja2luZyBvbiB0aGUgbWludXMgc2lnbiBvbiB0aGUgbGV2ZWwgMSBvdXRsaW5lIHdpbGwgY29sbGFwc2UgdGhlIHJlbWFpbmluZyByb3dzIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAxIDIgMyB8ICAgfCAgIEEgICB8ICAgQiAgIHwgICBDICAgfCAgIEQgICB8ICAuLi4KKyAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICB8IDEgfCAgIEEgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgKyAgICAgfCAuIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uCisKKworR3JvdXBpbmcgaW4gQzxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4gaXMgYWNoaWV2ZWQgYnkgc2V0dGluZyB0aGUgb3V0bGluZSBsZXZlbCB2aWEgdGhlIEM8c2V0X3JvdygpPiBhbmQgQzxzZXRfY29sdW1uKCk+IHdvcmtzaGVldCBtZXRob2RzOgorCisgICAgc2V0X3Jvdygkcm93LCAkaGVpZ2h0LCAkZm9ybWF0LCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisgICAgc2V0X2NvbHVtbigkZmlyc3RfY29sLCAkbGFzdF9jb2wsICR3aWR0aCwgJGZvcm1hdCwgJGhpZGRlbiwgJGxldmVsLCAkY29sbGFwc2VkKQorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2V0cyBhbiBvdXRsaW5lIGxldmVsIG9mIDEgZm9yIHJvd3MgMSBhbmQgMiAoemVyby1pbmRleGVkKSBhbmQgY29sdW1ucyBCIHRvIEcuIFRoZSBwYXJhbWV0ZXJzIEM8JGhlaWdodD4gYW5kIEM8JFhGPiBhcmUgYXNzaWduZWQgZGVmYXVsdCB2YWx1ZXMgc2luY2UgdGhleSBhcmUgdW5kZWZpbmVkOgorCisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygxLCB1bmRlZiwgdW5kZWYsIDAsIDEpOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMiwgdW5kZWYsIHVuZGVmLCAwLCAxKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkcnLCB1bmRlZiwgdW5kZWYsIDAsIDEpOworCitFeGNlbCBhbGxvd3MgdXAgdG8gNyBvdXRsaW5lIGxldmVscy4gVGhlcmVmb3JlIHRoZSBDPCRsZXZlbD4gcGFyYW1ldGVyIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgQzwwIEU8bHQ+PSAkbGV2ZWwgRTxsdD49IDc+LgorCitSb3dzIGFuZCBjb2x1bW5zIGNhbiBiZSBjb2xsYXBzZWQgYnkgc2V0dGluZyB0aGUgQzwkaGlkZGVuPiBmbGFnIGZvciB0aGUgaGlkZGVuIHJvd3MvY29sdW1ucyBhbmQgc2V0dGluZyB0aGUgQzwkY29sbGFwc2VkPiBmbGFnIGZvciB0aGUgcm93L2NvbHVtbiB0aGF0IGhhcyB0aGUgY29sbGFwc2VkIEM8Kz4gc3ltYm9sOgorCisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygxLCB1bmRlZiwgdW5kZWYsIDEsIDEpOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMiwgdW5kZWYsIHVuZGVmLCAxLCAxKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDMsIHVuZGVmLCB1bmRlZiwgMCwgMCwgMSk7ICAgICAgICAjIENvbGxhcHNlZCBmbGFnLgorCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQjpHJywgdW5kZWYsIHVuZGVmLCAxLCAxKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdIOkgnLCB1bmRlZiwgdW5kZWYsIDAsIDAsIDEpOyAjIENvbGxhcHNlZCBmbGFnLgorCitOb3RlOiBTZXR0aW5nIHRoZSBDPCRjb2xsYXBzZWQ+IGZsYWcgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE9wZW5PZmZpY2Uub3JnIGFuZCBHbnVtZXJpYy4KKworRm9yIGEgbW9yZSBjb21wbGV0ZSBleGFtcGxlIHNlZSB0aGUgQzxvdXRsaW5lLnBsPiBhbmQgQzxvdXRsaW5lX2NvbGxhcHNlZC5wbD4gcHJvZ3JhbXMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCitTb21lIGFkZGl0aW9uYWwgb3V0bGluZSBwcm9wZXJ0aWVzIGNhbiBiZSBzZXQgdmlhIHRoZSBDPG91dGxpbmVfc2V0dGluZ3MoKT4gd29ya3NoZWV0IG1ldGhvZCwgc2VlIGFib3ZlLgorCisKKworCis9aGVhZDEgREFUQSBWQUxJREFUSU9OIElOIEVYQ0VMCisKK0RhdGEgdmFsaWRhdGlvbiBpcyBhIGZlYXR1cmUgb2YgRXhjZWwgd2hpY2ggYWxsb3dzIHlvdSB0byByZXN0cmljdCB0aGUgZGF0YSB0aGF0IGEgdXNlcnMgZW50ZXJzIGluIGEgY2VsbCBhbmQgdG8gZGlzcGxheSBoZWxwIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLiBJdCBhbHNvIGFsbG93cyB5b3UgdG8gcmVzdHJpY3QgaW5wdXQgdG8gdmFsdWVzIGluIGEgZHJvcCBkb3duIGxpc3QuCisKK0EgdHlwaWNhbCB1c2UgY2FzZSBtaWdodCBiZSB0byByZXN0cmljdCBkYXRhIGluIGEgY2VsbCB0byBpbnRlZ2VyIHZhbHVlcyBpbiBhIGNlcnRhaW4gcmFuZ2UsIHRvIHByb3ZpZGUgYSBoZWxwIG1lc3NhZ2UgdG8gaW5kaWNhdGUgdGhlIHJlcXVpcmVkIHZhbHVlIGFuZCB0byBpc3N1ZSBhIHdhcm5pbmcgaWYgdGhlIGlucHV0IGRhdGEgZG9lc24ndCBtZWV0IHRoZSBzdGF0ZWQgY3JpdGVyaWEuIEluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHdlIGNvdWxkIGRvIHRoYXQgYXMgZm9sbG93czoKKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQjMnLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICAgID0+ICdiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgICA9PiAxLAorICAgICAgICAgICAgbWF4aW11bSAgICAgICAgID0+IDEwMCwKKyAgICAgICAgICAgIGlucHV0X3RpdGxlICAgICA9PiAnSW5wdXQgYW4gaW50ZWdlcjonLAorICAgICAgICAgICAgaW5wdXRfbWVzc2FnZSAgID0+ICdCZXR3ZWVuIDEgYW5kIDEwMCcsCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlICAgPT4gJ1NvcnJ5LCB0cnkgYWdhaW4uJywKKyAgICAgICAgfSk7CisKK1RoZSBhYm92ZSBleGFtcGxlIHdvdWxkIGxvb2sgbGlrZSB0aGlzIGluIEV4Y2VsOiBMPGh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9kYXRhX3ZhbGlkYXRpb24uanBnPi4KKworPWJlZ2luIGh0bWwKKworPGNlbnRlcj4KKzxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvZGF0YV92YWxpZGF0aW9uLmpwZyIgYWx0PSJUaGUgb3V0cHV0IGZyb20gdGhlIGFib3ZlIGV4YW1wbGUiPgorPC9jZW50ZXI+CisKKz1lbmQgaHRtbAorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBkYXRhIHZhbGlkYXRpb24gc2VlIHRoZSBmb2xsb3dpbmcgTWljcm9zb2Z0IHN1cHBvcnQgYXJ0aWNsZSAiRGVzY3JpcHRpb24gYW5kIGV4YW1wbGVzIG9mIGRhdGEgdmFsaWRhdGlvbiBpbiBFeGNlbCI6IEw8aHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8yMTE0ODU+LgorCitUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlIGhvdyB0byB1c2UgdGhlIEM8ZGF0YV92YWxpZGF0aW9uKCk+IG1ldGhvZCBhbmQgaXRzIHZhcmlvdXMgb3B0aW9ucy4KKworCis9aGVhZDIgZGF0YV92YWxpZGF0aW9uKCRyb3csICRjb2wsIHsgcGFyYW1ldGVyID0+ICd2YWx1ZScsIC4uLiB9KQorCitUaGUgQzxkYXRhX3ZhbGlkYXRpb24oKT4gbWV0aG9kIGlzIHVzZWQgdG8gY29uc3RydWN0IGFuIEV4Y2VsIGRhdGEgdmFsaWRhdGlvbi4KKworSXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBzaW5nbGUgY2VsbCBvciBhIHJhbmdlIG9mIGNlbGxzLiBZb3UgY2FuIHBhc3MgMyBwYXJhbWV0ZXJzIHN1Y2ggYXMgIEM8KCRyb3csICRjb2wsIHsuLi59KT4gb3IgNSBwYXJhbWV0ZXJzIHN1Y2ggYXMgQzwoJGZpcnN0X3JvdywgJGZpcnN0X2NvbCwgJGxhc3Rfcm93LCAkbGFzdF9jb2wsIHsuLi59KT4uIFlvdSBjYW4gYWxzbyB1c2UgQzxBMT4gc3R5bGUgbm90YXRpb24uIEZvciBleGFtcGxlOgorCisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKDAsIDAsICAgICAgIHsuLi59KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oMCwgMCwgNCwgMSwgey4uLn0pOworCisgICAgIyBXaGljaCBhcmUgdGhlIHNhbWUgYXM6CisKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJ0ExJywgICAgICAgey4uLn0pOworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQTE6QjUnLCAgICB7Li4ufSk7CisKK1NlZSBhbHNvIHRoZSBub3RlIGFib3V0IEw8Q2VsbCBub3RhdGlvbj4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKworVGhlIGxhc3QgcGFyYW1ldGVyIGluIEM8ZGF0YV92YWxpZGF0aW9uKCk+IG11c3QgYmUgYSBoYXNoIHJlZiBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHRoYXQgZGVzY3JpYmUgdGhlIHR5cGUgYW5kIHN0eWxlIG9mIHRoZSBkYXRhIHZhbGlkYXRpb24uIFRoZSBhbGxvd2FibGUgcGFyYW1ldGVycyBhcmU6CisKKyAgICB2YWxpZGF0ZQorICAgIGNyaXRlcmlhCisgICAgdmFsdWUgfCBtaW5pbXVtIHwgc291cmNlCisgICAgbWF4aW11bQorICAgIGlnbm9yZV9ibGFuaworICAgIGRyb3Bkb3duCisKKyAgICBpbnB1dF90aXRsZQorICAgIGlucHV0X21lc3NhZ2UKKyAgICBzaG93X2lucHV0CisKKyAgICBlcnJvcl90aXRsZQorICAgIGVycm9yX21lc3NhZ2UKKyAgICBlcnJvcl90eXBlCisgICAgc2hvd19lcnJvcgorCitUaGVzZSBwYXJhbWV0ZXJzIGFyZSBleHBsYWluZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4gTW9zdCBvZiB0aGUgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwsIGhvd2V2ZXIsIHlvdSB3aWxsIGdlbmVyYWxseSByZXF1aXJlIHRoZSB0aHJlZSBtYWluIG9wdGlvbnMgQzx2YWxpZGF0ZT4sIEM8Y3JpdGVyaWE+IGFuZCBDPHZhbHVlPi4KKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQjMnLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSA9PiAnPicsCisgICAgICAgICAgICB2YWx1ZSAgICA9PiAxMDAsCisgICAgICAgIH0pOworCitUaGUgQzxkYXRhX3ZhbGlkYXRpb24+IG1ldGhvZCByZXR1cm5zOgorCisgICAgIDAgZm9yIHN1Y2Nlc3MuCisgICAgLTEgZm9yIGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgIC0yIGZvciByb3cgb3IgY29sdW1uIG91dCBvZiBib3VuZHMuCisgICAgLTMgZm9yIGluY29ycmVjdCBwYXJhbWV0ZXIgb3IgdmFsdWUuCisKKworPWhlYWQyIHZhbGlkYXRlCisKK1RoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiBhIGhhc2ggcmVmIHRvIEM8ZGF0YV92YWxpZGF0aW9uKCk+LgorCitUaGUgQzx2YWxpZGF0ZT4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gc2V0IHRoZSB0eXBlIG9mIGRhdGEgdGhhdCB5b3Ugd2lzaCB0byB2YWxpZGF0ZS4gSXQgaXMgYWx3YXlzIHJlcXVpcmVkIGFuZCBpdCBoYXMgbm8gZGVmYXVsdCB2YWx1ZS4gQWxsb3dhYmxlIHZhbHVlcyBhcmU6CisKKyAgICBhbnkKKyAgICBpbnRlZ2VyCisgICAgZGVjaW1hbAorICAgIGxpc3QKKyAgICBkYXRlCisgICAgdGltZQorICAgIGxlbmd0aAorICAgIGN1c3RvbQorCis9b3ZlcgorCis9aXRlbSAqIEI8YW55PiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhhdCB0aGUgdHlwZSBvZiBkYXRhIGlzIHVucmVzdHJpY3RlZC4gVGhpcyBpcyB0aGUgc2FtZSBhcyBub3QgYXBwbHlpbmcgYSBkYXRhIHZhbGlkYXRpb24uIEl0IGlzIG9ubHkgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcyBhbmQgaXNuJ3QgdXNlZCB2ZXJ5IG9mdGVuIGluIHRoZSBjb250ZXh0IG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aXRlbSAqIEI8aW50ZWdlcj4gcmVzdHJpY3RzIHRoZSBjZWxsIHRvIGludGVnZXIgdmFsdWVzLiBFeGNlbCByZWZlcnMgdG8gdGhpcyBhcyAnd2hvbGUgbnVtYmVyJy4KKworICAgIHZhbGlkYXRlID0+ICdpbnRlZ2VyJywKKyAgICBjcml0ZXJpYSA9PiAnPicsCisgICAgdmFsdWUgICAgPT4gMTAwLAorCis9aXRlbSAqIEI8ZGVjaW1hbD4gcmVzdHJpY3RzIHRoZSBjZWxsIHRvIGRlY2ltYWwgdmFsdWVzLgorCisgICAgdmFsaWRhdGUgPT4gJ2RlY2ltYWwnLAorICAgIGNyaXRlcmlhID0+ICc+JywKKyAgICB2YWx1ZSAgICA9PiAzOC42LAorCis9aXRlbSAqIEI8bGlzdD4gcmVzdHJpY3RzIHRoZSBjZWxsIHRvIGEgc2V0IG9mIHVzZXIgc3BlY2lmaWVkIHZhbHVlcy4gVGhlc2UgY2FuIGJlIHBhc3NlZCBpbiBhbiBhcnJheSByZWYgb3IgYXMgYSBjZWxsIHJhbmdlIChuYW1lZCByYW5nZXMgYXJlbid0IGN1cnJlbnRseSBzdXBwb3J0ZWQpOgorCisgICAgdmFsaWRhdGUgPT4gJ2xpc3QnLAorICAgIHZhbHVlICAgID0+IFsnb3BlbicsICdoaWdoJywgJ2Nsb3NlJ10sCisgICAgIyBPciBsaWtlIHRoaXM6CisgICAgdmFsdWUgICAgPT4gJ0IxOkIzJywKKworRXhjZWwgcmVxdWlyZXMgdGhhdCByYW5nZSByZWZlcmVuY2VzIGFyZSBvbmx5IHRvIGNlbGxzIG9uIHRoZSBzYW1lIHdvcmtzaGVldC4KKworPWl0ZW0gKiBCPGRhdGU+IHJlc3RyaWN0cyB0aGUgY2VsbCB0byBkYXRlIHZhbHVlcy4gRGF0ZXMgaW4gRXhjZWwgYXJlIGV4cHJlc3NlZCBhcyBpbnRlZ2VyIHZhbHVlcyBidXQgeW91IGNhbiBhbHNvIHBhc3MgYW4gSVNPODYwIHN0eWxlIHN0cmluZyBhcyB1c2VkIGluIEM8d3JpdGVfZGF0ZV90aW1lKCk+LiBTZWUgYWxzbyBMPERBVEVTIEFORCBUSU1FIElOIEVYQ0VMPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3b3JraW5nIHdpdGggRXhjZWwncyBkYXRlcy4KKworICAgIHZhbGlkYXRlID0+ICdkYXRlJywKKyAgICBjcml0ZXJpYSA9PiAnPicsCisgICAgdmFsdWUgICAgPT4gMzk2NTMsICMgMjQgSnVseSAyMDA4CisgICAgIyBPciBsaWtlIHRoaXM6CisgICAgdmFsdWUgICAgPT4gJzIwMDgtMDctMjRUJywKKworPWl0ZW0gKiBCPHRpbWU+IHJlc3RyaWN0cyB0aGUgY2VsbCB0byB0aW1lIHZhbHVlcy4gVGltZXMgaW4gRXhjZWwgYXJlIGV4cHJlc3NlZCBhcyBkZWNpbWFsIHZhbHVlcyBidXQgeW91IGNhbiBhbHNvIHBhc3MgYW4gSVNPODYwIHN0eWxlIHN0cmluZyBhcyB1c2VkIGluIEM8d3JpdGVfZGF0ZV90aW1lKCk+LiBTZWUgYWxzbyBMPERBVEVTIEFORCBUSU1FIElOIEVYQ0VMPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3b3JraW5nIHdpdGggRXhjZWwncyB0aW1lcy4KKworICAgIHZhbGlkYXRlID0+ICd0aW1lJywKKyAgICBjcml0ZXJpYSA9PiAnPicsCisgICAgdmFsdWUgICAgPT4gMC41LCAjIE5vb24KKyAgICAjIE9yIGxpa2UgdGhpczoKKyAgICB2YWx1ZSAgICA9PiAnVDEyOjAwOjAwJywKKworPWl0ZW0gKiBCPGxlbmd0aD4gcmVzdHJpY3RzIHRoZSBjZWxsIGRhdGEgYmFzZWQgb24gYW4gaW50ZWdlciBzdHJpbmcgbGVuZ3RoLiBFeGNlbCByZWZlcnMgdG8gdGhpcyBhcyAnVGV4dCBsZW5ndGgnLgorCisgICAgdmFsaWRhdGUgPT4gJ2xlbmd0aCcsCisgICAgY3JpdGVyaWEgPT4gJz4nLAorICAgIHZhbHVlICAgID0+IDEwLAorCis9aXRlbSAqIEI8Y3VzdG9tPiByZXN0cmljdHMgdGhlIGNlbGwgYmFzZWQgb24gYW4gZXh0ZXJuYWwgRXhjZWwgZm9ybXVsYSB0aGF0IHJldHVybnMgYSBDPFRSVUUvRkFMU0U+IHZhbHVlLgorCisgICAgdmFsaWRhdGUgPT4gJ2N1c3RvbScsCisgICAgdmFsdWUgICAgPT4gJz1JRihBMTA+QjEwLFRSVUUsRkFMU0UpJywKKworPWJhY2sKKworCis9aGVhZDIgY3JpdGVyaWEKKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPGNyaXRlcmlhPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZXQgdGhlIGNyaXRlcmlhIGJ5IHdoaWNoIHRoZSBkYXRhIGluIHRoZSBjZWxsIGlzIHZhbGlkYXRlZC4gSXQgaXMgYWxtb3N0IGFsd2F5cyByZXF1aXJlZCBleGNlcHQgZm9yIHRoZSBDPGxpc3Q+IGFuZCBDPGN1c3RvbT4gdmFsaWRhdGUgb3B0aW9ucy4gSXQgaGFzIG5vIGRlZmF1bHQgdmFsdWUuIEFsbG93YWJsZSB2YWx1ZXMgYXJlOgorCisgICAgJ2JldHdlZW4nCisgICAgJ25vdCBiZXR3ZWVuJworICAgICdlcXVhbCB0bycgICAgICAgICAgICAgICAgICB8ICAnPT0nICB8ICAnPScKKyAgICAnbm90IGVxdWFsIHRvJyAgICAgICAgICAgICAgfCAgJyE9JyAgfCAgJzw+JworICAgICdncmVhdGVyIHRoYW4nICAgICAgICAgICAgICB8ICAnPicKKyAgICAnbGVzcyB0aGFuJyAgICAgICAgICAgICAgICAgfCAgJzwnCisgICAgJ2dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bycgIHwgICc+PScKKyAgICAnbGVzcyB0aGFuIG9yIGVxdWFsIHRvJyAgICAgfCAgJzw9JworCitZb3UgY2FuIGVpdGhlciB1c2UgRXhjZWwncyB0ZXh0dWFsIGRlc2NyaXB0aW9uIHN0cmluZ3MsIGluIHRoZSBmaXJzdCBjb2x1bW4gYWJvdmUsIG9yIHRoZSBtb3JlIGNvbW1vbiBvcGVyYXRvciBhbHRlcm5hdGl2ZXMuIFRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6CisKKyAgICB2YWxpZGF0ZSA9PiAnaW50ZWdlcicsCisgICAgY3JpdGVyaWEgPT4gJ2dyZWF0ZXIgdGhhbicsCisgICAgdmFsdWUgICAgPT4gMTAwLAorCisgICAgdmFsaWRhdGUgPT4gJ2ludGVnZXInLAorICAgIGNyaXRlcmlhID0+ICc+JywKKyAgICB2YWx1ZSAgICA9PiAxMDAsCisKK1RoZSBDPGxpc3Q+IGFuZCBDPGN1c3RvbT4gdmFsaWRhdGUgb3B0aW9ucyBkb24ndCByZXF1aXJlIGEgQzxjcml0ZXJpYT4uIElmIHlvdSBzcGVjaWZ5IG9uZSBpdCB3aWxsIGJlIGlnbm9yZWQuCisKKyAgICB2YWxpZGF0ZSA9PiAnbGlzdCcsCisgICAgdmFsdWUgICAgPT4gWydvcGVuJywgJ2hpZ2gnLCAnY2xvc2UnXSwKKworICAgIHZhbGlkYXRlID0+ICdjdXN0b20nLAorICAgIHZhbHVlICAgID0+ICc9SUYoQTEwPkIxMCxUUlVFLEZBTFNFKScsCisKKworPWhlYWQyIHZhbHVlIHwgbWluaW11bSB8IHNvdXJjZQorCitUaGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gYSBoYXNoIHJlZiB0byBDPGRhdGFfdmFsaWRhdGlvbigpPi4KKworVGhlIEM8dmFsdWU+IHBhcmFtZXRlciBpcyB1c2VkIHRvIHNldCB0aGUgbGltaXRpbmcgdmFsdWUgdG8gd2hpY2ggdGhlIEM8Y3JpdGVyaWE+IGlzIGFwcGxpZWQuIEl0IGlzIGFsd2F5cyByZXF1aXJlZCBhbmQgaXQgaGFzIG5vIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyB1c2UgdGhlIHN5bm9ueW1zIEM8bWluaW11bT4gb3IgQzxzb3VyY2U+IHRvIG1ha2UgdGhlIHZhbGlkYXRpb24gYSBsaXR0bGUgY2xlYXJlciBhbmQgY2xvc2VyIHRvIEV4Y2VsJ3MgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcjoKKworICAgICMgVXNlICd2YWx1ZScKKyAgICB2YWxpZGF0ZSA9PiAnaW50ZWdlcicsCisgICAgY3JpdGVyaWEgPT4gJz4nLAorICAgIHZhbHVlICAgID0+IDEwMCwKKworICAgICMgVXNlICdtaW5pbXVtJworICAgIHZhbGlkYXRlID0+ICdpbnRlZ2VyJywKKyAgICBjcml0ZXJpYSA9PiAnYmV0d2VlbicsCisgICAgbWluaW11bSAgPT4gMSwKKyAgICBtYXhpbXVtICA9PiAxMDAsCisKKyAgICAjIFVzZSAnc291cmNlJworICAgIHZhbGlkYXRlID0+ICdsaXN0JywKKyAgICBzb3VyY2UgICA9PiAnQjE6QjMnLAorCisKKz1oZWFkMiBtYXhpbXVtCisKK1RoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiBhIGhhc2ggcmVmIHRvIEM8ZGF0YV92YWxpZGF0aW9uKCk+LgorCitUaGUgQzxtYXhpbXVtPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZXQgdGhlIHVwcGVyIGxpbWl0aW5nIHZhbHVlIHdoZW4gdGhlIEM8Y3JpdGVyaWE+IGlzIGVpdGhlciBDPCdiZXR3ZWVuJz4gb3IgQzwnbm90IGJldHdlZW4nPjoKKworICAgIHZhbGlkYXRlID0+ICdpbnRlZ2VyJywKKyAgICBjcml0ZXJpYSA9PiAnYmV0d2VlbicsCisgICAgbWluaW11bSAgPT4gMSwKKyAgICBtYXhpbXVtICA9PiAxMDAsCisKKworPWhlYWQyIGlnbm9yZV9ibGFuaworCitUaGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gYSBoYXNoIHJlZiB0byBDPGRhdGFfdmFsaWRhdGlvbigpPi4KKworVGhlIEM8aWdub3JlX2JsYW5rPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0b2dnbGUgb24gYW5kIG9mZiB0aGUgJ0lnbm9yZSBibGFuaycgb3B0aW9uIGluIHRoZSBFeGNlbCBkYXRhIHZhbGlkYXRpb24gZGlhbG9nLiBXaGVuIHRoZSBvcHRpb24gaXMgb24gdGhlIGRhdGEgdmFsaWRhdGlvbiBpcyBub3QgYXBwbGllZCB0byBibGFuayBkYXRhIGluIHRoZSBjZWxsLiBJdCBpcyBvbiBieSBkZWZhdWx0LgorCisgICAgaWdub3JlX2JsYW5rID0+IDAsICAjIFR1cm4gdGhlIG9wdGlvbiBvZmYKKworCis9aGVhZDIgZHJvcGRvd24KKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPGRyb3Bkb3duPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0b2dnbGUgb24gYW5kIG9mZiB0aGUgJ0luLWNlbGwgZHJvcGRvd24nIG9wdGlvbiBpbiB0aGUgRXhjZWwgZGF0YSB2YWxpZGF0aW9uIGRpYWxvZy4gV2hlbiB0aGUgb3B0aW9uIGlzIG9uIGEgZHJvcGRvd24gbGlzdCB3aWxsIGJlIHNob3duIGZvciBDPGxpc3Q+IHZhbGlkYXRpb25zLiBJdCBpcyBvbiBieSBkZWZhdWx0LgorCisgICAgZHJvcGRvd24gPT4gMCwgICAgICAjIFR1cm4gdGhlIG9wdGlvbiBvZmYKKworCis9aGVhZDIgaW5wdXRfdGl0bGUKKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPGlucHV0X3RpdGxlPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZXQgdGhlIHRpdGxlIG9mIHRoZSBpbnB1dCBtZXNzYWdlIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gYSBjZWxsIGlzIGVudGVyZWQuIEl0IGhhcyBubyBkZWZhdWx0IHZhbHVlIGFuZCBpcyBvbmx5IGRpc3BsYXllZCBpZiB0aGUgaW5wdXQgbWVzc2FnZSBpcyBkaXNwbGF5ZWQuIFNlZSB0aGUgQzxpbnB1dF9tZXNzYWdlPiBwYXJhbWV0ZXIgYmVsb3cuCisKKyAgICBpbnB1dF90aXRsZSAgID0+ICdUaGlzIGlzIHRoZSBpbnB1dCB0aXRsZScsCisKK1RoZSBtYXhpbXVtIHRpdGxlIGxlbmd0aCBpcyAzMiBjaGFyYWN0ZXJzLiBVVEY4IHN0cmluZ3MgYXJlIGhhbmRsZWQgYXV0b21hdGljYWxseSBpbiBwZXJsIDUuOCBhbmQgbGF0ZXIuCisKKworPWhlYWQyIGlucHV0X21lc3NhZ2UKKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPGlucHV0X21lc3NhZ2U+IHBhcmFtZXRlciBpcyB1c2VkIHRvIHNldCB0aGUgaW5wdXQgbWVzc2FnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGEgY2VsbCBpcyBlbnRlcmVkLiBJdCBoYXMgbm8gZGVmYXVsdCB2YWx1ZS4KKworICAgIHZhbGlkYXRlICAgICAgPT4gJ2ludGVnZXInLAorICAgIGNyaXRlcmlhICAgICAgPT4gJ2JldHdlZW4nLAorICAgIG1pbmltdW0gICAgICAgPT4gMSwKKyAgICBtYXhpbXVtICAgICAgID0+IDEwMCwKKyAgICBpbnB1dF90aXRsZSAgID0+ICdFbnRlciB0aGUgYXBwbGllZCBkaXNjb3VudDonLAorICAgIGlucHV0X21lc3NhZ2UgPT4gJ2JldHdlZW4gMSBhbmQgMTAwJywKKworVGhlIG1lc3NhZ2UgY2FuIGJlIHNwbGl0IG92ZXIgc2V2ZXJhbCBsaW5lcyB1c2luZyBuZXdsaW5lcywgQzwiXG4iPiBpbiBkb3VibGUgcXVvdGVkIHN0cmluZ3MuCisKKyAgICBpbnB1dF9tZXNzYWdlID0+ICJUaGlzIGlzXG5hIHRlc3QuIiwKKworVGhlIG1heGltdW0gbWVzc2FnZSBsZW5ndGggaXMgMjU1IGNoYXJhY3RlcnMuIFVURjggc3RyaW5ncyBhcmUgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGluIHBlcmwgNS44IGFuZCBsYXRlci4KKworCis9aGVhZDIgc2hvd19pbnB1dAorCitUaGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gYSBoYXNoIHJlZiB0byBDPGRhdGFfdmFsaWRhdGlvbigpPi4KKworVGhlIEM8c2hvd19pbnB1dD4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gdG9nZ2xlIG9uIGFuZCBvZmYgdGhlICdTaG93IGlucHV0IG1lc3NhZ2Ugd2hlbiBjZWxsIGlzIHNlbGVjdGVkJyBvcHRpb24gaW4gdGhlIEV4Y2VsIGRhdGEgdmFsaWRhdGlvbiBkaWFsb2cuIFdoZW4gdGhlIG9wdGlvbiBpcyBvZmYgYW4gaW5wdXQgbWVzc2FnZSBpcyBub3QgZGlzcGxheWVkIGV2ZW4gaWYgaXQgaGFzIGJlZW4gc2V0IHVzaW5nIEM8aW5wdXRfbWVzc2FnZT4uIEl0IGlzIG9uIGJ5IGRlZmF1bHQuCisKKyAgICBzaG93X2lucHV0ID0+IDAsICAgICAgIyBUdXJuIHRoZSBvcHRpb24gb2ZmCisKKworPWhlYWQyIGVycm9yX3RpdGxlCisKK1RoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiBhIGhhc2ggcmVmIHRvIEM8ZGF0YV92YWxpZGF0aW9uKCk+LgorCitUaGUgQzxlcnJvcl90aXRsZT4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gc2V0IHRoZSB0aXRsZSBvZiB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIHRoZSBkYXRhIHZhbGlkYXRpb24gY3JpdGVyaWEgaXMgbm90IG1ldC4gVGhlIGRlZmF1bHQgZXJyb3IgdGl0bGUgaXMgJ01pY3Jvc29mdCBFeGNlbCcuCisKKyAgICBlcnJvcl90aXRsZSAgID0+ICdJbnB1dCB2YWx1ZSBpcyBub3QgdmFsaWQnLAorCitUaGUgbWF4aW11bSB0aXRsZSBsZW5ndGggaXMgMzIgY2hhcmFjdGVycy4gVVRGOCBzdHJpbmdzIGFyZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgaW4gcGVybCA1LjggYW5kIGxhdGVyLgorCisKKz1oZWFkMiBlcnJvcl9tZXNzYWdlCisKK1RoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiBhIGhhc2ggcmVmIHRvIEM8ZGF0YV92YWxpZGF0aW9uKCk+LgorCitUaGUgQzxlcnJvcl9tZXNzYWdlPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZXQgdGhlIGVycm9yIG1lc3NhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiBhIGNlbGwgaXMgZW50ZXJlZC4gVGhlIGRlZmF1bHQgZXJyb3IgbWVzc2FnZSBpcyAiVGhlIHZhbHVlIHlvdSBlbnRlcmVkIGlzIG5vdCB2YWxpZC5cbkEgdXNlciBoYXMgcmVzdHJpY3RlZCB2YWx1ZXMgdGhhdCBjYW4gYmUgZW50ZXJlZCBpbnRvIHRoZSBjZWxsLiIuCisKKyAgICB2YWxpZGF0ZSAgICAgID0+ICdpbnRlZ2VyJywKKyAgICBjcml0ZXJpYSAgICAgID0+ICdiZXR3ZWVuJywKKyAgICBtaW5pbXVtICAgICAgID0+IDEsCisgICAgbWF4aW11bSAgICAgICA9PiAxMDAsCisgICAgZXJyb3JfdGl0bGUgICA9PiAnSW5wdXQgdmFsdWUgaXMgbm90IHZhbGlkJywKKyAgICBlcnJvcl9tZXNzYWdlID0+ICdJdCBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCcsCisKK1RoZSBtZXNzYWdlIGNhbiBiZSBzcGxpdCBvdmVyIHNldmVyYWwgbGluZXMgdXNpbmcgbmV3bGluZXMsIEM8IlxuIj4gaW4gZG91YmxlIHF1b3RlZCBzdHJpbmdzLgorCisgICAgaW5wdXRfbWVzc2FnZSA9PiAiVGhpcyBpc1xuYSB0ZXN0LiIsCisKK1RoZSBtYXhpbXVtIG1lc3NhZ2UgbGVuZ3RoIGlzIDI1NSBjaGFyYWN0ZXJzLiBVVEY4IHN0cmluZ3MgYXJlIGhhbmRsZWQgYXV0b21hdGljYWxseSBpbiBwZXJsIDUuOCBhbmQgbGF0ZXIuCisKKworPWhlYWQyIGVycm9yX3R5cGUKKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPGVycm9yX3R5cGU+IHBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgZXJyb3IgZGlhbG9nIHRoYXQgaXMgZGlzcGxheWVkLiBUaGVyZSBhcmUgMyBvcHRpb25zOgorCisgICAgJ3N0b3AnCisgICAgJ3dhcm5pbmcnCisgICAgJ2luZm9ybWF0aW9uJworCitUaGUgZGVmYXVsdCBpcyBDPCdzdG9wJz4uCisKKworPWhlYWQyIHNob3dfZXJyb3IKKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPHNob3dfZXJyb3I+IHBhcmFtZXRlciBpcyB1c2VkIHRvIHRvZ2dsZSBvbiBhbmQgb2ZmIHRoZSAnU2hvdyBlcnJvciBhbGVydCBhZnRlciBpbnZhbGlkIGRhdGEgaXMgZW50ZXJlZCcgb3B0aW9uIGluIHRoZSBFeGNlbCBkYXRhIHZhbGlkYXRpb24gZGlhbG9nLiBXaGVuIHRoZSBvcHRpb24gaXMgb2ZmIGFuIGVycm9yIG1lc3NhZ2UgaXMgbm90IGRpc3BsYXllZCBldmVuIGlmIGl0IGhhcyBiZWVuIHNldCB1c2luZyBDPGVycm9yX21lc3NhZ2U+LiBJdCBpcyBvbiBieSBkZWZhdWx0LgorCisgICAgc2hvd19lcnJvciA9PiAwLCAgICAgICMgVHVybiB0aGUgb3B0aW9uIG9mZgorCis9aGVhZDIgRGF0YSBWYWxpZGF0aW9uIEV4YW1wbGVzCisKK0V4YW1wbGUgMS4gTGltaXRpbmcgaW5wdXQgdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gYSBmaXhlZCB2YWx1ZS4KKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQTEnLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICAgID0+ICc+JywKKyAgICAgICAgICAgIHZhbHVlICAgICAgICAgICA9PiAwLAorICAgICAgICB9KTsKKworRXhhbXBsZSAyLiBMaW1pdGluZyBpbnB1dCB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBhIGZpeGVkIHZhbHVlIHdoZXJlIHRoZSB2YWx1ZSBpcyByZWZlcmVuY2VkIGZyb20gYSBjZWxsLgorCisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCdBMicsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJz4nLAorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgID0+ICc9RTMnLAorICAgICAgICB9KTsKKworRXhhbXBsZSAzLiBMaW1pdGluZyBpbnB1dCB0byBhIGRlY2ltYWwgaW4gYSBmaXhlZCByYW5nZS4KKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQTMnLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2RlY2ltYWwnLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICAgID0+ICdiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgICA9PiAwLjEsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgICAgPT4gMC41LAorICAgICAgICB9KTsKKworRXhhbXBsZSA0LiBMaW1pdGluZyBpbnB1dCB0byBhIHZhbHVlIGluIGEgZHJvcGRvd24gbGlzdC4KKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQTQnLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2xpc3QnLAorICAgICAgICAgICAgc291cmNlICAgICAgICAgID0+IFsnb3BlbicsICdoaWdoJywgJ2Nsb3NlJ10sCisgICAgICAgIH0pOworCitFeGFtcGxlIDUuIExpbWl0aW5nIGlucHV0IHRvIGEgdmFsdWUgaW4gYSBkcm9wZG93biBsaXN0IHdoZXJlIHRoZSBsaXN0IGlzIHNwZWNpZmllZCBhcyBhIGNlbGwgcmFuZ2UuCisKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJ0E1JywKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdsaXN0JywKKyAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICA9PiAnPUU0Okc0JywKKyAgICAgICAgfSk7CisKK0V4YW1wbGUgNi4gTGltaXRpbmcgaW5wdXQgdG8gYSBkYXRlIGluIGEgZml4ZWQgcmFuZ2UuCisKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJ0E2JywKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdkYXRlJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgICAgPT4gJzIwMDgtMDEtMDFUJywKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgICA9PiAnMjAwOC0xMi0xMlQnLAorICAgICAgICB9KTsKKworRXhhbXBsZSA3LiBEaXNwbGF5aW5nIGEgbWVzc2FnZSB3aGVuIHRoZSBjZWxsIGlzIHNlbGVjdGVkLgorCisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCdBNycsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgID0+IDEsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgID0+IDEwMCwKKyAgICAgICAgICAgIGlucHV0X3RpdGxlICAgPT4gJ0VudGVyIGFuIGludGVnZXI6JywKKyAgICAgICAgICAgIGlucHV0X21lc3NhZ2UgPT4gJ2JldHdlZW4gMSBhbmQgMTAwJywKKyAgICAgICAgfSk7CisKK1NlZSBhbHNvIHRoZSBDPGRhdGFfdmFsaWRhdGUucGw+IHByb2dyYW0gaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDEgRk9STVVMQVMgQU5EIEZVTkNUSU9OUyBJTiBFWENFTAorCisKKz1oZWFkMiBDYXZlYXRzCisKK1RoZSBmaXJzdCB0aGluZyB0byBub3RlIGlzIHRoYXQgdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3V0c3RhbmRpbmcgaXNzdWVzIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIGZvcm11bGFzIGFuZCBmdW5jdGlvbnM6CisKKyAgICAxLiBXcml0aW5nIGEgZm9ybXVsYSBpcyBtdWNoIHNsb3dlciB0aGFuIHdyaXRpbmcgdGhlIGVxdWl2YWxlbnQgc3RyaW5nLgorICAgIDIuIFlvdSBjYW5ub3QgdXNlIGFycmF5IGNvbnN0YW50cywgaS5lLiB7MTsyOzN9LCBpbiBmdW5jdGlvbnMuCisgICAgMy4gVW5hcnkgbWludXMgaXNuJ3Qgc3VwcG9ydGVkLgorICAgIDQuIFdoaXRlc3BhY2UgaXMgbm90IHByZXNlcnZlZCBhcm91bmQgb3BlcmF0b3JzLgorICAgIDUuIE5hbWVkIHJhbmdlcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICA2LiBBcnJheSBmb3JtdWxhcyBhcmUgbm90IHN1cHBvcnRlZC4KKworSG93ZXZlciwgdGhlc2UgY29uc3RyYWludHMgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gVGhleSBhcmUgaGVyZSBiZWNhdXNlIG9mIGEgdHJhZGUtb2ZmIGJldHdlZW4gZmVhdHVyZXMgYW5kIHRpbWUuIEFsc28sIGl0IGlzIHBvc3NpYmxlIHRvIHdvcmsgYXJvdW5kIGlzc3VlIDEgdXNpbmcgdGhlIEM8c3RvcmVfZm9ybXVsYSgpPiBhbmQgQzxyZXBlYXRfZm9ybXVsYSgpPiBtZXRob2RzIGFzIGRlc2NyaWJlZCBsYXRlciBpbiB0aGlzIHNlY3Rpb24uCisKKworCis9aGVhZDIgSW50cm9kdWN0aW9uCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBicmllZiBpbnRyb2R1Y3Rpb24gdG8gZm9ybXVsYXMgYW5kIGZ1bmN0aW9ucyBpbiBFeGNlbCBhbmQgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK0EgZm9ybXVsYSBpcyBhIHN0cmluZyB0aGF0IGJlZ2lucyB3aXRoIGFuIGVxdWFscyBzaWduOgorCisgICAgJz1BMStCMScKKyAgICAnPUFWRVJBR0UoMSwgMiwgMyknCisKK1RoZSBmb3JtdWxhIGNhbiBjb250YWluIG51bWJlcnMsIHN0cmluZ3MsIGJvb2xlYW4gdmFsdWVzLCBjZWxsIHJlZmVyZW5jZXMsIGNlbGwgcmFuZ2VzIGFuZCBmdW5jdGlvbnMuIE5hbWVkIHJhbmdlcyBhcmUgbm90IHN1cHBvcnRlZC4gRm9ybXVsYXMgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgdGhleSBhcHBlYXIgaW4gRXhjZWwsIHRoYXQgaXMgY2VsbHMgYW5kIGZ1bmN0aW9ucyBtdXN0IGJlIGluIHVwcGVyY2FzZS4KKworQ2VsbHMgaW4gRXhjZWwgYXJlIHJlZmVyZW5jZWQgdXNpbmcgdGhlIEExIG5vdGF0aW9uIHN5c3RlbSB3aGVyZSB0aGUgY29sdW1uIGlzIGRlc2lnbmF0ZWQgYnkgYSBsZXR0ZXIgYW5kIHRoZSByb3cgYnkgYSBudW1iZXIuIENvbHVtbnMgcmFuZ2UgZnJvbSBBIHRvIElWIGkuZS4gMCB0byAyNTUsIHJvd3MgcmFuZ2UgZnJvbSAxIHRvIDY1NTM2LiBUaGUgQzxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4gbW9kdWxlIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIGRpc3RybyBjb250YWlucyBoZWxwZXIgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggQTEgbm90YXRpb24sIGZvciBleGFtcGxlOgorCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5OworCisgICAgKCRyb3csICRjb2wpID0geGxfY2VsbF90b19yb3djb2woJ0MyJyk7ICAjICgxLCAyKQorICAgICRzdHIgICAgICAgICA9IHhsX3Jvd2NvbF90b19jZWxsKDEsIDIpOyAgIyBDMgorCitUaGUgRXhjZWwgQzwkPiBub3RhdGlvbiBpbiBjZWxsIHJlZmVyZW5jZXMgaXMgYWxzbyBzdXBwb3J0ZWQuIFRoaXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoZXRoZXIgYSByb3cgb3IgY29sdW1uIGlzIHJlbGF0aXZlIG9yIGFic29sdXRlLiBUaGlzIG9ubHkgaGFzIGFuIGVmZmVjdCBpZiB0aGUgY2VsbCBpcyBjb3BpZWQuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgdmFsdWVzLgorCisgICAgJz1BMScgICAjIENvbHVtbiBhbmQgcm93IGFyZSByZWxhdGl2ZQorICAgICc9JEExJyAgIyBDb2x1bW4gaXMgYWJzb2x1dGUgYW5kIHJvdyBpcyByZWxhdGl2ZQorICAgICc9QSQxJyAgIyBDb2x1bW4gaXMgcmVsYXRpdmUgYW5kIHJvdyBpcyBhYnNvbHV0ZQorICAgICc9JEEkMScgIyBDb2x1bW4gYW5kIHJvdyBhcmUgYWJzb2x1dGUKKworRm9ybXVsYXMgY2FuIGFsc28gcmVmZXIgdG8gY2VsbHMgaW4gb3RoZXIgd29ya3NoZWV0cyBvZiB0aGUgY3VycmVudCB3b3JrYm9vay4gRm9yIGV4YW1wbGU6CisKKyAgICAnPVNoZWV0MiFBMScKKyAgICAnPVNoZWV0MiFBMTpBNScKKyAgICAnPVNoZWV0MjpTaGVldDMhQTEnCisgICAgJz1TaGVldDI6U2hlZXQzIUExOkE1JworICAgIHF7PSdUZXN0IERhdGEnIUExfQorICAgIHF7PSdUZXN0IERhdGExOlRlc3QgRGF0YTInIUExfQorCitUaGUgc2hlZXQgcmVmZXJlbmNlIGFuZCB0aGUgY2VsbCByZWZlcmVuY2UgYXJlIHNlcGFyYXRlZCBieSAgQzwhPiB0aGUgZXhjbGFtYXRpb24gbWFyayBzeW1ib2wuIElmIHdvcmtzaGVldCBuYW1lcyBjb250YWluIHNwYWNlcywgY29tbWFzIG8gcGFyZW50aGVzZXMgdGhlbiBFeGNlbCByZXF1aXJlcyB0aGF0IHRoZSBuYW1lIGlzIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMgYXMgc2hvd24gaW4gdGhlIGxhc3QgdHdvIGV4YW1wbGVzIGFib3ZlLiBJbiBvcmRlciB0byBhdm9pZCB1c2luZyBhIGxvdCBvZiBlc2NhcGUgY2hhcmFjdGVycyB5b3UgY2FuIHVzZSB0aGUgcXVvdGUgb3BlcmF0b3IgQzxxe30+IHRvIHByb3RlY3QgdGhlIHF1b3Rlcy4gU2VlIEM8cGVybG9wPiBpbiB0aGUgbWFpbiBQZXJsIGRvY3VtZW50YXRpb24uIE9ubHkgdmFsaWQgc2hlZXQgbmFtZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdXNpbmcgdGhlIEM8YWRkX3dvcmtzaGVldCgpPiBtZXRob2QgY2FuIGJlIHVzZWQgaW4gZm9ybXVsYXMuIFlvdSBjYW5ub3QgcmVmZXJlbmNlIGV4dGVybmFsIHdvcmtib29rcy4KKworCitUaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIEV4Y2VsJ3MgZm9ybXVsYXMuIFRoZSBtYWpvcml0eSBvZiB0aGUgb3BlcmF0b3JzIGFyZSB0aGUgc2FtZSBhcyBQZXJsJ3MsIGRpZmZlcmVuY2VzIGFyZSBpbmRpY2F0ZWQ6CisKKyAgICBBcml0aG1ldGljIG9wZXJhdG9yczoKKyAgICA9PT09PT09PT09PT09PT09PT09PT0KKyAgICBPcGVyYXRvciAgTWVhbmluZyAgICAgICAgICAgICAgICAgICBFeGFtcGxlCisgICAgICAgKyAgICAgIEFkZGl0aW9uICAgICAgICAgICAgICAgICAgMSsyCisgICAgICAgLSAgICAgIFN1YnRyYWN0aW9uICAgICAgICAgICAgICAgMi0xCisgICAgICAgKiAgICAgIE11bHRpcGxpY2F0aW9uICAgICAgICAgICAgMiozCisgICAgICAgLyAgICAgIERpdmlzaW9uICAgICAgICAgICAgICAgICAgMS80CisgICAgICAgXiAgICAgIEV4cG9uZW50aWF0aW9uICAgICAgICAgICAgMl4zICAgICAgIyBFcXVpdmFsZW50IHRvICoqCisgICAgICAgLSAgICAgIFVuYXJ5IG1pbnVzICAgICAgICAgICAgICAgLSgxKzIpICAgIyBOb3QgeWV0IHN1cHBvcnRlZAorICAgICAgICUgICAgICBQZXJjZW50IChOb3QgbW9kdWx1cykgICAgIDEzJSAgICAgICMgTm90IHN1cHBvcnRlZCwgWzFdCisKKworICAgIENvbXBhcmlzb24gb3BlcmF0b3JzOgorICAgID09PT09PT09PT09PT09PT09PT09PQorICAgIE9wZXJhdG9yICBNZWFuaW5nICAgICAgICAgICAgICAgICAgIEV4YW1wbGUKKyAgICAgICAgPSAgICAgRXF1YWwgdG8gICAgICAgICAgICAgICAgICBBMSA9ICBCMSAjIEVxdWl2YWxlbnQgdG8gPT0KKyAgICAgICAgPD4gICAgTm90IGVxdWFsIHRvICAgICAgICAgICAgICBBMSA8PiBCMSAjIEVxdWl2YWxlbnQgdG8gIT0KKyAgICAgICAgPiAgICAgR3JlYXRlciB0aGFuICAgICAgICAgICAgICBBMSA+ICBCMQorICAgICAgICA8ICAgICBMZXNzIHRoYW4gICAgICAgICAgICAgICAgIEExIDwgIEIxCisgICAgICAgID49ICAgIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAgQTEgPj0gQjEKKyAgICAgICAgPD0gICAgTGVzcyB0aGFuIG9yIGVxdWFsIHRvICAgICBBMSA8PSBCMQorCisKKyAgICBTdHJpbmcgb3BlcmF0b3I6CisgICAgPT09PT09PT09PT09PT09PQorICAgIE9wZXJhdG9yICBNZWFuaW5nICAgICAgICAgICAgICAgICAgIEV4YW1wbGUKKyAgICAgICAgJiAgICAgQ29uY2F0ZW5hdGlvbiAgICAgICAgICAgICAiSGVsbG8gIiAmICJXb3JsZCEiICMgWzJdCisKKworICAgIFJlZmVyZW5jZSBvcGVyYXRvcnM6CisgICAgPT09PT09PT09PT09PT09PT09PT0KKyAgICBPcGVyYXRvciAgTWVhbmluZyAgICAgICAgICAgICAgICAgICBFeGFtcGxlCisgICAgICAgIDogICAgIFJhbmdlIG9wZXJhdG9yICAgICAgICAgICAgQTE6QTQgICAgICAgICAgICAgICAjIFszXQorICAgICAgICAsICAgICBVbmlvbiBvcGVyYXRvciAgICAgICAgICAgIFNVTSgxLCAyKzIsIEIzKSAgICAgIyBbNF0KKworCisgICAgTm90ZXM6CisgICAgWzFdOiBZb3UgY2FuIGdldCBhIHBlcmNlbnRhZ2Ugd2l0aCBmb3JtYXR0aW5nIGFuZCBtb2R1bHVzIHdpdGggTU9EKCkuCisgICAgWzJdOiBFcXVpdmFsZW50IHRvICgiSGVsbG8gIiAuICJXb3JsZCEiKSBpbiBQZXJsLgorICAgIFszXTogVGhpcyByYW5nZSBpcyBlcXVpdmFsZW50IHRvIGNlbGxzIEExLCBBMiwgQTMgYW5kIEE0LgorICAgIFs0XTogVGhlIGNvbW1hIGJlaGF2ZXMgbGlrZSB0aGUgbGlzdCBzZXBhcmF0b3IgaW4gUGVybC4KKworVGhlIHJhbmdlIGFuZCBjb21tYSBvcGVyYXRvcnMgY2FuIGhhdmUgZGlmZmVyZW50IHN5bWJvbHMgaW4gbm9uLUVuZ2xpc2ggdmVyc2lvbnMgb2YgRXhjZWwuIFRoZXNlIHdpbGwgYmUgc3VwcG9ydGVkIGluIGEgbGF0ZXIgdmVyc2lvbiBvZiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4gRXVyb3BlYW4gdXNlcnMgb2YgRXhjZWwgdGFrZSBub3RlOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJz1TVU0oMTsgMjsgMyknKTsgIyBXcm9uZyEhCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJz1TVU0oMSwgMiwgMyknKTsgIyBPa2F5CisKK1RoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgYWxsIG9mIHRoZSBjb3JlIGZ1bmN0aW9ucyBzdXBwb3J0ZWQgYnkgRXhjZWwgNSBhbmQgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuIEFueSBhZGRpdGlvbmFsIGZ1bmN0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgIkFuYWx5c2lzIFRvb2xQYWsiIG9yIG90aGVyIGFkZC1pbnMgYXJlIG5vdCBzdXBwb3J0ZWQuIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGFsbCBiZWVuIHRlc3RlZCB0byB2ZXJpZnkgdGhhdCB0aGV5IHdvcmsuCisKKyAgICBBQlMgICAgICAgICAgIERCICAgICAgICAgICAgSU5ESVJFQ1QgICAgICBOT1JNSU5WICAgICAgIFNMTgorICAgIEFDT1MgICAgICAgICAgRENPVU5UICAgICAgICBJTkZPICAgICAgICAgIE5PUk1TRElTVCAgICAgU0xPUEUKKyAgICBBQ09TSCAgICAgICAgIERDT1VOVEEgICAgICAgSU5UICAgICAgICAgICBOT1JNU0lOViAgICAgIFNNQUxMCisgICAgQUREUkVTUyAgICAgICBEREIgICAgICAgICAgIElOVEVSQ0VQVCAgICAgTk9UICAgICAgICAgICBTUVJUCisgICAgQU5EICAgICAgICAgICBERUdSRUVTICAgICAgIElQTVQgICAgICAgICAgTk9XICAgICAgICAgICBTVEFOREFSRElaRQorICAgIEFSRUFTICAgICAgICAgREVWU1EgICAgICAgICBJUlIgICAgICAgICAgIE5QRVIgICAgICAgICAgU1RERVYKKyAgICBBU0lOICAgICAgICAgIERHRVQgICAgICAgICAgSVNCTEFOSyAgICAgICBOUFYgICAgICAgICAgIFNUREVWUAorICAgIEFTSU5IICAgICAgICAgRE1BWCAgICAgICAgICBJU0VSUiAgICAgICAgIE9ERCAgICAgICAgICAgU1RFWVgKKyAgICBBVEFOICAgICAgICAgIERNSU4gICAgICAgICAgSVNFUlJPUiAgICAgICBPRkZTRVQgICAgICAgIFNVQlNUSVRVVEUKKyAgICBBVEFOMiAgICAgICAgIERPTExBUiAgICAgICAgSVNMT0dJQ0FMICAgICBPUiAgICAgICAgICAgIFNVQlRPVEFMCisgICAgQVRBTkggICAgICAgICBEUFJPRFVDVCAgICAgIElTTkEgICAgICAgICAgUEVBUlNPTiAgICAgICBTVU0KKyAgICBBVkVERVYgICAgICAgIERTVERFViAgICAgICAgSVNOT05URVhUICAgICBQRVJDRU5USUxFICAgIFNVTUlGCisgICAgQVZFUkFHRSAgICAgICBEU1RERVZQICAgICAgIElTTlVNQkVSICAgICAgUEVSQ0VOVFJBTksgICBTVU1QUk9EVUNUCisgICAgQkVUQURJU1QgICAgICBEU1VNICAgICAgICAgIElTUkVGICAgICAgICAgUEVSTVVUICAgICAgICBTVU1TUQorICAgIEJFVEFJTlYgICAgICAgRFZBUiAgICAgICAgICBJU1RFWFQgICAgICAgIFBJICAgICAgICAgICAgU1VNWDJNWTIKKyAgICBCSU5PTURJU1QgICAgIERWQVJQICAgICAgICAgS1VSVCAgICAgICAgICBQTVQgICAgICAgICAgIFNVTVgyUFkyCisgICAgQ0FMTCAgICAgICAgICBFUlJPUi5UWVBFICAgIExBUkdFICAgICAgICAgUE9JU1NPTiAgICAgICBTVU1YTVkyCisgICAgQ0VJTElORyAgICAgICBFVkVOICAgICAgICAgIExFRlQgICAgICAgICAgUE9XRVIgICAgICAgICBTWUQKKyAgICBDRUxMICAgICAgICAgIEVYQUNUICAgICAgICAgTEVOICAgICAgICAgICBQUE1UICAgICAgICAgIFQKKyAgICBDSEFSICAgICAgICAgIEVYUCAgICAgICAgICAgTElORVNUICAgICAgICBQUk9CICAgICAgICAgIFRBTgorICAgIENISURJU1QgICAgICAgRVhQT05ESVNUICAgICBMTiAgICAgICAgICAgIFBST0RVQ1QgICAgICAgVEFOSAorICAgIENISUlOViAgICAgICAgRkFDVCAgICAgICAgICBMT0cgICAgICAgICAgIFBST1BFUiAgICAgICAgVERJU1QKKyAgICBDSElURVNUICAgICAgIEZBTFNFICAgICAgICAgTE9HMTAgICAgICAgICBQViAgICAgICAgICAgIFRFWFQKKyAgICBDSE9PU0UgICAgICAgIEZESVNUICAgICAgICAgTE9HRVNUICAgICAgICBRVUFSVElMRSAgICAgIFRJTUUKKyAgICBDTEVBTiAgICAgICAgIEZJTkQgICAgICAgICAgTE9HSU5WICAgICAgICBSQURJQU5TICAgICAgIFRJTUVWQUxVRQorICAgIENPREUgICAgICAgICAgRklOViAgICAgICAgICBMT0dOT1JNRElTVCAgIFJBTkQgICAgICAgICAgVElOVgorICAgIENPTFVNTiAgICAgICAgRklTSEVSICAgICAgICBMT09LVVAgICAgICAgIFJBTksgICAgICAgICAgVE9EQVkKKyAgICBDT0xVTU5TICAgICAgIEZJU0hFUklOViAgICAgTE9XRVIgICAgICAgICBSQVRFICAgICAgICAgIFRSQU5TUE9TRQorICAgIENPTUJJTiAgICAgICAgRklYRUQgICAgICAgICBNQVRDSCAgICAgICAgIFJFR0lTVEVSLklEICAgVFJFTkQKKyAgICBDT05DQVRFTkFURSAgIEZMT09SICAgICAgICAgTUFYICAgICAgICAgICBSRVBMQUNFICAgICAgIFRSSU0KKyAgICBDT05GSURFTkNFICAgIEZPUkVDQVNUICAgICAgTURFVEVSTSAgICAgICBSRVBUICAgICAgICAgIFRSSU1NRUFOCisgICAgQ09SUkVMICAgICAgICBGUkVRVUVOQ1kgICAgIE1FRElBTiAgICAgICAgUklHSFQgICAgICAgICBUUlVFCisgICAgQ09TICAgICAgICAgICBGVEVTVCAgICAgICAgIE1JRCAgICAgICAgICAgUk9NQU4gICAgICAgICBUUlVOQworICAgIENPU0ggICAgICAgICAgRlYgICAgICAgICAgICBNSU4gICAgICAgICAgIFJPVU5EICAgICAgICAgVFRFU1QKKyAgICBDT1VOVCAgICAgICAgIEdBTU1BRElTVCAgICAgTUlOVVRFICAgICAgICBST1VORERPV04gICAgIFRZUEUKKyAgICBDT1VOVEEgICAgICAgIEdBTU1BSU5WICAgICAgTUlOVkVSU0UgICAgICBST1VORFVQICAgICAgIFVQUEVSCisgICAgQ09VTlRCTEFOSyAgICBHQU1NQUxOICAgICAgIE1JUlIgICAgICAgICAgUk9XICAgICAgICAgICBWQUxVRQorICAgIENPVU5USUYgICAgICAgR0VPTUVBTiAgICAgICBNTVVMVCAgICAgICAgIFJPV1MgICAgICAgICAgVkFSCisgICAgQ09WQVIgICAgICAgICBHUk9XVEggICAgICAgIE1PRCAgICAgICAgICAgUlNRICAgICAgICAgICBWQVJQCisgICAgQ1JJVEJJTk9NICAgICBIQVJNRUFOICAgICAgIE1PREUgICAgICAgICAgU0VBUkNIICAgICAgICBWREIKKyAgICBEQVRFICAgICAgICAgIEhMT09LVVAgICAgICAgTU9OVEggICAgICAgICBTRUNPTkQgICAgICAgIFZMT09LVVAKKyAgICBEQVRFVkFMVUUgICAgIEhPVVIgICAgICAgICAgTiAgICAgICAgICAgICBTSUdOICAgICAgICAgIFdFRUtEQVkKKyAgICBEQVZFUkFHRSAgICAgIEhZUEdFT01ESVNUICAgTkEgICAgICAgICAgICBTSU4gICAgICAgICAgIFdFSUJVTEwKKyAgICBEQVkgICAgICAgICAgIElGICAgICAgICAgICAgTkVHQklOT01ESVNUICBTSU5IICAgICAgICAgIFlFQVIKKyAgICBEQVlTMzYwICAgICAgIElOREVYICAgICAgICAgTk9STURJU1QgICAgICBTS0VXICAgICAgICAgIFpURVNUCisKK1lvdSBjYW4gYWxzbyBtb2RpZnkgdGhlIG1vZHVsZSB0byBzdXBwb3J0IGZ1bmN0aW9uIG5hbWVzIGluIHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzOiBHZXJtYW4sIEZyZW5jaCwgU3BhbmlzaCwgUG9ydHVndWVzZSwgRHV0Y2gsIEZpbm5pc2gsIEl0YWxpYW4gYW5kIFN3ZWRpc2guIFNlZSB0aGUgQzxmdW5jdGlvbl9sb2NhbGUucGw+IHByb2dyYW0gaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCitGb3IgYSBnZW5lcmFsIGludHJvZHVjdGlvbiB0byBFeGNlbCdzIGZvcm11bGFzIGFuZCBhbiBleHBsYW5hdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoZSBmdW5jdGlvbiByZWZlciB0byB0aGUgRXhjZWwgaGVscCBmaWxlcyBvciB0aGUgZm9sbG93aW5nOiBMPGh0dHA6Ly9vZmZpY2UubWljcm9zb2Z0LmNvbS9lbi11cy9hc3Npc3RhbmNlL0NIMDYyNTI4MDMxMDMzLmFzcHg+LgorCitJZiB5b3VyIGZvcm11bGEgZG9lc24ndCB3b3JrIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRyeSB0aGUgZm9sbG93aW5nOgorCisgICAgMS4gVmVyaWZ5IHRoYXQgdGhlIGZvcm11bGEgd29ya3MgaW4gRXhjZWwgKG9yIEdudW1lcmljIG9yIE9wZW5PZmZpY2Uub3JnKS4KKyAgICAyLiBFbnN1cmUgdGhhdCBpdCBpc24ndCBvbiB0aGUgQ2F2ZWF0cyBsaXN0IHNob3duIGFib3ZlLgorICAgIDMuIEVuc3VyZSB0aGF0IGNlbGwgcmVmZXJlbmNlcyBhbmQgZm9ybXVsYSBuYW1lcyBhcmUgaW4gdXBwZXJjYXNlLgorICAgIDQuIEVuc3VyZSB0aGF0IHlvdSBhcmUgdXNpbmcgJzonIGFzIHRoZSByYW5nZSBvcGVyYXRvciwgQTE6QTQuCisgICAgNS4gRW5zdXJlIHRoYXQgeW91IGFyZSB1c2luZyAnLCcgYXMgdGhlIHVuaW9uIG9wZXJhdG9yLCBTVU0oMSwyLDMpLgorICAgIDYuIEVuc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBpcyBpbiB0aGUgYWJvdmUgdGFibGUuCisKK0lmIHlvdSBnbyB0aHJvdWdoIHN0ZXBzIDEtNiBhbmQgeW91IHN0aWxsIGhhdmUgYSBwcm9ibGVtLCBtYWlsIG1lLgorCisKKworCis9aGVhZDIgSW1wcm92aW5nIHBlcmZvcm1hbmNlIHdoZW4gd29ya2luZyB3aXRoIGZvcm11bGFzCisKK1dyaXRpbmcgYSBsYXJnZSBudW1iZXIgb2YgZm9ybXVsYXMgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBjYW4gYmUgc2xvdy4gVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBlYWNoIGZvcm11bGEgaGFzIHRvIGJlIHBhcnNlZCBhbmQgd2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB0aGlzIGlzIGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUuCisKK0hvd2V2ZXIsIGluIGEgbG90IG9mIGNhc2VzIHRoZSBmb3JtdWxhcyB0aGF0IHlvdSB3cml0ZSB3aWxsIGJlIHF1aXRlIHNpbWlsYXIsIGZvciBleGFtcGxlOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfZm9ybXVsYSgnQjEnLCAgICAnPUExICogMyArIDUwJywgICAgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfZm9ybXVsYSgnQjInLCAgICAnPUEyICogMyArIDUwJywgICAgJGZvcm1hdCk7CisgICAgLi4uCisgICAgLi4uCisgICAgJHdvcmtzaGVldC0+d3JpdGVfZm9ybXVsYSgnQjk5JywgICAnPUE5OTkgKiAzICsgNTAnLCAgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfZm9ybXVsYSgnQjEwMDAnLCAnPUExMDAwICogMyArIDUwJywgJGZvcm1hdCk7CisKK0luIHRoaXMgZXhhbXBsZSB0aGUgY2VsbCByZWZlcmVuY2UgY2hhbmdlcyBpbiBpdGVyYXRpb25zIGZyb20gQzxBMT4gdG8gQzxBMTAwMD4uIFRoZSBwYXJzZXIgdHJlYXRzIHRoaXMgdmFyaWFibGUgYXMgYSBJPHRva2VuPiBhbmQgYXJyYW5nZXMgaXQgYWNjb3JkaW5nIHRvIHByZWRlZmluZWQgcnVsZXMuIEhvd2V2ZXIsIHNpbmNlIHRoZSBwYXJzZXIgaXMgb2JsaXZpb3VzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdG9rZW4sIGl0IGlzIGVzc2VudGlhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgY2FsY3VsYXRpb24gMTAwMCB0aW1lcy4gVGhpcyBpcyBpbmVmZmljaWVudC4KKworVGhlIHdheSB0byBhdm9pZCB0aGlzIGluZWZmaWNpZW5jeSBhbmQgdGhlcmVieSBzcGVlZCB1cCB0aGUgd3JpdGluZyBvZiBmb3JtdWxhcyBpcyB0byBwYXJzZSB0aGUgZm9ybXVsYSBvbmNlIGFuZCB0aGVuIHJlcGVhdGVkbHkgc3Vic3RpdHV0ZSBzaW1pbGFyIHRva2Vucy4KKworQSBmb3JtdWxhIGNhbiBiZSBwYXJzZWQgYW5kIHN0b3JlZCB2aWEgdGhlIEM8c3RvcmVfZm9ybXVsYSgpPiB3b3Jrc2hlZXQgbWV0aG9kLiBZb3UgY2FuIHRoZW4gdXNlIHRoZSBDPHJlcGVhdF9mb3JtdWxhKCk+IG1ldGhvZCB0byBzdWJzdGl0dXRlIEM8JHBhdHRlcm4+LCBDPCRyZXBsYWNlPiBwYWlycyBpbiB0aGUgc3RvcmVkIGZvcm11bGE6CisKKyAgICBteSAkZm9ybXVsYSA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1BMSAqIDMgKyA1MCcpOworCisgICAgZm9yIG15ICRyb3cgKDAuLjk5OSkgeworICAgICAgICAkd29ya3NoZWV0LT5yZXBlYXRfZm9ybXVsYSgkcm93LCAxLCAkZm9ybXVsYSwgJGZvcm1hdCwgJ0ExJywgJ0EnLigkcm93ICsxKSk7CisgICAgfQorCitPbiBhbiBhcmJpdHJhcnkgdGVzdCBtYWNoaW5lIHRoaXMgbWV0aG9kIHdhcyAxMCB0aW1lcyBmYXN0ZXIgdGhhbiB0aGUgYnJ1dGUgZm9yY2UgbWV0aG9kIHNob3duIGFib3ZlLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgcGFyc2VzIGFuZCBzdG9yZXMgZm9ybXVsYXMgc2VlIHRoZSBDPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtdWxhPiBtYW4gcGFnZS4KKworSXQgc2hvdWxkIGJlIG5vdGVkIGhvd2V2ZXIgdGhhdCB0aGUgb3ZlcmFsbCBzcGVlZCBvZiBkaXJlY3QgZm9ybXVsYSBwYXJzaW5nIHdpbGwgYmUgaW1wcm92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4KKworCisKKworPWhlYWQxIEVYQU1QTEVTCisKK1NlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpFeGFtcGxlcz4gZm9yIGEgZnVsbCBsaXN0IG9mIGV4YW1wbGVzLgorCisKKz1oZWFkMiBFeGFtcGxlIDEKKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHNvbWUgb2YgdGhlIGJhc2ljIGZlYXR1cmVzIG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgY2FsbGVkIHNpbXBsZS54bHMgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdzaW1wbGUueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgIyBUaGUgZ2VuZXJhbCBzeW50YXggaXMgd3JpdGUoJHJvdywgJGNvbHVtbiwgJHRva2VuKS4gTm90ZSB0aGF0IHJvdyBhbmQKKyAgICAjIGNvbHVtbiBhcmUgemVybyBpbmRleGVkCisKKyAgICAjIFdyaXRlIHNvbWUgdGV4dAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICAnSGkgRXhjZWwhJyk7CisKKworICAgICMgV3JpdGUgc29tZSBudW1iZXJzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMCwgIDMpOyAgICAgICAgICAjIFdyaXRlcyAzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMCwgIDMuMDAwMDApOyAgICAjIFdyaXRlcyAzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgMCwgIDMuMDAwMDEpOyAgICAjIFdyaXRlcyAzLjAwMDAxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgMCwgIDMuMTQxNTkpOyAgICAjIFRlWCByZXZpc2lvbiBuby4/CisKKworICAgICMgV3JpdGUgc29tZSBmb3JtdWxhcworICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsIDAsICAnPUEzICsgQTYnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg4LCAwLCAgJz1JRihBNT4zLCJZZXMiLCAiTm8iKScpOworCisKKyAgICAjIFdyaXRlIGEgaHlwZXJsaW5rCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMTAsIDAsICdodHRwOi8vd3d3LnBlcmwuY29tLycpOworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvYV9zaW1wbGUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBhX3NpbXBsZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKworCis9aGVhZDIgRXhhbXBsZSAyCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBnZW5lcmFsIGV4YW1wbGUgd2hpY2ggZGVtb25zdHJhdGVzIHNvbWUgZmVhdHVyZXMgb2Ygd29ya2luZyB3aXRoIG11bHRpcGxlIHdvcmtzaGVldHMuCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgIyBDcmVhdGUgYSBuZXcgRXhjZWwgd29ya2Jvb2sKKyAgICBteSAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdyZWdpb25zLnhscycpOworCisgICAgIyBBZGQgc29tZSB3b3Jrc2hlZXRzCisgICAgbXkgJG5vcnRoID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdOb3J0aCcpOworICAgIG15ICRzb3V0aCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnU291dGgnKTsKKyAgICBteSAkZWFzdCAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0Vhc3QnKTsKKyAgICBteSAkd2VzdCAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1dlc3QnKTsKKworICAgICMgQWRkIGEgRm9ybWF0CisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisKKyAgICAjIEFkZCBhIGNhcHRpb24gdG8gZWFjaCB3b3Jrc2hlZXQKKyAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKCR3b3JrYm9vay0+c2hlZXRzKCkpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgJ1NhbGVzJywgJGZvcm1hdCk7CisgICAgfQorCisgICAgIyBXcml0ZSBzb21lIGRhdGEKKyAgICAkbm9ydGgtPndyaXRlKDAsIDEsIDIwMDAwMCk7CisgICAgJHNvdXRoLT53cml0ZSgwLCAxLCAxMDAwMDApOworICAgICRlYXN0LT53cml0ZSAoMCwgMSwgMTUwMDAwKTsKKyAgICAkd2VzdC0+d3JpdGUgKDAsIDEsIDEwMDAwMCk7CisKKyAgICAjIFNldCB0aGUgYWN0aXZlIHdvcmtzaGVldAorICAgICRzb3V0aC0+YWN0aXZhdGUoKTsKKworICAgICMgU2V0IHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgY29sdW1uCisgICAgJHNvdXRoLT5zZXRfY29sdW1uKDAsIDAsIDIwKTsKKworICAgICMgU2V0IHRoZSBhY3RpdmUgY2VsbAorICAgICRzb3V0aC0+c2V0X3NlbGVjdGlvbigwLCAxKTsKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3JlZ2lvbnMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSByZWdpb25zLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKKworCisKKz1oZWFkMiBFeGFtcGxlIDMKKworVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYSBjb25kaXRpb25hbCBudW1lcmljYWwgZm9ybWF0IHdpdGggY29sb3VycyB0byBpbmRpY2F0ZSBpZiBhIHNoYXJlIHByaWNlIGhhcyBnb25lIHVwIG9yIGRvd24uCisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnc3RvY2tzLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbnMgMSwgMiwgMyBhbmQgNAorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMywgMTUpOworCisKKyAgICAjIENyZWF0ZSBhIGZvcm1hdCBmb3IgdGhlIGNvbHVtbiBoZWFkaW5ncworICAgIG15ICRoZWFkZXIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkaGVhZGVyLT5zZXRfYm9sZCgpOworICAgICRoZWFkZXItPnNldF9zaXplKDEyKTsKKyAgICAkaGVhZGVyLT5zZXRfY29sb3IoJ2JsdWUnKTsKKworCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBzdG9jayBwcmljZQorICAgIG15ICRmX3ByaWNlID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZfcHJpY2UtPnNldF9hbGlnbignbGVmdCcpOworICAgICRmX3ByaWNlLT5zZXRfbnVtX2Zvcm1hdCgnJDAuMDAnKTsKKworCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBzdG9jayB2b2x1bWUKKyAgICBteSAkZl92b2x1bWUgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZl92b2x1bWUtPnNldF9hbGlnbignbGVmdCcpOworICAgICRmX3ZvbHVtZS0+c2V0X251bV9mb3JtYXQoJyMsIyMwJyk7CisKKworICAgICMgQ3JlYXRlIGEgZm9ybWF0IGZvciB0aGUgcHJpY2UgY2hhbmdlLiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYQorICAgICMgY29uZGl0aW9uYWwgZm9ybWF0LiBUaGUgbnVtYmVyIGlzIGZvcm1hdHRlZCBhcyBhIHBlcmNlbnRhZ2UuIElmIGl0IGlzCisgICAgIyBwb3NpdGl2ZSBpdCBpcyBmb3JtYXR0ZWQgaW4gZ3JlZW4sIGlmIGl0IGlzIG5lZ2F0aXZlIGl0IGlzIGZvcm1hdHRlZAorICAgICMgaW4gcmVkIGFuZCBpZiBpdCBpcyB6ZXJvIGl0IGlzIGZvcm1hdHRlZCBhcyB0aGUgZGVmYXVsdCBmb250IGNvbG91cgorICAgICMgKGluIHRoaXMgY2FzZSBibGFjaykuIE5vdGU6IHRoZSBbR3JlZW5dIGZvcm1hdCBwcm9kdWNlcyBhbiB1bmFwcGVhbGluZworICAgICMgbGltZSBncmVlbi4gVHJ5IFtDb2xvciAxMF0gaW5zdGVhZCBmb3IgYSBkYXJrIGdyZWVuLgorICAgICMKKyAgICBteSAkZl9jaGFuZ2UgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZl9jaGFuZ2UtPnNldF9hbGlnbignbGVmdCcpOworICAgICRmX2NoYW5nZS0+c2V0X251bV9mb3JtYXQoJ1tHcmVlbl0wLjAlO1tSZWRdLTAuMCU7MC4wJScpOworCisKKyAgICAjIFdyaXRlIG91dCB0aGUgZGF0YQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdDb21wYW55JywkaGVhZGVyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAnUHJpY2UnLCAgJGhlYWRlcik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgJ1ZvbHVtZScsICRoZWFkZXIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICdDaGFuZ2UnLCAkaGVhZGVyKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDAsICdEYW1hZ2UgSW5jLicgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAxLCAzMC4yNSwgICAgJGZfcHJpY2UgKTsgIyAkMzAuMjUKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAyLCAxMjM0NTY3LCAgJGZfdm9sdW1lKTsgIyAxLDIzNCw1NjcKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAzLCAwLjA4NSwgICAgJGZfY2hhbmdlKTsgIyA4LjUlIGluIGdyZWVuCisKKyAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAwLCAnRHVtcCBDb3JwLicgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMSwgMS41NiwgICAgICRmX3ByaWNlICk7ICMgJDEuNTYKKyAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAyLCA3NTY0LCAgICAgJGZfdm9sdW1lKTsgIyA3LDU2NAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDMsIC0wLjAxNSwgICAkZl9jaGFuZ2UpOyAjIC0xLjUlIGluIHJlZAorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMCwgJ1JldiBMdGQuJyAgICAgICAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDEsIDAuMTMsICAgICAkZl9wcmljZSApOyAjICQwLjEzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMiwgMzIxLCAgICAgICRmX3ZvbHVtZSk7ICMgMzIxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMywgMCwgICAgICAgICRmX2NoYW5nZSk7ICMgMCBpbiB0aGUgZm9udCBjb2xvciAoYmxhY2spCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9zdG9ja3MuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBzdG9ja3MucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworCisKKworPWhlYWQyIEV4YW1wbGUgNAorCitUaGUgZm9sbG93aW5nIGlzIGEgc2ltcGxlIGV4YW1wbGUgb2YgdXNpbmcgZnVuY3Rpb25zLgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnc3RhdHMueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnVGVzdCBkYXRhJyk7CisKKyAgICAjIFNldCB0aGUgY29sdW1uIHdpZHRoIGZvciBjb2x1bW5zIDEKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsIDAsIDIwKTsKKworCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBoZWFkaW5ncworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworCisKKyAgICAjIFdyaXRlIHRoZSBzYW1wbGUgZGF0YQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdTYW1wbGUnLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAyLCAyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAzLCAzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA0LCA0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA1LCA1KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA2LCA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA3LCA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA4LCA4KTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDAsICdMZW5ndGgnLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAxLCAyNS40KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAyLCAyNS40KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAzLCAyNC44KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA0LCAyNS4wKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA1LCAyNS4zKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA2LCAyNC45KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA3LCAyNS4yKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA4LCAyNC44KTsKKworICAgICMgV3JpdGUgc29tZSBzdGF0aXN0aWNhbCBmdW5jdGlvbnMKKyAgICAkd29ya3NoZWV0LT53cml0ZSg0LCAgMCwgJ0NvdW50JywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgIDEsICc9Q09VTlQoQjE6STEpJyk7CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAgMCwgJ1N1bScsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsICAxLCAnPVNVTShCMjpJMiknKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsICAwLCAnQXZlcmFnZScsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsICAxLCAnPUFWRVJBR0UoQjI6STIpJyk7CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSg3LCAgMCwgJ01pbicsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsICAxLCAnPU1JTihCMjpJMiknKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDgsICAwLCAnTWF4JywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoOCwgIDEsICc9TUFYKEIyOkkyKScpOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoOSwgIDAsICdTdGFuZGFyZCBEZXZpYXRpb24nLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg5LCAgMSwgJz1TVERFVihCMjpJMiknKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEwLCAwLCAnS3VydG9zaXMnLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxMCwgMSwgJz1LVVJUKEIyOkkyKScpOworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvc3RhdHMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBzdGF0cy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKworCis9aGVhZDIgRXhhbXBsZSA1CisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb252ZXJ0cyBhIHRhYiBzZXBhcmF0ZWQgZmlsZSBjYWxsZWQgQzx0YWIudHh0PiBpbnRvIGFuIEV4Y2VsIGZpbGUgY2FsbGVkIEM8dGFiLnhscz4uCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgb3BlbiAoVEFCRklMRSwgJ3RhYi50eHQnKSBvciBkaWUgInRhYi50eHQ6ICQhIjsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCd0YWIueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgIyBSb3cgYW5kIGNvbHVtbiBhcmUgemVybyBpbmRleGVkCisgICAgbXkgJHJvdyA9IDA7CisKKyAgICB3aGlsZSAoPFRBQkZJTEU+KSB7CisgICAgICAgIGNob21wOworICAgICAgICAjIFNwbGl0IG9uIHNpbmdsZSB0YWIKKyAgICAgICAgbXkgQEZsZCA9IHNwbGl0KCdcdCcsICRfKTsKKworICAgICAgICBteSAkY29sID0gMDsKKyAgICAgICAgZm9yZWFjaCBteSAkdG9rZW4gKEBGbGQpIHsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csICRjb2wsICR0b2tlbik7CisgICAgICAgICAgICAkY29sKys7CisgICAgICAgIH0KKyAgICAgICAgJHJvdysrOworICAgIH0KKworCitOT1RFOiBUaGlzIGlzIGEgc2ltcGxlIGNvbnZlcnNpb24gcHJvZ3JhbSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzIG9ubHkuIEZvciBjb252ZXJ0aW5nIGEgQ1NWIG9yIFRhYiBzZXBhcmF0ZWQgb3IgYW55IG90aGVyIHR5cGUgb2YgZGVsaW1pdGVkIHRleHQgZmlsZSB0byBFeGNlbCBJIHJlY29tbWVuZCB0aGUgbW9yZSByaWdvcm91cyBjc3YyeGxzIHByb2dyYW0gdGhhdCBpcyBwYXJ0IG9mIEguTWVyaWpuIEJyYW5kJ3MgVGV4dDo6Q1NWX1hTIG1vZHVsZSBkaXN0cm8uCisKK1NlZSB0aGUgZXhhbXBsZXMvY3N2MnhscyBsaW5rIGhlcmU6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+aG1icmFuZC9UZXh0LUNTVl9YUy9NQU5JRkVTVD4uCisKKworCisKKz1oZWFkMiBBZGRpdGlvbmFsIEV4YW1wbGVzCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZXhhbXBsZSBmaWxlcyB0aGF0IGFyZSBwcm92aWRlZAoraW4gdGhlIHN0YW5kYXJkIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRpc3RyaWJ1dGlvbi4gVGhleSBkZW1vbnN0cmF0ZSB0aGUKK2RpZmZlcmVudCBmZWF0dXJlcyBhbmQgb3B0aW9ucyBvZiB0aGUgbW9kdWxlLgorU2VlIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkV4YW1wbGVzPiBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgR2V0dGluZyBzdGFydGVkCisgICAgPT09PT09PT09PT09PT09CisgICAgYV9zaW1wbGUucGwgICAgICAgICAgICAgQSBnZXQgc3RhcnRlZCBleGFtcGxlIHdpdGggc29tZSBiYXNpYyBmZWF0dXJlcy4KKyAgICBkZW1vLnBsICAgICAgICAgICAgICAgICBBIGRlbW8gb2Ygc29tZSBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzLgorICAgIHJlZ2lvbnMucGwgICAgICAgICAgICAgIEEgc2ltcGxlIGV4YW1wbGUgb2YgbXVsdGlwbGUgd29ya3NoZWV0cy4KKyAgICBzdGF0cy5wbCAgICAgICAgICAgICAgICBCYXNpYyBmb3JtdWxhcyBhbmQgZnVuY3Rpb25zLgorICAgIGZvcm1hdHMucGwgICAgICAgICAgICAgIEFsbCB0aGUgYXZhaWxhYmxlIGZvcm1hdHRpbmcgb24gc2V2ZXJhbCB3b3Jrc2hlZXRzLgorICAgIGJ1Z19yZXBvcnQucGwgICAgICAgICAgIEEgdGVtcGxhdGUgZm9yIHN1Ym1pdHRpbmcgYnVnIHJlcG9ydHMuCisKKworICAgIEFkdmFuY2VkCisgICAgPT09PT09PT0KKyAgICBhdXRvZmlsdGVyLnBsICAgICAgICAgICBFeGFtcGxlcyBvZiB3b3Jrc2hlZXQgYXV0b2ZpbHRlcnMuCisgICAgYXV0b2ZpdC5wbCAgICAgICAgICAgICAgU2ltdWxhdGUgRXhjZWwncyBhdXRvZml0IGZvciBjb2x1bW4gd2lkdGhzLgorICAgIGJpZ2ZpbGUucGwgICAgICAgICAgICAgIFdyaXRlIHBhc3QgdGhlIDdNQiBsaW1pdCB3aXRoIE9MRTo6U3RvcmFnZV9MaXRlLgorICAgIGNnaS5wbCAgICAgICAgICAgICAgICAgIEEgc2ltcGxlIENHSSBwcm9ncmFtLgorICAgIGNoYXJ0X2FyZWEucGwgICAgICAgICAgIEEgZGVtbyBvZiBhcmVhIHN0eWxlIGNoYXJ0cy4KKyAgICBjaGFydF9iYXIucGwgICAgICAgICAgICBBIGRlbW8gb2YgYmFyICh2ZXJ0aWNhbCBoaXN0b2dyYW0pIHN0eWxlIGNoYXJ0cy4KKyAgICBjaGFydF9jb2x1bW4ucGwgICAgICAgICBBIGRlbW8gb2YgY29sdW1uIChoaXN0b2dyYW0pIHN0eWxlIGNoYXJ0cy4KKyAgICBjaGFydF9saW5lLnBsICAgICAgICAgICBBIGRlbW8gb2YgbGluZSBzdHlsZSBjaGFydHMuCisgICAgY2hhcnRfcGllLnBsICAgICAgICAgICAgQSBkZW1vIG9mIHBpZSBzdHlsZSBjaGFydHMuCisgICAgY2hhcnRfc2NhdHRlci5wbCAgICAgICAgQSBkZW1vIG9mIHNjYXR0ZXIgc3R5bGUgY2hhcnRzLgorICAgIGNoYXJ0X3N0b2NrLnBsICAgICAgICAgIEEgZGVtbyBvZiBzdG9jayBzdHlsZSBjaGFydHMuCisgICAgY2hlc3MucGwgICAgICAgICAgICAgICAgQW4gZXhhbXBsZSBvZiByZXVzaW5nIGZvcm1hdHRpbmcgdmlhIHByb3BlcnRpZXMuCisgICAgY29sb3JzLnBsICAgICAgICAgICAgICAgQSBkZW1vIG9mIHRoZSBjb2xvdXIgcGFsZXR0ZSBhbmQgbmFtZWQgY29sb3Vycy4KKyAgICBjb21tZW50czEucGwgICAgICAgICAgICBBZGQgY29tbWVudHMgdG8gd29ya3NoZWV0IGNlbGxzLgorICAgIGNvbW1lbnRzMi5wbCAgICAgICAgICAgIEFkZCBjb21tZW50cyB3aXRoIGFkdmFuY2VkIG9wdGlvbnMuCisgICAgY29weWZvcm1hdC5wbCAgICAgICAgICAgRXhhbXBsZSBvZiBjb3B5aW5nIGEgY2VsbCBmb3JtYXQuCisgICAgZGF0YV92YWxpZGF0ZS5wbCAgICAgICAgQW4gZXhhbXBsZSBvZiBkYXRhIHZhbGlkYXRpb24gYW5kIGRyb3Bkb3duIGxpc3RzLgorICAgIGRhdGVfdGltZS5wbCAgICAgICAgICAgIFdyaXRlIGRhdGVzIGFuZCB0aW1lcyB3aXRoIHdyaXRlX2RhdGVfdGltZSgpLgorICAgIGRlZmluZWRfbmFtZS5wbCAgICAgICAgIEV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBkZWZpbmVkIG5hbWVzLgorICAgIGRpYWdfYm9yZGVyLnBsICAgICAgICAgIEEgc2ltcGxlIGV4YW1wbGUgb2YgZGlhZ29uYWwgY2VsbCBib3JkZXJzLgorICAgIGVhc3Rlcl9lZ2cucGwgICAgICAgICAgIEV4cG9zZSB0aGUgRXhjZWw5NyBmbGlnaHQgc2ltdWxhdG9yLgorICAgIGZpbGVoYW5kbGUucGwgICAgICAgICAgIEV4YW1wbGVzIG9mIHdvcmtpbmcgd2l0aCBmaWxlaGFuZGxlcy4KKyAgICBmb3JtdWxhX3Jlc3VsdC5wbCAgICAgICBGb3JtdWxhcyB3aXRoIHVzZXIgc3BlY2lmaWVkIHJlc3VsdHMuCisgICAgaGVhZGVycy5wbCAgICAgICAgICAgICAgRXhhbXBsZXMgb2Ygd29ya3NoZWV0IGhlYWRlcnMgYW5kIGZvb3RlcnMuCisgICAgaGlkZV9zaGVldC5wbCAgICAgICAgICAgU2ltcGxlIGV4YW1wbGUgb2YgaGlkaW5nIGEgd29ya3NoZWV0LgorICAgIGh5cGVybGluazEucGwgICAgICAgICAgIFNob3dzIGhvdyB0byBjcmVhdGUgd2ViIGh5cGVybGlua3MuCisgICAgaHlwZXJsaW5rMi5wbCAgICAgICAgICAgRXhhbXBsZXMgb2YgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGh5cGVybGlua3MuCisgICAgaW1hZ2VzLnBsICAgICAgICAgICAgICAgQWRkaW5nIGltYWdlcyB0byB3b3Jrc2hlZXRzLgorICAgIGluZGVudC5wbCAgICAgICAgICAgICAgIEFuIGV4YW1wbGUgb2YgY2VsbCBpbmRlbnRhdGlvbi4KKyAgICBtZXJnZTEucGwgICAgICAgICAgICAgICBBIHNpbXBsZSBleGFtcGxlIG9mIGNlbGwgbWVyZ2luZy4KKyAgICBtZXJnZTIucGwgICAgICAgICAgICAgICBBIHNpbXBsZSBleGFtcGxlIG9mIGNlbGwgbWVyZ2luZyB3aXRoIGZvcm1hdHRpbmcuCisgICAgbWVyZ2UzLnBsICAgICAgICAgICAgICAgQWRkIGh5cGVybGlua3MgdG8gbWVyZ2VkIGNlbGxzLgorICAgIG1lcmdlNC5wbCAgICAgICAgICAgICAgIEFuIGFkdmFuY2VkIGV4YW1wbGUgb2YgbWVyZ2luZyB3aXRoIGZvcm1hdHRpbmcuCisgICAgbWVyZ2U1LnBsICAgICAgICAgICAgICAgQW4gYWR2YW5jZWQgZXhhbXBsZSBvZiBtZXJnaW5nIHdpdGggZm9ybWF0dGluZy4KKyAgICBtZXJnZTYucGwgICAgICAgICAgICAgICBBbiBleGFtcGxlIG9mIG1lcmdpbmcgd2l0aCBVbmljb2RlIHN0cmluZ3MuCisgICAgbW9kX3BlcmwxLnBsICAgICAgICAgICAgQSBzaW1wbGUgbW9kX3BlcmwgMSBwcm9ncmFtLgorICAgIG1vZF9wZXJsMi5wbCAgICAgICAgICAgIEEgc2ltcGxlIG1vZF9wZXJsIDIgcHJvZ3JhbS4KKyAgICBvdXRsaW5lLnBsICAgICAgICAgICAgICBBbiBleGFtcGxlIG9mIG91dGxpbmVzIGFuZCBncm91cGluZy4KKyAgICBvdXRsaW5lX2NvbGxhcHNlZC5wbCAgICBBbiBleGFtcGxlIG9mIGNvbGxhcHNlZCBvdXRsaW5lcy4KKyAgICBwYW5lcy5wbCAgICAgICAgICAgICAgICBBbiBleGFtcGxlcyBvZiBob3cgdG8gY3JlYXRlIHBhbmVzLgorICAgIHByb3BlcnRpZXMucGwgICAgICAgICAgIEFkZCBkb2N1bWVudCBwcm9wZXJ0aWVzIHRvIGEgd29ya2Jvb2suCisgICAgcHJvdGVjdGlvbi5wbCAgICAgICAgICAgRXhhbXBsZSBvZiBjZWxsIGxvY2tpbmcgYW5kIGZvcm11bGEgaGlkaW5nLgorICAgIHJlcGVhdC5wbCAgICAgICAgICAgICAgIEV4YW1wbGUgb2Ygd3JpdGluZyByZXBlYXRlZCBmb3JtdWxhcy4KKyAgICByaWdodF90b19sZWZ0LnBsICAgICAgICBDaGFuZ2UgZGVmYXVsdCBzaGVldCBkaXJlY3Rpb24gdG8gcmlnaHQgdG8gbGVmdC4KKyAgICByb3dfd3JhcC5wbCAgICAgICAgICAgICBIb3cgdG8gd3JhcCBkYXRhIGZyb20gb25lIHdvcmtzaGVldCBvbnRvIGFub3RoZXIuCisgICAgc2FsZXMucGwgICAgICAgICAgICAgICAgQW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBzYWxlcyBzcHJlYWRzaGVldC4KKyAgICBzZW5kbWFpbC5wbCAgICAgICAgICAgICBTZW5kIGFuIEV4Y2VsIGVtYWlsIGF0dGFjaG1lbnQgdXNpbmcgTWFpbDo6U2VuZGVyLgorICAgIHN0YXRzX2V4dC5wbCAgICAgICAgICAgIFNhbWUgYXMgc3RhdHMucGwgd2l0aCBleHRlcm5hbCByZWZlcmVuY2VzLgorICAgIHN0b2Nrcy5wbCAgICAgICAgICAgICAgIERlbW9uc3RyYXRlcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nLgorICAgIHRhYl9jb2xvcnMucGwgICAgICAgICAgIEV4YW1wbGUgb2YgaG93IHRvIHNldCB3b3Jrc2hlZXQgdGFiIGNvbG91cnMuCisgICAgdGV4dHdyYXAucGwgICAgICAgICAgICAgRGVtb25zdHJhdGVzIHRleHQgd3JhcHBpbmcgb3B0aW9ucy4KKyAgICB3aW4zMm9sZS5wbCAgICAgICAgICAgICBBIHNhbXBsZSBXaW4zMjo6T0xFIGV4YW1wbGUgZm9yIGNvbXBhcmlzb24uCisgICAgd3JpdGVfYXJyYXlzLnBsICAgICAgICAgRXhhbXBsZSBvZiB3cml0aW5nIDFEIG9yIDJEIGFycmF5cyBvZiBkYXRhLgorICAgIHdyaXRlX2hhbmRsZXIxLnBsICAgICAgIEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAxLgorICAgIHdyaXRlX2hhbmRsZXIyLnBsICAgICAgIEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAyLgorICAgIHdyaXRlX2hhbmRsZXIzLnBsICAgICAgIEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAzLgorICAgIHdyaXRlX2hhbmRsZXI0LnBsICAgICAgIEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCA0LgorICAgIHdyaXRlX3RvX3NjYWxhci5wbCAgICAgIEV4YW1wbGUgb2Ygd3JpdGluZyBhbiBFeGNlbCBmaWxlIHRvIGEgUGVybCBzY2FsYXIuCisKKworICAgIFVuaWNvZGUKKyAgICA9PT09PT09CisgICAgdW5pY29kZV91dGYxNi5wbCAgICAgICAgU2ltcGxlIGV4YW1wbGUgb2YgdXNpbmcgVW5pY29kZSBVVEYxNiBzdHJpbmdzLgorICAgIHVuaWNvZGVfdXRmMTZfamFwYW4ucGwgIFdyaXRlIEphcGFuZXNlIFVuaWNvZGUgc3RyaW5ncyB1c2luZyBVVEYtMTYuCisgICAgdW5pY29kZV9jeXJpbGxpYy5wbCAgICAgV3JpdGUgUnVzc2lhbiBDeXJpbGxpYyBzdHJpbmdzIHVzaW5nIFVURi04LgorICAgIHVuaWNvZGVfbGlzdC5wbCAgICAgICAgIExpc3QgdGhlIGNoYXJzIGluIGEgVW5pY29kZSBmb250LgorICAgIHVuaWNvZGVfMjAyMl9qcC5wbCAgICAgIEphcGFuZXNlOiBJU08tMjAyMi1KUCB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfODg1OV8xMS5wbCAgICAgIFRoYWk6ICAgICBJU08tODg1OV8xMSB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfODg1OV83LnBsICAgICAgIEdyZWVrOiAgICBJU08tODg1OV83ICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfYmlnNS5wbCAgICAgICAgIENoaW5lc2U6ICBCSUc1ICAgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfY3AxMjUxLnBsICAgICAgIFJ1c3NpYW46ICBDUDEyNTEgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfY3AxMjU2LnBsICAgICAgIEFyYWJpYzogICBDUDEyNTYgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfa29pOHIucGwgICAgICAgIFJ1c3NpYW46ICBLT0k4LVIgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfcG9saXNoX3V0ZjgucGwgIFBvbGlzaCA6ICBVVEY4ICAgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfc2hpZnRfamlzLnBsICAgIEphcGFuZXNlOiBTaGlmdCBKSVMgICB0byB1dGY4IGluIHBlcmwgNS44LgorCisKKyAgICBVdGlsaXR5CisgICAgPT09PT09PQorICAgIGNzdjJ4bHMucGwgICAgICAgICAgICAgIFByb2dyYW0gdG8gY29udmVydCBhIENTViBmaWxlIHRvIGFuIEV4Y2VsIGZpbGUuCisgICAgdGFiMnhscy5wbCAgICAgICAgICAgICAgUHJvZ3JhbSB0byBjb252ZXJ0IGEgdGFiIHNlcGFyYXRlZCBmaWxlIHRvIHhscy4KKyAgICBkYXRlY2FsYzEucGwgICAgICAgICAgICBDb252ZXJ0IFVuaXgvUGVybCB0aW1lIHRvIEV4Y2VsIHRpbWUuCisgICAgZGF0ZWNhbGMyLnBsICAgICAgICAgICAgQ2FsY3VsYXRlIGFuIEV4Y2VsIGRhdGUgdXNpbmcgRGF0ZTo6Q2FsYy4KKyAgICBsZWN4ZS5wbCAgICAgICAgICAgICAgICBDb252ZXJ0IEV4Y2VsIHRvIFdyaXRlRXhjZWwgdXNpbmcgV2luMzI6Ok9MRS4KKworCisgICAgRGV2ZWxvcGVyCisgICAgPT09PT09PT09CisgICAgY29udmVydEExLnBsICAgICAgICAgICAgSGVscGVyIGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIEExIG5vdGF0aW9uLgorICAgIGZ1bmN0aW9uX2xvY2FsZS5wbCAgICAgIEFkZCBub24tRW5nbGlzaCBmdW5jdGlvbiBuYW1lcyB0byBGb3JtdWxhLnBtLgorICAgIHdyaXRlQTEucGwgICAgICAgICAgICAgIEV4YW1wbGUgb2YgaG93IHRvIGV4dGVuZCB0aGUgbW9kdWxlLgorCisKKworPWhlYWQxIExJTUlUQVRJT05TCisKK1RoZSBmb2xsb3dpbmcgbGltaXRzIGFyZSBpbXBvc2VkIGJ5IEV4Y2VsOgorCisgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIExpbWl0CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLQorICAgIE1heGltdW0gbnVtYmVyIG9mIGNoYXJzIGluIGEgc3RyaW5nICAzMjc2NworICAgIE1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgICAgICAgICAgICAyNTYKKyAgICBNYXhpbXVtIG51bWJlciBvZiByb3dzICAgICAgICAgICAgICAgNjU1MzYKKyAgICBNYXhpbXVtIGNoYXJzIGluIGEgc2hlZXQgbmFtZSAgICAgICAgMzEKKyAgICBNYXhpbXVtIGNoYXJzIGluIGEgaGVhZGVyL2Zvb3RlciAgICAgMjU0CisKKworVGhlIG1pbmltdW0gZmlsZSBzaXplIGlzIDZLIGR1ZSB0byB0aGUgT0xFIG92ZXJoZWFkLiBUaGUgbWF4aW11bSBmaWxlIHNpemUgaXMgYXBwcm94aW1hdGVseSA3TUIgKDcwODcxMDQgYnl0ZXMpIG9mIEJJRkYgZGF0YS4gVGhpcyBjYW4gYmUgZXh0ZW5kZWQgYnkgaW5zdGFsbGluZyBUYWthbm9yaSBLYXdhaSdzIE9MRTo6U3RvcmFnZV9MaXRlIG1vZHVsZSBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc2VhcmNoP2Rpc3Q9T0xFLVN0b3JhZ2VfTGl0ZT4gc2VlIHRoZSBDPGJpZ2ZpbGUucGw+IGV4YW1wbGUgaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDEgRE9XTkxPQURJTkcKKworVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlIGlzIGFsd2F5cyBhdmFpbGFibGUgYXQ6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9zZWFyY2g/ZGlzdD1TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLz4uCisKKworCisKKz1oZWFkMSBSRVFVSVJFTUVOVFMKKworVGhpcyBtb2R1bGUgcmVxdWlyZXMgUGVybCA+PSA1LjAwNSwgUGFyc2U6OlJlY0Rlc2NlbnQsIEZpbGU6OlRlbXAgYW5kIE9MRTo6U3RvcmFnZV9MaXRlOgorCisgICAgaHR0cDovL3NlYXJjaC5jcGFuLm9yZy9zZWFyY2g/ZGlzdD1QYXJzZS1SZWNEZXNjZW50LyAjIEZvciBmb3JtdWxhcy4KKyAgICBodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9kaXN0PUZpbGUtVGVtcC8gICAgICAgICMgRm9yIHNldF90ZW1wZGlyKCkuCisgICAgaHR0cDovL3NlYXJjaC5jcGFuLm9yZy9zZWFyY2g/ZGlzdD1PTEUtU3RvcmFnZV9MaXRlLyAjIEZvciBmaWxlcyA+IDdNQi4KKworTm90ZSwgdGhlc2UgYXJlbid0IHN0cmljdCByZXF1aXJlbWVudHMuIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHdpbGwgd29yayB3aXRob3V0IHRoZXNlIG1vZHVsZXMgaWYgeW91IGRvbid0IHVzZSB3cml0ZV9mb3JtdWxhKCksIHNldF90ZW1wZGlyKCkgb3IgY3JlYXRlIGZpbGVzIGdyZWF0ZXIgdGhhbiA3TUIuIEhvd2V2ZXIsIGl0IGlzIGJlc3QgdG8gaW5zdGFsbCB0aGVtIGlmIHBvc3NpYmxlIGFuZCB0aGV5IHdpbGwgYmUgaW5zdGFsbGVkIGF1dG9tYXRpY2FsbHkgaWYgeW91IHVzZSBhIHRvb2wgc3VjaCBhcyBDUEFOLnBtIG9yIHBwbS4KKworCis9aGVhZDEgSU5TVEFMTEFUSU9OCisKK1NlZSB0aGUgSU5TVEFMTCBvciBpbnN0YWxsLmh0bWwgZG9jcyB0aGF0IGNvbWUgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIG9yOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzEvSU5TVEFMTD4uCisKKworCisKKz1oZWFkMSBQT1JUQUJJTElUWQorCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB3aWxsIHdvcmsgb24gdGhlIG1ham9yaXR5IG9mIFdpbmRvd3MsIFVOSVggYW5kIE1hY2ludG9zaCBwbGF0Zm9ybXMuIFNwZWNpZmljYWxseSwgdGhlIG1vZHVsZSB3aWxsIHdvcmsgb24gYW55IHN5c3RlbSB3aGVyZSBwZXJsIHBhY2tzIGZsb2F0cyBpbiB0aGUgNjQgYml0IElFRUUgZm9ybWF0LiBUaGUgZmxvYXQgbXVzdCBhbHNvIGJlIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0IGJ1dCBpdCB3aWxsIGJlIHJldmVyc2VkIGlmIG5lY2Vzc2FyeS4gVGh1czoKKworICAgIHByaW50IGpvaW4oJyAnLCBtYXAgeyBzcHJpbnRmICclIzAyeCcsICRfIH0gdW5wYWNrKCdDKicsIHBhY2sgJ2QnLCAxLjIzNDUpKSwgIlxuIjsKKworc2hvdWxkIGdpdmUgKG9yIGluIHJldmVyc2Ugb3JkZXIpOgorCisgICAgMHg4ZCAweDk3IDB4NmUgMHgxMiAweDgzIDB4YzAgMHhmMyAweDNmCisKK0luIGdlbmVyYWwsIGlmIHlvdSBkb24ndCBrbm93IHdoZXRoZXIgeW91ciBzeXN0ZW0gc3VwcG9ydHMgYSA2NCBiaXQgSUVFRSBmbG9hdCBvciBub3QsIGl0IHByb2JhYmx5IGRvZXMuIElmIHlvdXIgc3lzdGVtIGRvZXNuJ3QsIFdyaXRlRXhjZWwgd2lsbCBDPGNyb2FrKCk+IHdpdGggdGhlIG1lc3NhZ2UgZ2l2ZW4gaW4gdGhlIEw8RElBR05PU1RJQ1M+IHNlY3Rpb24uIFlvdSBjYW4gY2hlY2sgd2hpY2ggcGxhdGZvcm1zIHRoZSBtb2R1bGUgaGFzIGJlZW4gdGVzdGVkIG9uIGF0IHRoZSBDUEFOIHRlc3RlcnMgc2l0ZTogTDxodHRwOi8vdGVzdGVycy5jcGFuLm9yZy9zZWFyY2g/cmVxdWVzdD1kaXN0JmRpc3Q9U3ByZWFkc2hlZXQtV3JpdGVFeGNlbD4uCisKKworCisKKz1oZWFkMSBESUFHTk9TVElDUworCisKKz1vdmVyIDQKKworPWl0ZW0gRmlsZW5hbWUgcmVxdWlyZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygpCisKK0EgZmlsZW5hbWUgbXVzdCBiZSBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3IuCisKKz1pdGVtIENhbid0IG9wZW4gZmlsZW5hbWUuIEl0IG1heSBiZSBpbiB1c2Ugb3IgcHJvdGVjdGVkLgorCitUaGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkIGZvciB3cml0aW5nLiBUaGUgZGlyZWN0b3J5IHRoYXQgeW91IGFyZSB3cml0aW5nIHRvICBtYXkgYmUgcHJvdGVjdGVkIG9yIHRoZSBmaWxlIG1heSBiZSBpbiB1c2UgYnkgYW5vdGhlciBwcm9ncmFtLgorCis9aXRlbSBVbmFibGUgdG8gY3JlYXRlIHRtcCBmaWxlcyB2aWEgRmlsZTo6VGVtcDo6dGVtcGZpbGUoKS4uLgorCitUaGlzIGlzIGEgQzwtdz4gd2FybmluZy4gWW91IHdpbGwgc2VlIGl0IGlmIHlvdSBhcmUgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgdGVtcG9yYXJ5IGZpbGVzIGNhbm5vdCBiZSBjcmVhdGVkLCBpbiB3aGljaCBjYXNlIGFsbCBkYXRhIHdpbGwgYmUgc3RvcmVkIGluIG1lbW9yeS4gVGhlIHdhcm5pbmcgaXMgZm9yIGluZm9ybWF0aW9uIG9ubHk6IGl0IGRvZXMgbm90IGFmZmVjdCBjcmVhdGlvbiBidXQgaXQgd2lsbCBhZmZlY3QgdGhlIHNwZWVkIG9mIGV4ZWN1dGlvbiBmb3IgbGFyZ2UgZmlsZXMuIFNlZSB0aGUgQzxzZXRfdGVtcGRpcj4gd29ya2Jvb2sgbWV0aG9kLgorCisKKz1pdGVtIE1heGltdW0gZmlsZSBzaXplLCA3MDg3MTA0LCBleGNlZWRlZC4KKworVGhlIGN1cnJlbnQgT0xFIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgYSBtYXhpbXVtIEJJRkYgZmlsZSBvZiB0aGlzIHNpemUuIFRoaXMgbGltaXQgY2FuIGJlIGV4dGVuZGVkLCBzZWUgdGhlIEw8TElNSVRBVElPTlM+IHNlY3Rpb24uCisKKz1pdGVtIENhbid0IGxvY2F0ZSBQYXJzZS9SZWNEZXNjZW50LnBtIGluIEBJTkMgLi4uCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHJlcXVpcmVzIHRoZSBQYXJzZTo6UmVjRGVzY2VudCBtb2R1bGUuIERvd25sb2FkIGl0IGZyb20gQ1BBTjogTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9kaXN0PVBhcnNlLVJlY0Rlc2NlbnQ+CisKKz1pdGVtIENvdWxkbid0IHBhcnNlIGZvcm11bGEgLi4uCisKK1RoZXJlIGFyZSBhIGxhcmdlIG51bWJlciBvZiB3YXJuaW5ncyB3aGljaCByZWxhdGUgdG8gYmFkbHkgZm9ybWVkIGZvcm11bGFzIGFuZCBmdW5jdGlvbnMuIFNlZSB0aGUgTDxGT1JNVUxBUyBBTkQgRlVOQ1RJT05TIElOIEVYQ0VMPiBzZWN0aW9uIGZvciBzdWdnZXN0aW9ucyBvbiBob3cgdG8gYXZvaWQgdGhlc2UgZXJyb3JzLiBZb3Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGZvcm11bGEgaW4gRXhjZWwgdG8gZW5zdXJlIHRoYXQgaXQgaXMgdmFsaWQuCisKKz1pdGVtIFJlcXVpcmVkIGZsb2F0aW5nIHBvaW50IGZvcm1hdCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uCisKK09wZXJhdGluZyBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IDY0IGJpdCBJRUVFIGZsb2F0IG9yIGl0IGlzIGJ5dGUtb3JkZXJlZCBpbiBhIHdheSB1bmtub3duIHRvIFdyaXRlRXhjZWwuCisKKworPWl0ZW0gJ2ZpbGUueGxzJyBjYW5ub3QgYmUgYWNjZXNzZWQuIFRoZSBmaWxlIG1heSBiZSByZWFkLW9ubHkgLi4uCisKK1lvdSBtYXkgc29tZXRpbWVzIGVuY291bnRlciB0aGUgZm9sbG93aW5nIGVycm9yIHdoZW4gdHJ5aW5nIHRvIG9wZW4gYSBmaWxlIGluIEV4Y2VsOiAiZmlsZS54bHMgY2Fubm90IGJlIGFjY2Vzc2VkLiBUaGUgZmlsZSBtYXkgYmUgcmVhZC1vbmx5LCBvciB5b3UgbWF5IGJlIHRyeWluZyB0byBhY2Nlc3MgYSByZWFkLW9ubHkgbG9jYXRpb24uIE9yLCB0aGUgc2VydmVyIHRoZSBkb2N1bWVudCBpcyBzdG9yZWQgb24gbWF5IG5vdCBiZSByZXNwb25kaW5nLiIKKworVGhpcyBlcnJvciBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGUgRXhjZWwgZmlsZSBoYXMgYmVlbiBjb3JydXB0ZWQuIFRoZXJlIGFyZSB0d28gbGlrZWx5IGNhdXNlcyBvZiB0aGlzOiB0aGUgZmlsZSB3YXMgRlRQZWQgaW4gQVNDSUkgbW9kZSBpbnN0ZWFkIG9mIGJpbmFyeSBtb2RlIG9yIGVsc2UgdGhlIGZpbGUgd2FzIGNyZWF0ZWQgd2l0aCBDPFVURi04PiBkYXRhIHJldHVybmVkIGJ5IGFuIFhNTCBwYXJzZXIuIFNlZSBMPFdhcm5pbmcgYWJvdXQgWE1MOjpQYXJzZXIgYW5kIHBlcmwgNS42PiBmb3IgZnVydGhlciBkZXRhaWxzLgorCis9YmFjaworCisKKworCis9aGVhZDEgVEhFIEVYQ0VMIEJJTkFSWSBGT1JNQVQKKworVGhlIGZvbGxvd2luZyBpcyBzb21lIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEV4Y2VsIGJpbmFyeSBmb3JtYXQgZm9yIGFueW9uZSB3aG8gbWF5IGJlIGludGVyZXN0ZWQuCisKK0V4Y2VsIGRhdGEgaXMgc3RvcmVkIGluIHRoZSAiQmluYXJ5IEludGVyY2hhbmdlIEZpbGUgRm9ybWF0IiAoQklGRikgZmlsZSBmb3JtYXQuIERldGFpbHMgb2YgdGhpcyBmb3JtYXQgYXJlIGdpdmVuIGluICJFeGNlbCA5Ny0yMDA3IEJpbmFyeSBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIiBMPGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9pbnRlcm9wL2RvY3MvT2ZmaWNlQmluYXJ5Rm9ybWF0cy5tc3B4Pi4KKworRGFuaWVsIFJlbnR6IG9mIE9wZW5PZmZpY2Uub3JnIGhhcyBhbHNvIHdyaXR0ZW4gYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgRXhjZWwgd29ya2Jvb2sgcmVjb3Jkcywgc2VlIEw8aHR0cDovL3NjLm9wZW5vZmZpY2Uub3JnL2V4Y2VsZmlsZWZvcm1hdC5wZGY+LgorCitDaGFybGVzIFd5YmJsZSBoYXMgY29sbGVjdGVkIHRvZ2V0aGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEV4Y2VsIGZpbGUgZm9ybWF0LiBTZWUgIlRoZSBDaGljYWdvIFByb2plY3QiIGF0IEw8aHR0cDovL2NoaWNhZ28uc291cmNlZm9yZ2UubmV0L2RldmVsLz4uCisKK1RoZSBCSUZGIGRhdGEgaXMgc3RvcmVkIGFsb25nIHdpdGggb3RoZXIgZGF0YSBpbiBhbiBPTEUgQ29tcG91bmQgRmlsZS4gVGhpcyBpcyBhIHN0cnVjdHVyZWQgc3RvcmFnZSB3aGljaCBhY3RzIGxpa2UgYSBmaWxlIHN5c3RlbSB3aXRoaW4gYSBmaWxlLiBBIENvbXBvdW5kIEZpbGUgaXMgY29tcHJpc2VkIG9mIHN0b3JhZ2VzIGFuZCBzdHJlYW1zIHdoaWNoLCB0byBmb2xsb3cgdGhlIGZpbGUgc3lzdGVtIGFuYWxvZ3ksIGFyZSBsaWtlIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KKworVGhlIE9MRSBmb3JtYXQgaXMgZXhwbGFpbmVkIGluIHRoZSAiV2luZG93cyBDb21wb3VuZCBCaW5hcnkgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIgTDxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaW50ZXJvcC9kb2NzL3N1cHBvcnRpbmd0ZWNobm9sb2dpZXMubXNweD4KKworVGhlIERpZ2l0YWwgSW1hZ2luZyBHcm91cCBoYXZlIGFsc28gZGV0YWlsZWQgdGhlIE9MRSBmb3JtYXQgaW4gdGhlIEpQRUcyMDAwIHNwZWNpZmljYXRpb246IHNlZSBBcHBlbmRpeCBBIG9mIEw8aHR0cDovL3d3dy5pM2Eub3JnL3BkZi93ZzFuMTAxNy5wZGY+LgorCitQbGVhc2Ugbm90ZSB0aGF0IHRoZSBwcm92aXNpb24gb2YgdGhpcyBpbmZvcm1hdGlvbiBkb2VzIG5vdCBjb25zdGl0dXRlIGFuIGludml0YXRpb24gdG8gc3RhcnQgaGFja2luZyBhdCB0aGUgQklGRiBvciBPTEUgZmlsZSBmb3JtYXRzLiBUaGVyZSBhcmUgbW9yZSBpbnRlcmVzdGluZyB3YXlzIHRvIHdhc3RlIHlvdXIgdGltZS4gOy0pCisKKworCisKKz1oZWFkMSBXUklUSU5HIEVYQ0VMIEZJTEVTCisKK0RlcGVuZGluZyBvbiB5b3VyIHJlcXVpcmVtZW50cywgYmFja2dyb3VuZCBhbmQgZ2VuZXJhbCBzZW5zaWJpbGl0aWVzIHlvdSBtYXkgcHJlZmVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb2YgZ2V0dGluZyBkYXRhIGludG8gRXhjZWw6CisKKz1vdmVyIDQKKworPWl0ZW0gKiBXaW4zMjo6T0xFIG1vZHVsZSBhbmQgb2ZmaWNlIGF1dG9tYXRpb24KKworVGhpcyByZXF1aXJlcyBhIFdpbmRvd3MgcGxhdGZvcm0gYW5kIGFuIGluc3RhbGxlZCBjb3B5IG9mIEV4Y2VsLiBUaGlzIGlzIHRoZSBtb3N0IHBvd2VyZnVsIGFuZCBjb21wbGV0ZSBtZXRob2QgZm9yIGludGVyZmFjaW5nIHdpdGggRXhjZWwuIFNlZSBMPGh0dHA6Ly93d3cuYWN0aXZlc3RhdGUuY29tL0FTUE4vUmVmZXJlbmNlL1Byb2R1Y3RzL0FjdGl2ZVBlcmwtNS42L2ZhcS9XaW5kb3dzL0FjdGl2ZVBlcmwtV2luZmFxMTIuaHRtbD4gYW5kIEw8aHR0cDovL3d3dy5hY3RpdmVzdGF0ZS5jb20vQVNQTi9SZWZlcmVuY2UvUHJvZHVjdHMvQWN0aXZlUGVybC01LjYvc2l0ZS9saWIvV2luMzIvT0xFLmh0bWw+LiBJZiB5b3VyIG1haW4gcGxhdGZvcm0gaXMgVU5JWCBidXQgeW91IGhhdmUgdGhlIHJlc291cmNlcyB0byBzZXQgdXAgYSBzZXBhcmF0ZSBXaW4zMi9NU09mZmljZSBzZXJ2ZXIsIHlvdSBjYW4gY29udmVydCBvZmZpY2UgZG9jdW1lbnRzIHRvIHRleHQsIHBvc3RzY3JpcHQgb3IgUERGIHVzaW5nIFdpbjMyOjpPTEUuIEZvciBhIGRlbW9uc3RyYXRpb24gb2YgaG93IHRvIGRvIHRoaXMgdXNpbmcgUGVybCBzZWUgRG9jc2VydmVyOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc2VhcmNoP21vZGU9bW9kdWxlJnF1ZXJ5PWRvY3NlcnZlcj4uCisKKz1pdGVtICogQ1NWLCBjb21tYSBzZXBhcmF0ZWQgdmFyaWFibGVzIG9yIHRleHQKKworSWYgdGhlIGZpbGUgZXh0ZW5zaW9uIGlzIEM8Y3N2PiwgRXhjZWwgd2lsbCBvcGVuIGFuZCBjb252ZXJ0IHRoaXMgZm9ybWF0IGF1dG9tYXRpY2FsbHkuIEdlbmVyYXRpbmcgYSB2YWxpZCBDU1YgZmlsZSBpc24ndCBhcyBlYXN5IGFzIGl0IHNlZW1zLiBIYXZlIGEgbG9vayBhdCB0aGUgREJEOjpSQU0sIERCRDo6Q1NWLCBUZXh0Ojp4U1YgYW5kIFRleHQ6OkNTVl9YUyBtb2R1bGVzLgorCis9aXRlbSAqIERCSSB3aXRoIERCRDo6QURPIG9yIERCRDo6T0RCQworCitFeGNlbCBmaWxlcyBjb250YWluIGFuIGludGVybmFsIGluZGV4IHRhYmxlIHRoYXQgYWxsb3dzIHRoZW0gdG8gYWN0IGxpa2UgYSBkYXRhYmFzZSBmaWxlLiBVc2luZyBvbmUgb2YgdGhlIHN0YW5kYXJkIFBlcmwgZGF0YWJhc2UgbW9kdWxlcyB5b3UgY2FuIGNvbm5lY3QgdG8gYW4gRXhjZWwgZmlsZSBhcyBhIGRhdGFiYXNlLgorCis9aXRlbSAqIERCRDo6RXhjZWwKKworWW91IGNhbiBhbHNvIGFjY2VzcyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB1c2luZyB0aGUgc3RhbmRhcmQgREJJIGludGVyZmFjZSB2aWEgVGFrYW5vcmkgS2F3YWkncyBEQkQ6OkV4Y2VsIG1vZHVsZSBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9EQkQtRXhjZWw+CisKKz1pdGVtICogU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWxYTUwKKworVGhpcyBtb2R1bGUgYWxsb3dzIHlvdSB0byBjcmVhdGUgYW4gRXhjZWwgWE1MIGZpbGUgdXNpbmcgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLiBTZWU6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L1NwcmVhZHNoZWV0LVdyaXRlRXhjZWxYTUw+CisKKz1pdGVtICogRXhjZWw6OlRlbXBsYXRlCisKK1RoaXMgbW9kdWxlIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuIEV4Y2VsIGZpbGUgZnJvbSBhbiBYTUwgdGVtcGxhdGUgaW4gYSBtYW5uZXIgc2ltaWxhciB0byBIVE1MOjpUZW1wbGF0ZS4gU2VlIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L0V4Y2VsLVRlbXBsYXRlLz4uCisKKz1pdGVtICogU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZyb21YTUwKKworVGhpcyBtb2R1bGUgYWxsb3dzIHlvdSB0byB0dXJuIGEgc2ltcGxlIFhNTCBmaWxlIGludG8gYW4gRXhjZWwgZmlsZSB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhcyBhIGJhY2stZW5kLiBUaGUgZm9ybWF0IG9mIHRoZSBYTUwgZmlsZSBpcyBkZWZpbmVkIGJ5IGEgc3VwcGxpZWQgRFREOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLUZyb21YTUw+LgorCis9aXRlbSAqIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpTaW1wbGUKKworVGhpcyBwcm92aWRlcyBhbiBlYXNpZXIgaW50ZXJmYWNlIHRvIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLVNpbXBsZT4uCisKKz1pdGVtICogU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZyb21EQgorCitUaGlzIGlzIGEgdXNlZnVsIG1vZHVsZSBmb3IgY3JlYXRpbmcgRXhjZWwgZmlsZXMgZGlyZWN0bHkgZnJvbSBhIERCIHRhYmxlOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLUZyb21EQj4uCisKKz1pdGVtICogSFRNTCB0YWJsZXMKKworVGhpcyBpcyBhbiBlYXN5IHdheSBvZiBhZGRpbmcgZm9ybWF0dGluZyB2aWEgYSB0ZXh0IGJhc2VkIGZvcm1hdC4KKworPWl0ZW0gKiBYTUwgb3IgSFRNTAorCitUaGUgRXhjZWwgWE1MIGFuZCBIVE1MIGZpbGUgc3BlY2lmaWNhdGlvbiBhcmUgYXZhaWxhYmxlIGZyb20gTDxodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvb2ZmaWNlZGV2L29meG1sMmsvb2Z4bWwyay5odG0+LgorCis9YmFjaworCitGb3Igb3RoZXIgUGVybC1FeGNlbCBtb2R1bGVzIHRyeSB0aGUgZm9sbG93aW5nIHNlYXJjaDogTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9tb2RlPW1vZHVsZSZxdWVyeT1leGNlbD4uCisKKworCisKKz1oZWFkMSBSRUFESU5HIEVYQ0VMIEZJTEVTCisKK1RvIHJlYWQgZGF0YSBmcm9tIEV4Y2VsIGZpbGVzIHRyeToKKworPW92ZXIgNAorCis9aXRlbSAqIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsCisKK1RoaXMgdXNlcyB0aGUgT0xFOjpTdG9yYWdlLUxpdGUgbW9kdWxlIHRvIGV4dHJhY3QgZGF0YSBmcm9tIGFuIEV4Y2VsIGZpbGUuIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L1NwcmVhZHNoZWV0LVBhcnNlRXhjZWw+LgorCis9aXRlbSAqIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsX1hMSFRNTAorCitUaGlzIG1vZHVsZSB1c2VzIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsJ3MgaW50ZXJmYWNlIGJ1dCB1c2VzIHhsSHRtbCAoc2VlIGJlbG93KSB0byBkbyB0aGUgY29udmVyc2lvbjogTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL2Rpc3QvU3ByZWFkc2hlZXQtUGFyc2VFeGNlbF9YTEhUTUw+CitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbF9YTEhUTUwKKworPWl0ZW0gKiB4bEh0bWwKKworVGhpcyBpcyBhbiBvcGVuIHNvdXJjZSAiRXhjZWwgdG8gSFRNTCBDb252ZXJ0ZXIiIEMvQysrIHByb2plY3QgYXQgTDxodHRwOi8vY2hpY2Fnby5zb3VyY2Vmb3JnZS5uZXQveGxodG1sLz4uCisKKz1pdGVtICogREJEOjpFeGNlbCAocmVhZGluZykKKworWW91IGNhbiBhbHNvIGFjY2VzcyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCB1c2luZyB0aGUgc3RhbmRhcmQgREJJIGludGVyZmFjZSB2aWEgIFRha2Fub3JpIEthd2FpJ3MgREJEOjpFeGNlbCBtb2R1bGUgTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL2Rpc3QvREJELUV4Y2VsPi4KKworPWl0ZW0gKiBXaW4zMjo6T0xFIG1vZHVsZSBhbmQgb2ZmaWNlIGF1dG9tYXRpb24gKHJlYWRpbmcpCisKK1NlZSwgdGhlIHNlY3Rpb24gTDxXUklUSU5HIEVYQ0VMIEZJTEVTPi4KKworPWl0ZW0gKiBIVE1MIHRhYmxlcyAocmVhZGluZykKKworSWYgdGhlIGZpbGVzIGFyZSBzYXZlZCBmcm9tIEV4Y2VsIGluIGEgSFRNTCBmb3JtYXQgdGhlIGRhdGEgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIEhUTUw6OlRhYmxlRXh0cmFjdCBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9IVE1MLVRhYmxlRXh0cmFjdD4uCisKKz1pdGVtICogREJJIHdpdGggREJEOjpBRE8gb3IgREJEOjpPREJDLgorCitTZWUsIHRoZSBzZWN0aW9uIEw8V1JJVElORyBFWENFTCBGSUxFUz4uCisKKz1pdGVtICogWE1MOjpFeGNlbAorCitDb252ZXJ0cyBFeGNlbCBmaWxlcyB0byBYTUwgdXNpbmcgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL2Rpc3QvWE1MLUV4Y2VsPi4KKworPWl0ZW0gKiBPTEU6OlN0b3JhZ2UsIGFrYSBMQU9MQQorCitUaGlzIGlzIGEgUGVybCBpbnRlcmZhY2UgdG8gT0xFIGZpbGUgZm9ybWF0cy4gSW4gcGFydGljdWxhciwgdGhlIGRpc3RybyBjb250YWlucyBhbiBFeGNlbCB0byBIVE1MIGNvbnZlcnRlciBjYWxsZWQgSGVyYmVydCwgTDxodHRwOi8vdXNlci5jcy50dS1iZXJsaW4uZGUvfnNjaHdhcnR6L3BtaC8+LiBUaGlzIGhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgdGhlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIG1vZHVsZS4KKworPWJhY2sKKworCitGb3Igb3RoZXIgUGVybC1FeGNlbCBtb2R1bGVzIHRyeSB0aGUgZm9sbG93aW5nIHNlYXJjaDogTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9tb2RlPW1vZHVsZSZxdWVyeT1leGNlbD4uCisKK0lmIHlvdSB3aXNoIHRvIHZpZXcgRXhjZWwgZmlsZXMgb24gYSBVTklYL0xpbnV4IHBsYXRmb3JtIGNoZWNrIG91dCB0aGUgZXhjZWxsZW50IEdudW1lcmljIHNwcmVhZHNoZWV0IGFwcGxpY2F0aW9uIGF0IEw8aHR0cDovL3d3dy5nbm9tZS5vcmcvcHJvamVjdHMvZ251bWVyaWMvPiBvciBPcGVuT2ZmaWNlLm9yZyBhdCBMPGh0dHA6Ly93d3cub3Blbm9mZmljZS5vcmcvPi4KKworSWYgeW91IHdpc2ggdG8gdmlldyBFeGNlbCBmaWxlcyBvbiBhIFdpbmRvd3MgcGxhdGZvcm0gd2hpY2ggZG9lc24ndCBoYXZlIEV4Y2VsIGluc3RhbGxlZCB5b3UgY2FuIHVzZSB0aGUgZnJlZSBNaWNyb3NvZnQgRXhjZWwgVmlld2VyIEw8aHR0cDovL29mZmljZS5taWNyb3NvZnQuY29tL2Rvd25sb2Fkcy8yMDAwL3hsdmlld2VyLmFzcHg+LgorCisKKworCis9aGVhZDEgTU9ESUZZSU5HIEFORCBSRVdSSVRJTkcgRVhDRUwgRklMRVMKKworQW4gRXhjZWwgZmlsZSBpcyBhIGJpbmFyeSBmaWxlIHdpdGhpbiBhIGJpbmFyeSBmaWxlLiBJdCBjb250YWlucyBzZXZlcmFsIGludGVybGlua2VkIGNoZWNrc3VtcyBhbmQgY2hhbmdpbmcgZXZlbiBvbmUgYnl0ZSBjYW4gY2F1c2UgaXQgdG8gYmVjb21lIGNvcnJ1cHRlZC4KKworQXMgc3VjaCB5b3UgY2Fubm90IHNpbXBseSBhcHBlbmQgb3IgdXBkYXRlIGFuIEV4Y2VsIGZpbGUuIFRoZSBvbmx5IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gcmVhZCB0aGUgZW50aXJlIGZpbGUgaW50byBtZW1vcnksIG1ha2UgdGhlIHJlcXVpcmVkIGNoYW5nZXMgb3IgYWRkaXRpb25zIGFuZCB0aGVuIHdyaXRlIHRoZSBmaWxlIG91dCBhZ2Fpbi4KKworWW91IGNhbiByZWFkIGFuZCByZXdyaXRlIGFuIEV4Y2VsIGZpbGUgdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyIG1vZHVsZSB3aGljaCBpcyBhIHdyYXBwZXIgYXJvdW5kIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIGFuZCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4gSXQgaXMgcGFydCBvZiB0aGUgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgcGFja2FnZTogTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9kaXN0PVNwcmVhZHNoZWV0LVBhcnNlRXhjZWw+LgorCitIb3dldmVyLCB5b3UgY2FuIG9ubHkgcmV3cml0ZSB0aGUgZmVhdHVyZXMgdGhhdCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBzdXBwb3J0cyBzbyBtYWNyb3MsIGdyYXBocyBhbmQgc29tZSBvdGhlciBmZWF0dXJlcyBpbiB0aGUgb3JpZ2luYWwgRXhjZWwgZmlsZSB3aWxsIGJlIGxvc3QuIEFsc28sIGZvcm11bGFzIGFyZW4ndCByZXdyaXR0ZW4sIG9ubHkgdGhlIHJlc3VsdCBvZiBhIGZvcm11bGEgaXMgd3JpdHRlbi4KKworSGVyZSBpcyBhbiBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI7CisKKyAgICAjIE9wZW4gdGhlIHRlbXBsYXRlIHdpdGggU2F2ZVBhcnNlcgorICAgIG15ICRwYXJzZXIgICA9IG5ldyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjsKKyAgICBteSAkdGVtcGxhdGUgPSAkcGFyc2VyLT5QYXJzZSgndGVtcGxhdGUueGxzJyk7CisKKyAgICBteSAkc2hlZXQgICAgPSAwOworICAgIG15ICRyb3cgICAgICA9IDA7CisgICAgbXkgJGNvbCAgICAgID0gMDsKKworICAgICMgR2V0IHRoZSBmb3JtYXQgZnJvbSB0aGUgY2VsbAorICAgIG15ICRmb3JtYXQgICA9ICR0ZW1wbGF0ZS0+e1dvcmtzaGVldH1bJHNoZWV0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+e0NlbGxzfVskcm93XVskY29sXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+e0Zvcm1hdE5vfTsKKworICAgICMgV3JpdGUgZGF0YSB0byBzb21lIGNlbGxzCisgICAgJHRlbXBsYXRlLT5BZGRDZWxsKDAsICRyb3csICAgJGNvbCwgICAxLCAgICAgJGZvcm1hdCk7CisgICAgJHRlbXBsYXRlLT5BZGRDZWxsKDAsICRyb3crMSwgJGNvbCwgIkhlbGxvIiwgJGZvcm1hdCk7CisKKyAgICAjIEFkZCBhIG5ldyB3b3Jrc2hlZXQKKyAgICAkdGVtcGxhdGUtPkFkZFdvcmtzaGVldCgnTmV3IERhdGEnKTsKKworICAgICMgVGhlIFNhdmVQYXJzZXIgU2F2ZUFzKCkgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYQorICAgICMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgb2JqZWN0LiBJZiB5b3Ugd2lzaCB5b3UgY2FuIHRoZW4KKyAgICAjIHVzZSB0aGlzIHRvIGFjY2VzcyBhbnkgb2YgdGhlIG1ldGhvZHMgdGhhdCBhcmVuJ3QKKyAgICAjIGF2YWlsYWJsZSBmcm9tIHRoZSBTYXZlUGFyc2VyIG9iamVjdC4gSWYgeW91IGRvbid0IG5lZWQKKyAgICAjIHRvIGRvIHRoaXMganVzdCB1c2UgU2F2ZUFzKCkuCisgICAgIworICAgIG15ICR3b3JrYm9vazsKKworICAgIHsKKyAgICAgICAgIyBTYXZlQXMgZ2VuZXJhdGVzIGEgbG90IG9mIGhhcm1sZXNzIHdhcm5pbmdzIGFib3V0IHVuc2V0CisgICAgICAgICMgV29ya3NoZWV0IHByb3BlcnRpZXMuIFlvdSBjYW4gaWdub3JlIHRoZW0gaWYgeW91IHdpc2guCisgICAgICAgIGxvY2FsICReVyA9IDA7CisKKyAgICAgICAgIyBSZXdyaXRlIHRoZSBmaWxlIG9yIHNhdmUgYXMgYSBuZXcgZmlsZQorICAgICAgICAkd29ya2Jvb2sgPSAkdGVtcGxhdGUtPlNhdmVBcygnbmV3LnhscycpOworICAgIH0KKworICAgICMgVXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1ldGhvZHMKKyAgICBteSAkd29ya3NoZWV0ICA9ICR3b3JrYm9vay0+c2hlZXRzKDApOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdysyLCAkY29sLCAiV29ybGQyIik7CisKKyAgICAkd29ya2Jvb2stPmNsb3NlKCk7CisKKworCisKKz1oZWFkMSBXYXJuaW5nIGFib3V0IFhNTDo6UGFyc2VyIGFuZCBwZXJsIDUuNgorCitZb3UgbXVzdCBiZSBjYXJlZnVsIHdoZW4gdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaW4gY29uanVuY3Rpb24gd2l0aCBwZXJsIDUuNiBhbmQgWE1MOjpQYXJzZXIgKGFuZCBvdGhlciBYTUwgcGFyc2VycykgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHBhcnNlciBpcyBnZW5lcmFsbHkgaW4gQzxVVEYtOD4gZm9ybWF0LgorCitXaGVuIEM8VVRGLTg+IHN0cmluZ3MgYXJlIGFkZGVkIHRvIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsJ3MgaW50ZXJuYWwgZGF0YSBpdCBjYXVzZXMgdGhlIGdlbmVyYXRlZCBFeGNlbCBmaWxlIHRvIGJlY29tZSBjb3JydXB0LgorCitOb3RlLCB0aGlzIGRvZXNuJ3QgYWZmZWN0IHBlcmwgNS4wMDUgKHdoaWNoIGRvZXNuJ3QgdHJ5IHRvIGhhbmRsZSBDPFVURi04Pikgb3IgNS44ICh3aGljaCBoYW5kbGVzIGl0IGNvcnJlY3RseSkuCisKK1RvIGF2b2lkIHRoaXMgcHJvYmxlbSB5b3Ugc2hvdWxkIHVwZ3JhZGUgdG8gcGVybCA1LjgsIGlmIHBvc3NpYmxlLCBvciBlbHNlIHlvdSBzaG91bGQgY29udmVydCB0aGUgb3V0cHV0IGRhdGEgZnJvbSBYTUw6OlBhcnNlciB0byBBU0NJSSBvciBJU08tODg1OS0xIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKKyAgICAkbmV3X3N0ciA9IHBhY2sgJ0MqJywgdW5wYWNrICdVKicsICR1dGY4X3N0cjsKKworCisgICAgdXNlIFVuaWNvZGU6Ok1hcFVURjggJ2Zyb21fdXRmOCc7CisgICAgJG5ld19zdHIgPSBmcm9tX3V0Zjgoey1zdHIgPT4gJHV0Zjhfc3RyLCAtY2hhcnNldCA9PiAnSVNPLTg4NTktMSd9KTsKKworCisKKworPWhlYWQxIFdhcm5pbmcgYWJvdXQgT2ZmaWNlIFNlcnZpY2UgUGFjayAzCisKK0lmIHlvdSBoYXZlIE9mZmljZSBTZXJ2aWNlIFBhY2sgMyAoU1AzKSBpbnN0YWxsZWQgeW91IG1heSBzZWUgdGhlIGZvbGxvd2luZyB3YXJuaW5nIHdoZW4geW91IG9wZW4gYSBmaWxlIGNyZWF0ZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6CisKKyAgICAiRmlsZSBFcnJvcjogZGF0YSBtYXkgaGF2ZSBiZWVuIGxvc3QiLgorCitUaGlzIGlzIHVzdWFsbHkgY2F1c2VkIGJ5IG11bHRpcGxlIGluc3RhbmNlcyBvZiBkYXRhIGluIGEgY2VsbC4KKworU1AzIGNoYW5nZWQgRXhjZWwncyBkZWZhdWx0IGJlaGF2aW91ciB3aGVuIGl0IGVuY291bnRlcnMgbXVsdGlwbGUgZGF0YSBpbiBhIGNlbGwgc28gdGhhdCBpdCBpc3N1ZXMgYSB3YXJuaW5nIHdoZW4gdGhlIGZpbGUgaXMgb3BlbmVkIGFuZCBpdCBkaXNwbGF5cyB0aGUgZmlyc3QgZGF0YSB0aGF0IHdhcyB3cml0dGVuLiBQcmlvciB0byBTUDMgaXQgZGlkbid0IGlzc3VlIGEgd2FybmluZyBhbmQgZGlzcGxheWVkIHRoZSBsYXN0IGRhdGEgd3JpdHRlbi4KKworRm9yIGEgbG9uZ2VyIGRpc2N1c3Npb24gYW5kIHNvbWUgd29ya2Fyb3VuZHMgc2VlIHRoZSBmb2xsb3dpbmc6IEw8aHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3NwcmVhZHNoZWV0LXdyaXRlZXhjZWwvYnJvd3NlX3RocmVhZC90aHJlYWQvM2RjZWE0MGU2NjIwYWYzYT4uCisKKworCisKKz1oZWFkMSBCVUdTCisKK0Zvcm11bGFzIGFyZSBmb3JtdWxhZS4KKworWE1MIGFuZCBDPFVURi04PiBkYXRhIG9uIHBlcmwgNS42IGNhbiBjYXVzZSBFeGNlbCBmaWxlcyBjcmVhdGVkIGJ5IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRvIGJlY29tZSBjb3JydXB0LiBTZWUgTDxXYXJuaW5nIGFib3V0IFhNTDo6UGFyc2VyIGFuZCBwZXJsIDUuNj4gZm9yIGZ1cnRoZXIgZGV0YWlscy4KKworVGhlIGZvcm1hdCBvYmplY3QgdGhhdCBpcyB1c2VkIHdpdGggYSBDPG1lcmdlX3JhbmdlKCk+IG1ldGhvZCBjYWxsIGlzIG1hcmtlZCBpbnRlcm5hbGx5IGFzIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCBhIG1lcmdlZCByYW5nZS4gSXQgaXMgYSBmYXRhbCBlcnJvciB0byB1c2UgYSBtZXJnZWQgZm9ybWF0IGluIGEgbm9uLW1lcmdlZCBjZWxsLiBUaGUgY3VycmVudCB3b3JrYXJvdW5kIGlzIHRvIHVzZSBzZXBhcmF0ZSBmb3JtYXRzIGZvciBtZXJnZWQgYW5kIG5vbi1tZXJnZWQgY2VsbC4gVGhpcyByZXN0cmljdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKworTmVzdGVkIGZvcm11bGFzIHNvbWV0aW1lcyBhcmVuJ3QgcGFyc2VkIGNvcnJlY3RseSBhbmQgZ2l2ZSBhIHJlc3VsdCBvZiAiI1ZBTFVFIi4gSWYgeW91IGNvbWUgYWNyb3NzIGEgZm9ybXVsYSB0aGF0IHBhcnNlcyBsaWtlIHRoaXMsIGxldCBtZSBrbm93LgorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDogQWxsIGZvcm11bGFzIGNyZWF0ZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYXJlIHJlYWQgYXMgaGF2aW5nIGEgdmFsdWUgb2YgemVyby4gVGhpcyBpcyBiZWNhdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG9ubHkgc3RvcmVzIHRoZSBmb3JtdWxhIGFuZCBub3QgdGhlIGNhbGN1bGF0ZWQgcmVzdWx0LgorCitPcGVuT2ZmaWNlLm9yZzogTm8ga25vd24gaXNzdWVzIGluIHRoaXMgcmVsZWFzZS4KKworR251bWVyaWM6IE5vIGtub3duIGlzc3VlcyBpbiB0aGlzIHJlbGVhc2UuCisKK0lmIHlvdSB3aXNoIHRvIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgcnVuIHRoZSBDPGJ1Z19yZXBvcnQucGw+IHByb2dyYW0gaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDEgVE8gRE8KKworVGhlIHJvYWRtYXAgaXMgYXMgZm9sbG93czoKKworPW92ZXIgNAorCis9aXRlbSAqIEVuaGFuY2UgbmFtZWQgcmFuZ2VzLgorCis9YmFjaworCitBbHNvLCBoZXJlIGFyZSBzb21lIG9mIHRoZSBtb3N0IHJlcXVlc3RlZCBmZWF0dXJlcyB0aGF0IHByb2JhYmx5IHdvbid0IGdldCBhZGRlZDoKKworPW92ZXIgNAorCis9aXRlbSAqIE1hY3Jvcy4KKworVGhpcyB3b3VsZCBzb2x2ZSBzb21lIG90aGVyIHByb2JsZW1zIG5lYXRseS4gSG93ZXZlciwgdGhlIGZvcm1hdCBvZiBFeGNlbCBtYWNyb3MgaXNuJ3QgZG9jdW1lbnRlZC4KKworPWl0ZW0gKiBTb21lIGZlYXR1cmUgdGhhdCB5b3UgcmVhbGx5IG5lZWQuIDstKQorCisKKz1iYWNrCisKK0lmIHRoZXJlIGlzIHNvbWUgZmVhdHVyZSBvZiBhbiBFeGNlbCBmaWxlIHRoYXQgeW91IHJlYWxseSwgcmVhbGx5IG5lZWQgdGhlbiB5b3Ugc2hvdWxkIHVzZSBXaW4zMjo6T0xFIHdpdGggRXhjZWwgb24gV2luZG93cy4gSWYgeW91IGFyZSBvbiBVbml4IHlvdSBjb3VsZCBjb25zaWRlciBjb25uZWN0aW5nIHRvIGEgV2luZG93cyBzZXJ2ZXIgdmlhIERvY3NlcnZlciBvciBTT0FQLCBzZWUgTDxXUklUSU5HIEVYQ0VMIEZJTEVTPi4KKworCisKKworPWhlYWQxIFJFUE9TSVRPUlkKKworVGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHNvdXJjZSBjb2RlIGluIGhvc3Qgb24gZ2l0aHViOiBMPGh0dHA6Ly9naXRodWIuY29tL2ptY25hbWFyYS9zcHJlYWRzaGVldC13cml0ZWV4Y2VsPi4KKworCisKKworPWhlYWQxIE1BSUxJTkcgTElTVAorCitUaGVyZSBpcyBhIEdvb2dsZSBncm91cCBmb3IgZGlzY3Vzc2luZyBhbmQgYXNraW5nIHF1ZXN0aW9ucyBhYm91dCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4gVGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gc2VhcmNoIHRvIHNlZSBpZiB5b3VyIHF1ZXN0aW9uIGhhcyBiZWVuIGFza2VkIGJlZm9yZTogIEw8aHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3NwcmVhZHNoZWV0LXdyaXRlZXhjZWw+LgorCis9YmVnaW4gaHRtbAorCis8Y2VudGVyPgorPHRhYmxlIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyBwYWRkaW5nOiA1cHg7IiBjZWxsc3BhY2luZz0wPgorICA8dHI+PHRkPgorICA8aW1nIHNyYz0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2ludGwvZW4vaW1hZ2VzL2xvZ29zL2dyb3Vwc19sb2dvX3NtLmdpZiIKKyAgICAgICAgIGhlaWdodD0zMCB3aWR0aD0xNDAgYWx0PSJHb29nbGUgR3JvdXBzIj4KKyAgPC90ZD48L3RyPgorICA8dHI+PHRkPgorICA8YSBocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvc3ByZWFkc2hlZXQtd3JpdGVleGNlbCI+U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw8L2E+CisgIDwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L2NlbnRlcj4KKworPWVuZCBodG1sCisKKworCitBbHRlcm5hdGl2ZWx5IHlvdSBjYW4ga2VlcCB1cCB0byBkYXRlIHdpdGggZnV0dXJlIHJlbGVhc2VzIGJ5IHN1YnNjcmliaW5nIGF0OgorTDxodHRwOi8vZnJlc2htZWF0Lm5ldC9wcm9qZWN0cy93cml0ZWV4Y2VsLz4uCisKKworCisKKz1oZWFkMSBET05BVElPTlMKKworSWYgeW91J2QgY2FyZSB0byBkb25hdGUgdG8gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHByb2plY3QsIHlvdSBjYW4gZG8gc28gdmlhIFBheVBhbDogTDxodHRwOi8vdGlueXVybC5jb20vN2F5ZXM+LgorCisKKworCis9aGVhZDEgU0VFIEFMU08KKworU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L1NwcmVhZHNoZWV0LVBhcnNlRXhjZWw+LgorCitTcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLUZyb21YTUw6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtRnJvbVhNTD4uCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGcm9tREI6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtRnJvbURCPi4KKworRXhjZWw6OlRlbXBsYXRlOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfnJraW55b24vRXhjZWwtVGVtcGxhdGUvPi4KKworRGF0ZVRpbWU6OkZvcm1hdDo6RXhjZWw6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L0RhdGVUaW1lLUZvcm1hdC1FeGNlbD4uCisKKyJSZWFkaW5nIGFuZCB3cml0aW5nIEV4Y2VsIGZpbGVzIHdpdGggUGVybCIgYnkgVGVvZG9yIFpsYXRhbm92LCBhdCBJQk0gZGV2ZWxvcGVyV29ya3M6IEw8aHR0cDovL3d3dy0xMDYuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saWJyYXJ5L2wtcGV4Y2VsLz4uCisKKyJFeGNlbC1EYXRlaWVuIG1pdCBQZXJsIGVyc3RlbGxlbiAtIENvbnRyb2xsZXIgaW0gR2x1Y2siIGJ5IFBldGVyIERpbnRlbG1hbm4gYW5kIENocmlzdGlhbiBLaXJzY2ggaW4gdGhlIEdlcm1hbiBVbml4L3dlYiBqb3VybmFsIGlYOiBMPGh0dHA6Ly93d3cuaGVpc2UuZGUvaXgvYXJ0aWtlbC8yMDAxLzA2LzE3NS8+LgorCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uIGluIEphcGFuZXNlIGJ5IFRha2Fub3JpIEthd2FpLiBMPGh0dHA6Ly9tZW1iZXIubmlmdHkubmUuanAvaGlwcG8yMDAwL3Blcmx0aXBzL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwuaHRtPi4KKworT2VzdGVybHkgdXNlciBicnVzaGVzIHdpdGggZmFtZToKK0w8aHR0cDovL29lc3Rlcmx5LmNvbS9yZWxlYXNlcy8xMjEwMjAwMC5odG1sPi4KKworVGhlIGNzdjJ4bHMgcHJvZ3JhbSB0aGF0IGlzIHBhcnQgb2YgVGV4dDo6Q1NWX1hTOgorTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35obWJyYW5kL1RleHQtQ1NWX1hTL01BTklGRVNUPi4KKworCisKKz1oZWFkMSBBQ0tOT1dMRURHTUVOVFMKKworCitUaGUgZm9sbG93aW5nIHBlb3BsZSBjb250cmlidXRlZCB0byB0aGUgZGVidWdnaW5nIGFuZCB0ZXN0aW5nIG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCitBbGV4YW5kZXIgRmFyYmVyLCBBbmRyZSBkZSBCcnVpbiwgQXJ0aHVyQGFpcywgQXJ0dXIgU2lsdmVpcmEgZGEgQ3VuaGEsIEJvYiBSb3NlLCBCb3JnYXIgT2xzZW4sIEJyaWFuIEZvbGV5LCBCcmlhbiBXaGl0ZSwgQm9iIE1hY2theSwgQ2VkcmljIEJvdXZpZXIsIENoYWQgSm9obnNvbiwgQ1BBTiB0ZXN0ZXJzLCBEYW15YW4gSXZhbm92LCBEYW5pZWwgQmVyZ2VyLCBEYW5pZWwgR2FyZG5lciwgRG1pdHJ5IEtvY2h1cm92LCBFcmljIEZyYXppZXIsIEVybmVzdG8gQmFzY2hueSwgRmVsaXBlIFBlcmV6IEdhbGlhbmEsIEdvcmRvbiBTaW1wc29uLCBIYW5jIFBhdmVsLCBIYXJvbGQgQmFtZm9yZCwgSmFtZXMgSG9sbWVzLCBKYW1lcyBXaWxraW5zb24sIEpvaGFuIEVrZW5iZXJnLCBKb2hhbm4gSGFubmUsIEpvbmF0aGFuIFNjb3R0IER1ZmYsIEouQy4gV3JlbiwgS2VubmV0aCBTdGFjZXksIEtlaXRoIE1pbGxlciwgS3lsZSBLcm9tLCBNYXJjIFJvc2VudGhhbCwgTWFya3VzIFNjaG1pdHosIE1pY2hhZWwgQnJhaWcsIE1pY2hhZWwgQnVzY2hhdWVyLCBNaWtlIEJsYXplciwgTWljaGFlbCBFcmlja3NvbiwgTWljaGFlbCBXIEogV2VzdCwgTmluZyBYaWUsIFBhdWwgSi4gRmFsYmUsIFBhdWwgTWVkeW5za2ksIFBldGVyIERpbnRlbG1hbm4sIFBpZXJyZSBMYXBsYW50ZSwgUHJhdmVlbiBLb3RoYSwgUmV0byBCYWRlcnRzY2hlciwgUmljaCBTb3JkZW4sIFNoYW5lIEFzaGJ5LCBTaGFycm9uIE1jS2VuemllLCBTaGVueXUgWmhlbmcsIFN0ZXBoYW4gTG9lc2NoZXIsIFN0ZXZlIFNhcG92aXRzLCBTdmVuIFBhc3NpZywgU3ZldG9zbGF2IE1hcmlub3YsIFRhbWFzIEd1bGFjc2ksIFRyb3kgRGFuaWVscywgVmFoZSBTYXJraXNzaWFuLgorCitUaGUgZm9sbG93aW5nIHBlb3BsZSBjb250cmlidXRlZCBwYXRjaGVzLCBleGFtcGxlcyBvciBFeGNlbCBpbmZvcm1hdGlvbjoKKworQW5kcmV3IEJlbmhhbSwgQmlsbCBZb3VuZywgQ2VkcmljIEJvdXZpZXIsIENoYXJsZXMgV3liYmxlLCBEYW5pZWwgUmVudHosIERhdmlkIFJvYmlucywgRnJhbmNvIFZlbnR1cmksIEd1eSBBbGJlcnRlbGxpLCBJYW4gUGVubWFuLCBKb2huIEhlaXRtYW5uLCBKb24gR3V5LCBLeWxlIFIuIEJ1cnRvbiwgUGllcnJlLUplYW4gVm91ZXR0ZSwgUnViaW8sIE1hcmNvIEdlcmksIE1hcmsgRm93bGVyLCBNYXRpc3NlIEVuemVyLCBTYW0gS2luZ3RvbiwgVGFrYW5vcmkgS2F3YWksIFRvbSBPJ1N1bGxpdmFuLgorCitNYW55IHRoYW5rcyB0byBSb24gTWNLZWx2ZXksIFJvbnpvIENvbnN1bHRpbmcgZm9yIFNpZW1lbnMsIHdobyBzcG9uc29yZWQgdGhlIGRldmVsb3BtZW50IG9mIHRoZSBmb3JtdWxhIGNhY2hpbmcgcm91dGluZXMuCisKK01hbnkgdGhhbmtzIHRvIENhc3NlbnMgVHJhbnNwb3J0IHdobyBzcG9uc29yZWQgdGhlIGRldmVsb3BtZW50IG9mIHRoZSBlbWJlZGRlZCBjaGFydHMgYW5kIGF1dG9maWx0ZXJzLgorCitBZGRpdGlvbmFsIHRoYW5rcyB0byBUYWthbm9yaSBLYXdhaSBmb3IgdHJhbnNsYXRpbmcgdGhlIGRvY3VtZW50YXRpb24gaW50byBKYXBhbmVzZS4KKworR3VubmFyIFdvbGYgbWFpbnRhaW5zIHRoZSBEZWJpYW4gZGlzdHJvLgorCitUaGFua3MgdG8gRGFtaWFuIENvbndheSBmb3IgdGhlIGV4Y2VsbGVudCBQYXJzZTo6UmVjRGVzY2VudC4KKworVGhhbmtzIHRvIFRpbSBKZW5uZXNzIGZvciBGaWxlOjpUZW1wLgorCitUaGFua3MgdG8gTWljaGFlbCBNZWVrcyBhbmQgSm9keSBHb2xkYmVyZyBmb3IgdGhlaXIgd29yayBvbiBHbnVtZXJpYy4KKworCisKKworPWhlYWQxIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkKKworQmVjYXVzZSB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGZyZWUgb2YgY2hhcmdlLCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHNvZnR3YXJlLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdy4gRXhjZXB0IHdoZW4gb3RoZXJ3aXNlIHN0YXRlZCBpbiB3cml0aW5nIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQvb3Igb3RoZXIgcGFydGllcyBwcm92aWRlIHRoZSBzb2Z0d2FyZSAiYXMgaXMiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzZWQgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gVGhlIGVudGlyZSByaXNrIGFzIHRvIHRoZSBxdWFsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgc29mdHdhcmUgaXMgd2l0aCB5b3UuIFNob3VsZCB0aGUgc29mdHdhcmUgcHJvdmUgZGVmZWN0aXZlLCB5b3UgYXNzdW1lIHRoZSBjb3N0IG9mIGFsbCBuZWNlc3Nhcnkgc2VydmljaW5nLCByZXBhaXIsIG9yIGNvcnJlY3Rpb24uCisKK0luIG5vIGV2ZW50IHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyB3aWxsIGFueSBjb3B5cmlnaHQgaG9sZGVyLCBvciBhbnkgb3RoZXIgcGFydHkgd2hvIG1heSBtb2RpZnkgYW5kL29yIHJlZGlzdHJpYnV0ZSB0aGUgc29mdHdhcmUgYXMgcGVybWl0dGVkIGJ5IHRoZSBhYm92ZSBsaWNlbmNlLCBiZSBsaWFibGUgdG8geW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGdlbmVyYWwsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlIHNvZnR3YXJlIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGxvc3Mgb2YgZGF0YSBvciBkYXRhIGJlaW5nIHJlbmRlcmVkIGluYWNjdXJhdGUgb3IgbG9zc2VzIHN1c3RhaW5lZCBieSB5b3Ugb3IgdGhpcmQgcGFydGllcyBvciBhIGZhaWx1cmUgb2YgdGhlIHNvZnR3YXJlIHRvIG9wZXJhdGUgd2l0aCBhbnkgb3RoZXIgc29mdHdhcmUpLCBldmVuIGlmIHN1Y2ggaG9sZGVyIG9yIG90aGVyIHBhcnR5IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworCisKKworPWhlYWQxIExJQ0VOU0UKKworRWl0aGVyIHRoZSBQZXJsIEFydGlzdGljIExpY2VuY2UgTDxodHRwOi8vZGV2LnBlcmwub3JnL2xpY2Vuc2VzL2FydGlzdGljLmh0bWw+IG9yIHRoZSBHUEwgTDxodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocD4uCisKKworCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworICAgIEFub3RoZXIgZGF5IGluIEp1bmUsIHdlJ2xsIHBpY2sgZWxldmVuIGZvciBmb290YmFsbAorICAgIChQaWNrIGVsZXZlbiBmb3IgZm9vdGJhbGwpCisgICAgV2UncmUgcGxheWluZyBmb3Igb3VyIGxpdmVzIHRoZSByZWZlcmVlIGdpdmVzIHVzIGZ1Y2sgYWxsCisgICAgKFJlZiB5b3UncmUgZ2l2aW5nIHVzIGZ1Y2sgYWxsKQorICAgIEkgc2F3IHlvdSB3aXRoIHRoZSBjb3JuZXIgb2YgbXkgZXllIG9uIHRoZSBzaWRlbGluZXMKKyAgICBZb3VyIGRhcmsgbWFzY2FyYSBiaWRzIG1lIHRvIGhpc3RvcmljYWwgZGVlZHMKKworICAgICAgICAtLSBCZWxsZSBhbmQgU2ViYXN0aWFuCisKKworCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0JJRkZ3cml0ZXIucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0JJRkZ3cml0ZXIucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2MThhNwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQklGRndyaXRlci5wbQpAQCAtMCwwICsxLDMxNiBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlcjsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBCSUZGd3JpdGVyIC0gQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgRXhjZWwgd29ya2Jvb2tzIGFuZCB3b3Jrc2hlZXRzLgorIworIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2UgRXhwb3J0ZXI7Cit1c2Ugc3RyaWN0OworCisKKworCisKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENsYXNzIGRhdGEuCisjCitteSAkYnl0ZV9vcmRlciAgID0gJyc7CitteSAkQklGRl92ZXJzaW9uID0gMHgwNjAwOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMgQ29uc3RydWN0b3IKKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzICA9ICRfWzBdOworCisgICAgbXkgJHNlbGYgICA9IHsKKyAgICAgICAgICAgICAgICAgICAgX2J5dGVfb3JkZXIgICAgICA9PiAnJywKKyAgICAgICAgICAgICAgICAgICAgX2RhdGEgICAgICAgICAgICA9PiAnJywKKyAgICAgICAgICAgICAgICAgICAgX2RhdGFzaXplICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfbGltaXQgICAgICAgICAgID0+IDgyMjQsCisgICAgICAgICAgICAgICAgICAgIF9pZ25vcmVfY29udGludWUgPT4gMCwKKyAgICAgICAgICAgICAgICAgfTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgJHNlbGYtPl9zZXRfYnl0ZV9vcmRlcigpOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zZXRfYnl0ZV9vcmRlcigpCisjCisjIERldGVybWluZSB0aGUgYnl0ZSBvcmRlciBhbmQgc3RvcmUgaXQgYXMgY2xhc3MgZGF0YSB0byBhdm9pZAorIyByZWNhbGN1bGF0aW5nIGl0IGZvciBlYWNoIGNhbGwgdG8gbmV3KCkuCisjCitzdWIgX3NldF9ieXRlX29yZGVyIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBpZiAoJGJ5dGVfb3JkZXIgZXEgJycpeworICAgICAgICAjIENoZWNrIGlmICJwYWNrIiBnaXZlcyB0aGUgcmVxdWlyZWQgSUVFRSA2NGJpdCBmbG9hdAorICAgICAgICBteSAkdGVzdHN0ciA9IHBhY2sgImQiLCAxLjIzNDU7CisgICAgICAgIG15IEBoZXhkYXRhID0oMHg4RCwgMHg5NywgMHg2RSwgMHgxMiwgMHg4MywgMHhDMCwgMHhGMywgMHgzRik7CisgICAgICAgIG15ICRudW1iZXIgID0gcGFjayAiQzgiLCBAaGV4ZGF0YTsKKworICAgICAgICBpZiAoJG51bWJlciBlcSAkdGVzdHN0cikgeworICAgICAgICAgICAgJGJ5dGVfb3JkZXIgPSAwOyAgICAjIExpdHRsZSBFbmRpYW4KKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoJG51bWJlciBlcSByZXZlcnNlKCR0ZXN0c3RyKSl7CisgICAgICAgICAgICAkYnl0ZV9vcmRlciA9IDE7ICAgICMgQmlnIEVuZGlhbgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBHaXZlIHVwLiBJJ2xsIGZpeCB0aGlzIGluIGEgbGF0ZXIgdmVyc2lvbi4KKyAgICAgICAgICAgIGNyb2FrICggIlJlcXVpcmVkIGZsb2F0aW5nIHBvaW50IGZvcm1hdCBub3Qgc3VwcG9ydGVkICIgIC4KKyAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgcGxhdGZvcm0uIFNlZSB0aGUgcG9ydGFiaWxpdHkgc2VjdGlvbiAiIC4KKyAgICAgICAgICAgICAgICAgICAgIm9mIHRoZSBkb2N1bWVudGF0aW9uLiIKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisgICAgJHNlbGYtPntfYnl0ZV9vcmRlcn0gPSAkYnl0ZV9vcmRlcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wcmVwZW5kKCRkYXRhKQorIworIyBHZW5lcmFsIHN0b3JhZ2UgZnVuY3Rpb24KKyMKK3N1YiBfcHJlcGVuZCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICRkYXRhICAgID0gam9pbignJywgQF8pOworCisgICAgJGRhdGEgPSAkc2VsZi0+X2FkZF9jb250aW51ZSgkZGF0YSkgaWYgbGVuZ3RoKCRkYXRhKSA+ICRzZWxmLT57X2xpbWl0fTsKKworICAgICRzZWxmLT57X2RhdGF9ICAgICAgPSAkZGF0YSAuICRzZWxmLT57X2RhdGF9OworICAgICRzZWxmLT57X2RhdGFzaXplfSArPSBsZW5ndGgoJGRhdGEpOworCisgICAgcmV0dXJuICRkYXRhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2FwcGVuZCgkZGF0YSkKKyMKKyMgR2VuZXJhbCBzdG9yYWdlIGZ1bmN0aW9uCisjCitzdWIgX2FwcGVuZCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICRkYXRhICAgID0gam9pbignJywgQF8pOworCisgICAgJGRhdGEgPSAkc2VsZi0+X2FkZF9jb250aW51ZSgkZGF0YSkgaWYgbGVuZ3RoKCRkYXRhKSA+ICRzZWxmLT57X2xpbWl0fTsKKworICAgICRzZWxmLT57X2RhdGF9ICAgICAgPSAkc2VsZi0+e19kYXRhfSAuICRkYXRhOworICAgICRzZWxmLT57X2RhdGFzaXplfSArPSBsZW5ndGgoJGRhdGEpOworCisgICAgcmV0dXJuICRkYXRhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2JvZigkdHlwZSkKKyMKKyMgJHR5cGUgPSAweDAwMDUsIFdvcmtib29rCisjICR0eXBlID0gMHgwMDEwLCBXb3Jrc2hlZXQKKyMgJHR5cGUgPSAweDAwMjAsIENoYXJ0CisjCisjIFdyaXRlcyBFeGNlbCBCT0YgcmVjb3JkIHRvIGluZGljYXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJlYW0gb3IKKyMgc3ViLXN0cmVhbSBpbiB0aGUgQklGRiBmaWxlLgorIworc3ViIF9zdG9yZV9ib2YgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICA9IDB4MDgwOTsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAxMDsgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHZlcnNpb24gPSAkQklGRl92ZXJzaW9uOworICAgIG15ICR0eXBlICAgID0gJF9bMF07CisKKyAgICAjIEFjY29yZGluZyB0byB0aGUgU0RLICRidWlsZCBhbmQgJHllYXIgc2hvdWxkIGJlIHNldCB0byB6ZXJvLgorICAgICMgSG93ZXZlciwgdGhpcyB0aHJvd3MgYSB3YXJuaW5nIGluIEV4Y2VsIDUuIFNvLCB1c2UgdGhlc2UKKyAgICAjIG1hZ2ljIG51bWJlcnMuCisgICAgbXkgJGJ1aWxkICAgPSAweDBEQkI7CisgICAgbXkgJHllYXIgICAgPSAweDA3Q0M7CisKKyAgICBteSAkYmZoICAgICA9IDB4MDAwMDAwNDE7CisgICAgbXkgJHNmbyAgICAgPSAweDAwMDAwMDA2OworCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2dnZ2VlYiLCAkdmVyc2lvbiwgJHR5cGUsICRidWlsZCwgJHllYXIsICRiZmgsICRzZm8pOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9lb2YoKQorIworIyBXcml0ZXMgRXhjZWwgRU9GIHJlY29yZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGEgQklGRiBzdHJlYW0uCisjCitzdWIgX3N0b3JlX2VvZiB7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisgICAgbXkgJHJlY29yZCAgICA9IDB4MDAwQTsgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMDA7ICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9hZGRfY29udGludWUoKQorIworIyBFeGNlbCBsaW1pdHMgdGhlIHNpemUgb2YgQklGRiByZWNvcmRzLiBJbiBFeGNlbCA1IHRoZSBsaW1pdCBpcyAyMDg0IGJ5dGVzLiBJbgorIyBFeGNlbCA5NyB0aGUgbGltaXQgaXMgODIyOCBieXRlcy4gUmVjb3JkcyB0aGF0IGFyZSBsb25nZXIgdGhhbiB0aGVzZSBsaW1pdHMKKyMgbXVzdCBiZSBzcGxpdCB1cCBpbnRvIENPTlRJTlVFIGJsb2Nrcy4KKyMKKyMgVGhpcyBmdW5jdGlvbiB0YWtlIGEgbG9uZyBCSUZGIHJlY29yZCBhbmQgaW5zZXJ0cyBDT05USU5VRSByZWNvcmRzIGFzCisjIG5lY2Vzc2FyeS4KKyMKKyMgU29tZSByZWNvcmRzIGhhdmUgdGhlaXIgb3duIHNwZWNpYWxpc2VkIENvbnRpbnVlIGJsb2NrcyBzbyB0aGVyZSBpcyBhbHNvIGFuCisjIG9wdGlvbiB0byBieXBhc3MgdGhpcyBmdW5jdGlvbi4KKyMKK3N1YiBfYWRkX2NvbnRpbnVlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRkYXRhICAgICAgICA9ICRfWzBdOworICAgIG15ICRsaW1pdCAgICAgICA9ICRzZWxmLT57X2xpbWl0fTsKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwM0M7ICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkaGVhZGVyOworICAgIG15ICR0bXA7CisKKyAgICAjIFNraXAgdGhpcyBpZiBhbm90aGVyIG1ldGhvZCBoYW5kbGVzIHRoZSBjb250aW51ZSBibG9ja3MuCisgICAgcmV0dXJuICRkYXRhIGlmICRzZWxmLT57X2lnbm9yZV9jb250aW51ZX07CisKKyAgICAjIFRoZSBmaXJzdCAyMDgwLzgyMjQgYnl0ZXMgcmVtYWluIGludGFjdC4gSG93ZXZlciwgd2UgaGF2ZSB0byBjaGFuZ2UKKyAgICAjIHRoZSBsZW5ndGggZmllbGQgb2YgdGhlIHJlY29yZC4KKyAgICAjCisgICAgJHRtcCA9IHN1YnN0cigkZGF0YSwgMCwgJGxpbWl0LCAiIik7CisgICAgc3Vic3RyKCR0bXAsIDIsIDIsIHBhY2soInYiLCAkbGltaXQtNCkpOworCisgICAgIyBTdHJpcCBvdXQgY2h1bmtzIG9mIDIwODAvODIyNCBieXRlcyArNCBmb3IgdGhlIGhlYWRlci4KKyAgICB3aGlsZSAobGVuZ3RoKCRkYXRhKSA+ICRsaW1pdCkgeworICAgICAgICAkaGVhZGVyICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxpbWl0KTsKKyAgICAgICAgJHRtcCAgICAuPSAkaGVhZGVyOworICAgICAgICAkdG1wICAgIC49IHN1YnN0cigkZGF0YSwgMCwgJGxpbWl0LCAiIik7CisgICAgfQorCisgICAgIyBNb3AgdXAgdGhlIGxhc3Qgb2YgdGhlIGRhdGEKKyAgICAkaGVhZGVyICA9IHBhY2soInZ2IiwgJHJlY29yZCwgbGVuZ3RoKCRkYXRhKSk7CisgICAgJHRtcCAgICAuPSAkaGVhZGVyOworICAgICR0bXAgICAgLj0gJGRhdGE7CisKKyAgICByZXR1cm4gJHRtcCA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfYWRkX21zb19nZW5lcmljKCkKKyMKKyMgQ3JlYXRlIGEgbXNvIHN0cnVjdHVyZSB0aGF0IGlzIHBhcnQgb2YgYW4gRXNjaGVyIGRyYXdpbmcgb2JqZWN0LiBUaGVzZSBhcmUKKyMgYXJlIHVzZWQgZm9yIGltYWdlcywgY29tbWVudHMgYW5kIGZpbHRlcnMuIFRoaXMgZ2VuZXJpYyBtZXRob2QgaXMgdXNlZCBieQorIyBvdGhlciBtZXRob2RzIHRvIGNyZWF0ZSBzcGVjaWZpYyBtc28gcmVjb3Jkcy4KKyMKKyMgUmV0dXJucyB0aGUgcGFja2VkIHJlY29yZC4KKyMKK3N1YiBfYWRkX21zb19nZW5lcmljIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICR0eXBlICAgICAgICA9ICRfWzBdOworICAgIG15ICR2ZXJzaW9uICAgICA9ICRfWzFdOworICAgIG15ICRpbnN0YW5jZSAgICA9ICRfWzJdOworICAgIG15ICRkYXRhICAgICAgICA9ICRfWzNdOworICAgIG15ICRsZW5ndGggICAgICA9IGRlZmluZWQgJF9bNF0gPyAkX1s0XSA6IGxlbmd0aCgkZGF0YSk7CisKKyAgICAjIFRoZSBoZWFkZXIgY29udGFpbnMgdmVyc2lvbiBhbmQgaW5zdGFuY2UgaW5mbyBwYWNrZWQgaW50byAyIGJ5dGVzLgorICAgIG15ICRoZWFkZXIgICAgICA9ICR2ZXJzaW9uIHwgKCRpbnN0YW5jZSA8PCA0KTsKKworICAgIG15ICRyZWNvcmQgICAgICA9IHBhY2sgInZ2ViIsICRoZWFkZXIsICR0eXBlLCAkbGVuZ3RoOworICAgICAgICRyZWNvcmQgICAgIC49ICRkYXRhOworCisgICAgcmV0dXJuICRyZWNvcmQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBGb3IgZGVidWdnaW5nCisjCitzdWIgX2hleG91dCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcHJpbnQgKyhjYWxsZXIoMSkpWzNdLCAiXG4iOworCisgICAgbXkgJGRhdGEgPSBqb2luICcnLCBAXzsKKworICAgIG15IEBieXRlcyA9IHVucGFjaygiSCoiLCAkZGF0YSkgPX4gLy4uL2c7CisKKyAgICB3aGlsZSAoQGJ5dGVzID4gMTYpIHsKKyAgICAgICAgcHJpbnQgam9pbiAiICIsIHNwbGljZSBAYnl0ZXMsIDAsIDE2OworICAgICAgICBwcmludCAiXG4iOworICAgIH0KKyAgICBwcmludCBqb2luICIgIiwgQGJ5dGVzLCAiXG5cbiI7Cit9CisKKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitCSUZGd3JpdGVyIC0gQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgRXhjZWwgd29ya2Jvb2tzIGFuZCB3b3Jrc2hlZXRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworqSBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQmlnLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9CaWcucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyNmZlNgotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQmlnLnBtCkBAIC0wLDAgKzEsOTQgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkJpZzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBXcml0ZUV4Y2VsOjpCaWcKKyMKKyMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgLSBXcml0ZSBmb3JtYXR0ZWQgdGV4dCBhbmQgbnVtYmVycyB0byBhCisjIGNyb3NzLXBsYXRmb3JtIEV4Y2VsIGJpbmFyeSBmaWxlLgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLgorIworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3JrYm9vazsKKworCisKKworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3JrYm9vayBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjIENvbnN0cnVjdG9yLiBUaGluIHdyYXBwZXIgZm9yIGEgV29ya2Jvb2sgb2JqZWN0LgorIworIyBUaGlzIG1vZHVsZSBpcyBubyBsb25nZXIgcmVxdWlyZWQgZGlyZWN0bHkgYW5kIGl0cyB1c2UgaXMgZGVwcmVjYXRlZC4gU2VlCisjIHRoZSBQb2QgZG9jdW1lbnRhdGlvbiBiZWxvdy4KKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6Oldvcmtib29rLT5uZXcoQF8pOworCisgICAgIyBDaGVjayBmb3IgZmlsZSBjcmVhdGlvbiBmYWlsdXJlcyBiZWZvcmUgcmUtYmxlc3NpbmcKKyAgICBibGVzcyAgJHNlbGYsICRjbGFzcyBpZiBkZWZpbmVkICRzZWxmOworCisgICAgcmV0dXJuICRzZWxmOworfQorCisKKzE7CisKKworX19FTkRfXworCisKKworPWhlYWQxIE5BTUUKKworCitCaWcgLSBBIGNsYXNzIGZvciBjcmVhdGluZyBFeGNlbCBmaWxlcyA+IDdNQi4KKworCis9aGVhZDEgU1lOT1BTSVMKKworVXNlIG9mIHRoaXMgbW9kdWxlIGlzIGRlcHJlY2F0ZWQuIFNlZSBiZWxvdy4KKworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIG1vZHVsZSB3YXMgYSBzdWItY2xhc3Mgb2YgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdXNlZCBmb3IgY3JlYXRpbmcgRXhjZWwgZmlsZXMgZ3JlYXRlciB0aGFuIDdNQi4gSG93ZXZlciwgaXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZCBpcyBub3cgZGVwcmVjYXRlZC4KKworQXMgb2YgdmVyc2lvbiAyLjE3IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGNhbiBjcmVhdGUgZmlsZXMgbGFyZ2VyIHRoYW4gN01CIGRpcmVjdGx5IGlmIE9MRTo6U3RvcmFnZV9MaXRlIGlzIGluc3RhbGxlZC4KKworVGhpcyBtb2R1bGUgb25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJZiB5b3VyIHByb2dyYW1zIHVzZSA6OkJpZyB5b3Ugc2hvdWxkIGNvbnZlcnQgdGhlbSB0byB1c2UgU3ByZWFkc2hlZXQ6OldyaXRFeGNlbCBkaXJlY3RseS4KKworCis9aGVhZDEgUkVRVUlSRU1FTlRTCisKK0w8T0xFOjpTdG9yYWdlX0xpdGU+LgorCisKKz1oZWFkMSBBVVRIT1IKKworCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCisKKz1oZWFkMSBDT1BZUklHSFQKKworCiupIE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0LnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTJmNDkyCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC5wbQpAQCAtMCwwICsxLDMwNjIgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENoYXJ0IC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIENoYXJ0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3VzZSBFeHBvcnRlcjsKK3VzZSBzdHJpY3Q7Cit1c2UgQ2FycDsKK3VzZSBGaWxlSGFuZGxlOwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3Jrc2hlZXQ7CisKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldCk7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEZvcm1hdHRpbmcgaW5mb3JtYXRpb24uCisjCisjIHBlcmx0aWR5IHdpdGggb3B0aW9uczogLW1ibD0yIC1wdD0wIC1ub2xhCisjCisjIEFueSBjYW1lbCBjYXNlIEh1bmdhcmlhbiBub3RhdGlvbiBzdHlsZSB2YXJpYWJsZSBuYW1lcyBpbiB0aGUgQklGRiByZWNvcmQKKyMgd3JpdGluZyBzdWItcm91dGluZXMgYmVsb3cgYXJlIGZvciBzaW1pbGFyaXR5IHdpdGggbmFtZXMgdXNlZCBpbiB0aGUgRXhjZWwKKyMgZG9jdW1lbnRhdGlvbi4gT3RoZXJ3aXNlIGxvd2VyY2FzZSB1bmRlcnNjb3JlIHN0eWxlIG5hbWVzIGFyZSB1c2VkLgorIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVGhlIGNoYXJ0IGNsYXNzIGhpZXJhcmNoeSBpcyBhcyBmb2xsb3dzLiBDaGFydC5wbSBhY3RzIGFzIGEgZmFjdG9yeSBmb3IgdGhlCisjIHN1Yi1jbGFzc2VzLgorIworIworIyAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkJJRkZ3cml0ZXIKKyMgICAgICAgICAgICAgICAgICAgICBeCisjICAgICAgICAgICAgICAgICAgICAgfAorIyAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldAorIyAgICAgICAgICAgICAgICAgICAgIF4KKyMgICAgICAgICAgICAgICAgICAgICB8CisjICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQKKyMgICAgICAgICAgICAgICAgICAgICBeCisjICAgICAgICAgICAgICAgICAgICAgfAorIyAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjoqIChzdWItdHlwZXMpCisjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBmYWN0b3J5KCkKKyMKKyMgRmFjdG9yeSBtZXRob2QgZm9yIHJldHVybmluZyBjaGFydCBvYmplY3RzIGJhc2VkIG9uIHRoZWlyIGNsYXNzIHR5cGUuCisjCitzdWIgZmFjdG9yeSB7CisKKyAgICBteSAkY3VycmVudF9jbGFzcyAgPSBzaGlmdDsKKyAgICBteSAkY2hhcnRfc3ViY2xhc3MgPSBzaGlmdDsKKworICAgICRjaGFydF9zdWJjbGFzcyA9IHVjZmlyc3QgbGMgJGNoYXJ0X3N1YmNsYXNzOworCisgICAgbXkgJG1vZHVsZSA9ICJTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OiIgLiAkY2hhcnRfc3ViY2xhc3M7CisKKyAgICBldmFsICJyZXF1aXJlICRtb2R1bGUiOworCisgICAgIyBUT0RPLiBOZWVkIHRvIHJlLXJhaXNlIHRoaXMgZXJyb3IgZnJvbSBXb3JrYm9vazo6YWRkX2NoYXJ0KCkuCisgICAgZGllICJDaGFydCB0eXBlICckY2hhcnRfc3ViY2xhc3MnIG5vdCBzdXBwb3J0ZWQgaW4gYWRkX2NoYXJ0KClcbiIgaWYgJEA7CisKKyAgICByZXR1cm4gJG1vZHVsZS0+bmV3KCBAXyApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMgRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3Igc3ViLWNsYXNzZXMuCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3Jrc2hlZXQtPm5ldyggQF8gKTsKKworICAgICRzZWxmLT57X3NoZWV0X3R5cGV9ICA9IDB4MDIwMDsKKyAgICAkc2VsZi0+e19vcmllbnRhdGlvbn0gPSAweDA7CisgICAgJHNlbGYtPntfc2VyaWVzfSAgICAgID0gW107CisgICAgJHNlbGYtPntfZW1iZWRkZWR9ICAgID0gMDsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgJHNlbGYtPl9zZXRfZGVmYXVsdF9wcm9wZXJ0aWVzKCk7CisgICAgJHNlbGYtPl9zZXRfZGVmYXVsdF9jb25maWdfZGF0YSgpOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFB1YmxpYyBtZXRob2RzLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgYWRkX3NlcmllcygpCisjCisjIEFkZCBhIHNlcmllcyBhbmQgaXQncyBwcm9wZXJ0aWVzIHRvIGEgY2hhcnQuCisjCitzdWIgYWRkX3NlcmllcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICVhcmcgID0gQF87CisKKyAgICBjcm9hayAiTXVzdCBzcGVjaWZ5ICd2YWx1ZXMnIGluIGFkZF9zZXJpZXMoKSIgaWYgIWV4aXN0cyAkYXJne3ZhbHVlc307CisKKyAgICAjIFBhcnNlIHRoZSByYW5nZXMgdG8gdmFsaWRhdGUgdGhlbSBhbmQgZXh0cmFjdCBzYWxpZW50IGluZm9ybWF0aW9uLgorICAgIG15IEB2YWx1ZV9kYXRhICAgID0gJHNlbGYtPl9wYXJzZV9zZXJpZXNfZm9ybXVsYSggJGFyZ3t2YWx1ZXN9ICk7CisgICAgbXkgQGNhdGVnb3J5X2RhdGEgPSAkc2VsZi0+X3BhcnNlX3Nlcmllc19mb3JtdWxhKCAkYXJne2NhdGVnb3JpZXN9ICk7CisgICAgbXkgJG5hbWVfZm9ybXVsYSAgPSAkc2VsZi0+X3BhcnNlX3Nlcmllc19mb3JtdWxhKCAkYXJne25hbWVfZm9ybXVsYX0gKTsKKworICAgICMgRGVmYXVsdCBjYXRlZ29yeSBjb3VudCB0byB0aGUgc2FtZSBhcyB0aGUgdmFsdWUgY291bnQgaWYgbm90IGRlZmluZWQuCisgICAgaWYgKCAhZGVmaW5lZCAkY2F0ZWdvcnlfZGF0YVsxXSApIHsKKyAgICAgICAgJGNhdGVnb3J5X2RhdGFbMV0gPSAkdmFsdWVfZGF0YVsxXTsKKyAgICB9CisKKyAgICAjIEFkZCB0aGUgcGFyc2VkIGRhdGEgdG8gdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4KKyAgICAlYXJnID0gKAorICAgICAgICBAXywKKyAgICAgICAgX3ZhbHVlcyAgICAgICA9PiBcQHZhbHVlX2RhdGEsCisgICAgICAgIF9jYXRlZ29yaWVzICAgPT4gXEBjYXRlZ29yeV9kYXRhLAorICAgICAgICBfbmFtZV9mb3JtdWxhID0+ICRuYW1lX2Zvcm11bGEKKyAgICApOworCisgICAgIyBFbmNvZGUgdGhlIFNlcmllcyBuYW1lLgorICAgIG15ICggJG5hbWUsICRlbmNvZGluZyApID0KKyAgICAgICRzZWxmLT5fZW5jb2RlX3V0ZjE2KCAkYXJne25hbWV9LCAkYXJne25hbWVfZW5jb2Rpbmd9ICk7CisKKyAgICAkYXJne25hbWV9ICAgICAgICAgID0gJG5hbWU7CisgICAgJGFyZ3tuYW1lX2VuY29kaW5nfSA9ICRlbmNvZGluZzsKKworICAgIHB1c2ggQHsgJHNlbGYtPntfc2VyaWVzfSB9LCBcJWFyZzsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF94X2F4aXMoKQorIworIyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIFgtYXhpcy4KKyMKK3N1YiBzZXRfeF9heGlzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKworICAgIG15ICggJG5hbWUsICRlbmNvZGluZyApID0KKyAgICAgICRzZWxmLT5fZW5jb2RlX3V0ZjE2KCAkYXJne25hbWV9LCAkYXJne25hbWVfZW5jb2Rpbmd9ICk7CisKKyAgICBteSAkZm9ybXVsYSA9ICRzZWxmLT5fcGFyc2Vfc2VyaWVzX2Zvcm11bGEoICRhcmd7bmFtZV9mb3JtdWxhfSApOworCisgICAgJHNlbGYtPntfeF9heGlzX25hbWV9ICAgICA9ICRuYW1lOworICAgICRzZWxmLT57X3hfYXhpc19lbmNvZGluZ30gPSAkZW5jb2Rpbmc7CisgICAgJHNlbGYtPntfeF9heGlzX2Zvcm11bGF9ICA9ICRmb3JtdWxhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3lfYXhpcygpCisjCisjIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgWS1heGlzLgorIworc3ViIHNldF95X2F4aXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAlYXJnICA9IEBfOworCisgICAgbXkgKCAkbmFtZSwgJGVuY29kaW5nICkgPQorICAgICAgJHNlbGYtPl9lbmNvZGVfdXRmMTYoICRhcmd7bmFtZX0sICRhcmd7bmFtZV9lbmNvZGluZ30gKTsKKworICAgIG15ICRmb3JtdWxhID0gJHNlbGYtPl9wYXJzZV9zZXJpZXNfZm9ybXVsYSggJGFyZ3tuYW1lX2Zvcm11bGF9ICk7CisKKyAgICAkc2VsZi0+e195X2F4aXNfbmFtZX0gICAgID0gJG5hbWU7CisgICAgJHNlbGYtPntfeV9heGlzX2VuY29kaW5nfSA9ICRlbmNvZGluZzsKKyAgICAkc2VsZi0+e195X2F4aXNfZm9ybXVsYX0gID0gJGZvcm11bGE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfdGl0bGUoKQorIworIyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGNoYXJ0IHRpdGxlLgorIworc3ViIHNldF90aXRsZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICVhcmcgID0gQF87CisKKyAgICBteSAoICRuYW1lLCAkZW5jb2RpbmcgKSA9CisgICAgICAkc2VsZi0+X2VuY29kZV91dGYxNiggJGFyZ3tuYW1lfSwgJGFyZ3tuYW1lX2VuY29kaW5nfSApOworCisgICAgbXkgJGZvcm11bGEgPSAkc2VsZi0+X3BhcnNlX3Nlcmllc19mb3JtdWxhKCAkYXJne25hbWVfZm9ybXVsYX0gKTsKKworICAgICRzZWxmLT57X3RpdGxlX25hbWV9ICAgICA9ICRuYW1lOworICAgICRzZWxmLT57X3RpdGxlX2VuY29kaW5nfSA9ICRlbmNvZGluZzsKKyAgICAkc2VsZi0+e190aXRsZV9mb3JtdWxhfSAgPSAkZm9ybXVsYTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9sZWdlbmQoKQorIworIyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGNoYXJ0IGxlZ2VuZC4KKyMKK3N1YiBzZXRfbGVnZW5kIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKworICAgIGlmICggZGVmaW5lZCAkYXJne3Bvc2l0aW9ufSApIHsKKyAgICAgICAgaWYgKCBsYyAkYXJne3Bvc2l0aW9ufSBlcSAnbm9uZScgKSB7CisgICAgICAgICAgICAkc2VsZi0+e19sZWdlbmR9LT57X3Zpc2libGV9ID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9wbG90YXJlYSgpCisjCisjIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgY2hhcnQgcGxvdGFyZWEuCisjCitzdWIgc2V0X3Bsb3RhcmVhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKyAgICByZXR1cm4gdW5sZXNzIGtleXMgJWFyZzsKKworICAgIG15ICRhcmVhID0gJHNlbGYtPntfcGxvdGFyZWF9OworCisgICAgIyBTZXQgdGhlIHBsb3RhcmVhIHZpc2liaWxpdHkuCisgICAgaWYgKCBkZWZpbmVkICRhcmd7dmlzaWJsZX0gKSB7CisgICAgICAgICRhcmVhLT57X3Zpc2libGV9ID0gJGFyZ3t2aXNpYmxlfTsKKyAgICAgICAgcmV0dXJuIGlmICEkYXJlYS0+e192aXNpYmxlfTsKKyAgICB9CisKKyAgICAjIFRPRE8uIGNvdWxkIG1vdmUgdGhpcyBvdXQgb2YgaWYgc3RhdGVtZW50LgorICAgICRhcmVhLT57X2JnX2NvbG9yX2luZGV4fSA9IDB4MDg7CisKKyAgICAjIFNldCB0aGUgY2hhcnQgYmFja2dyb3VuZCBjb2xvdXIuCisgICAgaWYgKCBkZWZpbmVkICRhcmd7Y29sb3J9ICkgeworICAgICAgICBteSAoICRpbmRleCwgJHJnYiApID0gJHNlbGYtPl9nZXRfY29sb3JfaW5kaWNlcyggJGFyZ3tjb2xvcn0gKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkICRpbmRleCApIHsKKyAgICAgICAgICAgICRhcmVhLT57X2ZnX2NvbG9yX2luZGV4fSA9ICRpbmRleDsKKyAgICAgICAgICAgICRhcmVhLT57X2ZnX2NvbG9yX3JnYn0gICA9ICRyZ2I7CisgICAgICAgICAgICAkYXJlYS0+e19iZ19jb2xvcl9pbmRleH0gPSAweDA4OworICAgICAgICAgICAgJGFyZWEtPntfYmdfY29sb3JfcmdifSAgID0gMHgwMDAwMDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFNldCB0aGUgYm9yZGVyIGxpbmUgY29sb3VyLgorICAgIGlmICggZGVmaW5lZCAkYXJne2xpbmVfY29sb3J9ICkgeworICAgICAgICBteSAoICRpbmRleCwgJHJnYiApID0gJHNlbGYtPl9nZXRfY29sb3JfaW5kaWNlcyggJGFyZ3tsaW5lX2NvbG9yfSApOworICAgICAgICBpZiAoIGRlZmluZWQgJGluZGV4ICkgeworICAgICAgICAgICAgJGFyZWEtPntfbGluZV9jb2xvcl9pbmRleH0gPSAkaW5kZXg7CisgICAgICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX3JnYn0gICA9ICRyZ2I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFNldCB0aGUgYm9yZGVyIGxpbmUgcGF0dGVybi4KKyAgICBpZiAoIGRlZmluZWQgJGFyZ3tsaW5lX3BhdHRlcm59ICkgeworICAgICAgICBteSAkcGF0dGVybiA9ICRzZWxmLT5fZ2V0X2xpbmVfcGF0dGVybiggJGFyZ3tsaW5lX3BhdHRlcm59ICk7CisgICAgICAgICRhcmVhLT57X2xpbmVfcGF0dGVybn0gPSAkcGF0dGVybjsKKyAgICB9CisKKyAgICAjIFNldCB0aGUgYm9yZGVyIGxpbmUgd2VpZ2h0LgorICAgIGlmICggZGVmaW5lZCAkYXJne2xpbmVfd2VpZ2h0fSApIHsKKyAgICAgICAgbXkgJHdlaWdodCA9ICRzZWxmLT5fZ2V0X2xpbmVfd2VpZ2h0KCAkYXJne2xpbmVfd2VpZ2h0fSApOworICAgICAgICAkYXJlYS0+e19saW5lX3dlaWdodH0gPSAkd2VpZ2h0OworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9jaGFydGFyZWEoKQorIworIyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGNoYXJ0IGNoYXJ0YXJlYS4KKyMKK3N1YiBzZXRfY2hhcnRhcmVhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKyAgICByZXR1cm4gdW5sZXNzIGtleXMgJWFyZzsKKworICAgIG15ICRhcmVhID0gJHNlbGYtPntfY2hhcnRhcmVhfTsKKworICAgICMgRW1iZWRkZWQgYXV0b21hdGljIGxpbmUgd2VpZ2h0IGhhcyBhIGRpZmZlcmVudCBkZWZhdWx0IHZhbHVlLgorICAgICRhcmVhLT57X2xpbmVfd2VpZ2h0fSA9IDB4RkZGRiBpZiAkc2VsZi0+e19lbWJlZGRlZH07CisKKworICAgICMgU2V0IHRoZSBjaGFydCBiYWNrZ3JvdW5kIGNvbG91ci4KKyAgICBpZiAoIGRlZmluZWQgJGFyZ3tjb2xvcn0gKSB7CisgICAgICAgIG15ICggJGluZGV4LCAkcmdiICkgPSAkc2VsZi0+X2dldF9jb2xvcl9pbmRpY2VzKCAkYXJne2NvbG9yfSApOworICAgICAgICBpZiAoIGRlZmluZWQgJGluZGV4ICkgeworICAgICAgICAgICAgJGFyZWEtPntfZmdfY29sb3JfaW5kZXh9ID0gJGluZGV4OworICAgICAgICAgICAgJGFyZWEtPntfZmdfY29sb3JfcmdifSAgID0gJHJnYjsKKyAgICAgICAgICAgICRhcmVhLT57X2JnX2NvbG9yX2luZGV4fSA9IDB4MDg7CisgICAgICAgICAgICAkYXJlYS0+e19iZ19jb2xvcl9yZ2J9ICAgPSAweDAwMDAwMDsKKyAgICAgICAgICAgICRhcmVhLT57X2FyZWFfcGF0dGVybn0gICA9IDE7CisgICAgICAgICAgICAkYXJlYS0+e19hcmVhX29wdGlvbnN9ICAgPSAweDAwMDAgaWYgJHNlbGYtPntfZW1iZWRkZWR9OworICAgICAgICAgICAgJGFyZWEtPntfdmlzaWJsZX0gICAgICAgID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgU2V0IHRoZSBib3JkZXIgbGluZSBjb2xvdXIuCisgICAgaWYgKCBkZWZpbmVkICRhcmd7bGluZV9jb2xvcn0gKSB7CisgICAgICAgIG15ICggJGluZGV4LCAkcmdiICkgPSAkc2VsZi0+X2dldF9jb2xvcl9pbmRpY2VzKCAkYXJne2xpbmVfY29sb3J9ICk7CisgICAgICAgIGlmICggZGVmaW5lZCAkaW5kZXggKSB7CisgICAgICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX2luZGV4fSA9ICRpbmRleDsKKyAgICAgICAgICAgICRhcmVhLT57X2xpbmVfY29sb3JfcmdifSAgID0gJHJnYjsKKyAgICAgICAgICAgICRhcmVhLT57X2xpbmVfcGF0dGVybn0gICAgID0gMHgwMDsKKyAgICAgICAgICAgICRhcmVhLT57X2xpbmVfb3B0aW9uc30gICAgID0gMHgwMDAwOworICAgICAgICAgICAgJGFyZWEtPntfdmlzaWJsZX0gICAgICAgICAgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgIyBTZXQgdGhlIGJvcmRlciBsaW5lIHBhdHRlcm4uCisgICAgaWYgKCBkZWZpbmVkICRhcmd7bGluZV9wYXR0ZXJufSApIHsKKyAgICAgICAgbXkgJHBhdHRlcm4gPSAkc2VsZi0+X2dldF9saW5lX3BhdHRlcm4oICRhcmd7bGluZV9wYXR0ZXJufSApOworICAgICAgICAkYXJlYS0+e19saW5lX3BhdHRlcm59ICAgICA9ICRwYXR0ZXJuOworICAgICAgICAkYXJlYS0+e19saW5lX29wdGlvbnN9ICAgICA9IDB4MDAwMDsKKyAgICAgICAgJGFyZWEtPntfbGluZV9jb2xvcl9pbmRleH0gPSAweDRGIGlmICFkZWZpbmVkICRhcmd7bGluZV9jb2xvcn07CisgICAgICAgICRhcmVhLT57X3Zpc2libGV9ICAgICAgICAgID0gMTsKKyAgICB9CisKKyAgICAjIFNldCB0aGUgYm9yZGVyIGxpbmUgd2VpZ2h0LgorICAgIGlmICggZGVmaW5lZCAkYXJne2xpbmVfd2VpZ2h0fSApIHsKKyAgICAgICAgbXkgJHdlaWdodCA9ICRzZWxmLT5fZ2V0X2xpbmVfd2VpZ2h0KCAkYXJne2xpbmVfd2VpZ2h0fSApOworICAgICAgICAkYXJlYS0+e19saW5lX3dlaWdodH0gICAgICA9ICR3ZWlnaHQ7CisgICAgICAgICRhcmVhLT57X2xpbmVfb3B0aW9uc30gICAgID0gMHgwMDAwOworICAgICAgICAkYXJlYS0+e19saW5lX3BhdHRlcm59ICAgICA9IDB4MDAgaWYgIWRlZmluZWQgJGFyZ3tsaW5lX3BhdHRlcm59OworICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX2luZGV4fSA9IDB4NEYgaWYgIWRlZmluZWQgJGFyZ3tsaW5lX2NvbG9yfTsKKyAgICAgICAgJGFyZWEtPntfdmlzaWJsZX0gICAgICAgICAgPSAxOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEludGVybmFsIG1ldGhvZHMuIFRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBtZXRob2RzIGFyZSB1c2VkIGZvciB0aGUgaW50ZXJuYWwKKyMgc3RydWN0dXJpbmcgb2YgdGhlIENoYXJ0IG9iamVjdCBhbmQgZmlsZSBmb3JtYXQuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcHJlcGVuZCgpLCBvdmVycmlkZGVuLgorIworIyBUaGUgcGFyZW50IFdvcmtzaGVldCBjbGFzcyBuZWVkcyB0byBzdG9yZSBzb21lIGRhdGEgaW4gbWVtb3J5IGFuZCBzb21lIGluCisjIHRlbXBvcmFyeSBmaWxlcyBmb3IgZWZmaWNpZW5jeS4gVGhlIENoYXJ0KiBjbGFzc2VzIGRvbid0IG5lZWQgdG8gZG8gdGhpcworIyBzaW5jZSB0aGV5IGFyZSBkZWFsaW5nIHdpdGggc21hbGxlciBhbW91bnRzIG9mIGRhdGEgc28gd2Ugb3ZlcnJpZGUKKyMgX3ByZXBlbmQoKSB0byB0dXJuIGl0IGludG8gYW4gX2FwcGVuZCgpIG1ldGhvZC4gVGhpcyBhbGxvd3MgZm9yIGEgbW9yZQorIyBuYXR1cmFsIG1ldGhvZCBjYWxsaW5nIG9yZGVyLgorIworc3ViIF9wcmVwZW5kIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e191c2luZ190bXBmaWxlfSA9IDA7CisKKyAgICByZXR1cm4gJHNlbGYtPl9hcHBlbmQoIEBfICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2xvc2UoKSwgb3ZlcnJpZGRlbi4KKyMKKyMgQ3JlYXRlIGFuZCBzdG9yZSB0aGUgQ2hhcnQgZGF0YSBzdHJ1Y3R1cmVzLgorIworc3ViIF9jbG9zZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBJZ25vcmUgYW55IGRhdGEgdGhhdCBoYXMgYmVlbiB3cml0dGVuIHNvIGZhciBzaW5jZSBpdCBpcyBwcm9iYWJseQorICAgICMgZnJvbSB1bndhbnRlZCBXb3Jrc2hlZXQgbWV0aG9kIGNhbGxzLgorICAgICRzZWxmLT57X2RhdGF9ID0gJyc7CisKKyAgICAjIFRPRE8uIENoZWNrIGZvciBjaGFydHMgd2l0aG91dCBhIHNlcmllcz8KKworICAgICMgU3RvcmUgdGhlIGNoYXJ0IEJPRi4KKyAgICAkc2VsZi0+X3N0b3JlX2JvZiggMHgwMDIwICk7CisKKyAgICAjIFN0b3JlIHRoZSBwYWdlIGhlYWRlcgorICAgICRzZWxmLT5fc3RvcmVfaGVhZGVyKCk7CisKKyAgICAjIFN0b3JlIHRoZSBwYWdlIGZvb3RlcgorICAgICRzZWxmLT5fc3RvcmVfZm9vdGVyKCk7CisKKyAgICAjIFN0b3JlIHRoZSBwYWdlIGhvcml6b250YWwgY2VudGVyaW5nCisgICAgJHNlbGYtPl9zdG9yZV9oY2VudGVyKCk7CisKKyAgICAjIFN0b3JlIHRoZSBwYWdlIHZlcnRpY2FsIGNlbnRlcmluZworICAgICRzZWxmLT5fc3RvcmVfdmNlbnRlcigpOworCisgICAgIyBTdG9yZSB0aGUgbGVmdCBtYXJnaW4KKyAgICAkc2VsZi0+X3N0b3JlX21hcmdpbl9sZWZ0KCk7CisKKyAgICAjIFN0b3JlIHRoZSByaWdodCBtYXJnaW4KKyAgICAkc2VsZi0+X3N0b3JlX21hcmdpbl9yaWdodCgpOworCisgICAgIyBTdG9yZSB0aGUgdG9wIG1hcmdpbgorICAgICRzZWxmLT5fc3RvcmVfbWFyZ2luX3RvcCgpOworCisgICAgIyBTdG9yZSB0aGUgYm90dG9tIG1hcmdpbgorICAgICRzZWxmLT5fc3RvcmVfbWFyZ2luX2JvdHRvbSgpOworCisgICAgIyBTdG9yZSB0aGUgcGFnZSBzZXR1cAorICAgICRzZWxmLT5fc3RvcmVfc2V0dXAoKTsKKworICAgICMgU3RvcmUgdGhlIHNoZWV0IHBhc3N3b3JkCisgICAgJHNlbGYtPl9zdG9yZV9wYXNzd29yZCgpOworCisgICAgIyBTdGFydCBvZiBDaGFydCBzcGVjaWZpYyByZWNvcmRzLgorCisgICAgIyBTdG9yZSB0aGUgRkJJIGZvbnQgcmVjb3Jkcy4KKyAgICAkc2VsZi0+X3N0b3JlX2ZiaSggQHsgJHNlbGYtPntfY29uZmlnfS0+e19mb250X251bWJlcnN9IH0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2ZiaSggQHsgJHNlbGYtPntfY29uZmlnfS0+e19mb250X3Nlcmllc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfZmJpKCBAeyAkc2VsZi0+e19jb25maWd9LT57X2ZvbnRfdGl0bGV9IH0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2ZiaSggQHsgJHNlbGYtPntfY29uZmlnfS0+e19mb250X2F4ZXN9IH0gKTsKKworICAgICMgSWdub3JlIFVOSVRTIHJlY29yZC4KKworICAgICMgU3RvcmUgdGhlIENoYXJ0IHN1Yi1zdHJlYW0uCisgICAgJHNlbGYtPl9zdG9yZV9jaGFydF9zdHJlYW0oKTsKKworICAgICMgQXBwZW5kIHRoZSBzaGVldCBkaW1lbnNpb25zCisgICAgJHNlbGYtPl9zdG9yZV9kaW1lbnNpb25zKCk7CisKKyAgICAjIFRPRE8gYWRkIFNJTkRFWCBhbmQgTlVNQkVSIHJlY29yZHMuCisKKyAgICBpZiAoICEkc2VsZi0+e19lbWJlZGRlZH0gKSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfd2luZG93MigpOworICAgIH0KKworICAgICRzZWxmLT5fc3RvcmVfZW9mKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfd2luZG93MigpLCBvdmVycmlkZGVuLgorIworIyBXcml0ZSBCSUZGIHJlY29yZCBXaW5kb3cyLiBOb3RlLCB0aGlzIG92ZXJyaWRlcyB0aGUgcGFyZW50IFdvcmtzaGVldAorIyByZWNvcmQgYmVjYXVzZSB0aGUgQ2hhcnQgdmVyc2lvbiBvZiB0aGUgcmVjb3JkIGlzIHNtYWxsZXIgYW5kIGlzIHVzZWQKKyMgbWFpbmx5IHRvIGluZGljYXRlIGlmIHRoZSBjaGFydCB0YWIgaXMgc2VsZWN0ZWQgb3Igbm90LgorIworc3ViIF9zdG9yZV93aW5kb3cyIHsKKworICAgIHVzZSBpbnRlZ2VyOyAgICAjIEF2b2lkIDw8IHNoaWZ0IGJ1ZyBpbiBQZXJsIDUuNi4wIG9uIEhQLVVYCisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgPSAweDAyM0U7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwQTsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisgICAgbXkgJGdyYml0ICAgPSAweDAwMDA7ICAgICMgT3B0aW9uIGZsYWdzCisgICAgbXkgJHJ3VG9wICAgPSAweDAwMDA7ICAgICMgVG9wIHZpc2libGUgcm93CisgICAgbXkgJGNvbExlZnQgPSAweDAwMDA7ICAgICMgTGVmdG1vc3QgdmlzaWJsZSBjb2x1bW4KKyAgICBteSAkcmdiSGRyICA9IDB4MDAwMDsgICAgIyBSb3cvY29sIGhlYWRpbmcsIGdyaWQgY29sb3IKKworICAgICMgVGhlIG9wdGlvbnMgZmxhZ3MgdGhhdCBjb21wcmlzZSAkZ3JiaXQKKyAgICBteSAkZkRzcEZtbGEgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICMgMCAtIGJpdAorICAgIG15ICRmRHNwR3JpZCAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIyAxCisgICAgbXkgJGZEc3BSd0NvbCAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDIKKyAgICBteSAkZkZyb3plbiAgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICMgMworICAgIG15ICRmRHNwWmVyb3MgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIyA0CisgICAgbXkgJGZEZWZhdWx0SGRyICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDUKKyAgICBteSAkZkFyYWJpYyAgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICMgNgorICAgIG15ICRmRHNwR3V0cyAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIyA3CisgICAgbXkgJGZGcm96ZW5Ob1NwbGl0ID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDAgLSBiaXQKKyAgICBteSAkZlNlbGVjdGVkICAgICAgPSAkc2VsZi0+e19zZWxlY3RlZH07ICAgICMgMQorICAgIG15ICRmUGFnZWQgICAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIyAyCisgICAgbXkgJGZCcmVha1ByZXZpZXcgID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDMKKworICAgICM8PDwgUGVybHRpZHkgaWdub3JlIHRoaXMuCisgICAgJGdyYml0ICAgICAgICAgICAgID0gJGZEc3BGbWxhOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwR3JpZCAgICAgICA8PCAxOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwUndDb2wgICAgICA8PCAyOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRnJvemVuICAgICAgICA8PCAzOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwWmVyb3MgICAgICA8PCA0OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRGVmYXVsdEhkciAgICA8PCA1OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmQXJhYmljICAgICAgICA8PCA2OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwR3V0cyAgICAgICA8PCA3OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRnJvemVuTm9TcGxpdCA8PCA4OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmU2VsZWN0ZWQgICAgICA8PCA5OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmUGFnZWQgICAgICAgICA8PCAxMDsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkJyZWFrUHJldmlldyAgPDwgMTE7CisgICAgIz4+PgorCisgICAgbXkgJGhlYWRlciA9IHBhY2soICJ2diIsICRyZWNvcmQsICRsZW5ndGggKTsKKyAgICBteSAkZGF0YSA9IHBhY2soICJ2dnZWIiwgJGdyYml0LCAkcndUb3AsICRjb2xMZWZ0LCAkcmdiSGRyICk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYXJzZV9zZXJpZXNfZm9ybXVsYSgpCisjCisjIFBhcnNlIHRoZSBmb3JtdWxhIHVzZWQgdG8gZGVmaW5lIGEgc2VyaWVzLiBXZSBhbHNvIGV4dHJhY3Qgc29tZSByYW5nZQorIyBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgX3N0b3JlX3NlcmllcygpIGFuZCB0aGUgU0VSSUVTIHJlY29yZC4KKyMKK3N1YiBfcGFyc2Vfc2VyaWVzX2Zvcm11bGEgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRmb3JtdWxhICA9ICRfWzBdOworICAgIG15ICRlbmNvZGluZyA9IDA7CisgICAgbXkgJGxlbmd0aCAgID0gMDsKKyAgICBteSAkY291bnQgICAgPSAwOworICAgIG15IEB0b2tlbnM7CisKKyAgICByZXR1cm4gJycgaWYgIWRlZmluZWQgJGZvcm11bGE7CisKKyAgICAjIFN0cmlwIHRoZSA9IHNpZ24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9ybXVsYSBzdHJpbmcKKyAgICAkZm9ybXVsYSA9fiBzKF49KSgpOworCisgICAgIyBQYXJzZSB0aGUgZm9ybXVsYSB1c2luZyB0aGUgcGFyc2VyIGluIEZvcm11bGEucG0KKyAgICBteSAkcGFyc2VyID0gJHNlbGYtPntfcGFyc2VyfTsKKworICAgICMgSW4gb3JkZXIgdG8gcmFpc2UgZm9ybXVsYSBlcnJvcnMgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgY2FsbGluZworICAgICMgcHJvZ3JhbSB3ZSB1c2UgYW4gZXZhbCBibG9jayBhbmQgcmUtcmFpc2UgdGhlIGVycm9yIGZyb20gaGVyZS4KKyAgICAjCisgICAgZXZhbCB7IEB0b2tlbnMgPSAkcGFyc2VyLT5wYXJzZV9mb3JtdWxhKCAkZm9ybXVsYSApIH07CisKKyAgICBpZiAoICRAICkgeworICAgICAgICAkQCA9fiBzL1xuJC8vOyAgICAjIFN0cmlwIHRoZSBcbiB1c2VkIGluIHRoZSBGb3JtdWxhLnBtIGRpZSgpLgorICAgICAgICBjcm9hayAkQDsgICAgICAgICAjIFJlLXJhaXNlIHRoZSBlcnJvci4KKyAgICB9CisKKyAgICAjIEZvcmNlIHJhbmdlcyB0byBiZSBhIHJlZmVyZW5jZSBjbGFzcy4KKyAgICBzL19yZWYzZC9fcmVmM2RSLyAgICAgZm9yIEB0b2tlbnM7CisgICAgcy9fcmFuZ2UzZC9fcmFuZ2UzZFIvIGZvciBAdG9rZW5zOworICAgIHMvX25hbWUvX25hbWVSLyAgICAgICBmb3IgQHRva2VuczsKKworICAgICMgUGFyc2UgdGhlIHRva2VucyBpbnRvIGEgZm9ybXVsYSBzdHJpbmcuCisgICAgJGZvcm11bGEgPSAkcGFyc2VyLT5wYXJzZV90b2tlbnMoIEB0b2tlbnMgKTsKKworICAgICMgUmV0dXJuIGZvcm11bGEgZm9yIGEgc2luZ2xlIGNlbGwgYXMgdXNlZCBieSB0aXRsZSBhbmQgc2VyaWVzIG5hbWUuCisgICAgaWYgKCBvcmQgJGZvcm11bGEgPT0gMHgzQSApIHsKKyAgICAgICAgcmV0dXJuICRmb3JtdWxhOworICAgIH0KKworICAgICMgRXh0cmFjdCB0aGUgcmFuZ2UgZnJvbSB0aGUgcGFyc2UgZm9ybXVsYS4KKyAgICBpZiAoIG9yZCAkZm9ybXVsYSA9PSAweDNCICkgeworICAgICAgICBteSAoICRwdGcsICRleHRfcmVmLCAkcm93XzEsICRyb3dfMiwgJGNvbF8xLCAkY29sXzIgKSA9IHVucGFjayAnQ3Y1JywKKyAgICAgICAgICAkZm9ybXVsYTsKKworICAgICAgICAjIFRPRE8uIFJlbW92ZSBoaWdoIGJpdCBvbiByZWxhdGl2ZSByZWZlcmVuY2VzLgorICAgICAgICAkY291bnQgPSAkcm93XzIgLSAkcm93XzEgKyAxOworICAgIH0KKworICAgIHJldHVybiAoICRmb3JtdWxhLCAkY291bnQgKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZW5jb2RlX3V0ZjE2KCkKKyMKKyMgQ29udmVydCBVVEY4IHN0cmluZ3MgdXNlZCBpbiB0aGUgY2hhcnQgdG8gVVRGMTYuCisjCitzdWIgX2VuY29kZV91dGYxNiB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHN0cmluZyA9IHNoaWZ0OworICAgIG15ICRlbmNvZGluZyA9IHNoaWZ0IHx8IDA7CisKKyAgICAjIEV4aXQgaWYgdGhlICRzdHJpbmcgaXNuJ3QgZGVmaW5lZCwgaS5lLiwgaGFzbid0IGJlZW4gc2V0IGJ5IHVzZXIuCisgICAgcmV0dXJuICggdW5kZWYsIHVuZGVmICkgaWYgIWRlZmluZWQgJHN0cmluZzsKKworICAgICMgUmV0dXJuIGlmIGVuY29kaW5nIGlzIHNldCwgaS5lLiwgc3RyaW5nIGhhcyBiZWVuIG1hbnVhbGx5IGVuY29kZWQuCisgICAgI3JldHVybiAoIHVuZGVmLCB1bmRlZiApIGlmICRzdHJpbmcgPT0gMTsKKworICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICBpZiAoICRdID49IDUuMDA4ICkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICBpZiAoIEVuY29kZTo6aXNfdXRmOCggJHN0cmluZyApICkgeworICAgICAgICAgICAgJHN0cmluZyA9IEVuY29kZTo6ZW5jb2RlKCAiVVRGLTE2QkUiLCAkc3RyaW5nICk7CisgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgIyBDaGFydCBzdHJpbmdzIGFyZSBsaW1pdGVkIHRvIDI1NSBjaGFyYWN0ZXJzLgorICAgIG15ICRsaW1pdCA9ICRlbmNvZGluZyA/IDI1NSAqIDIgOiAyNTU7CisKKyAgICBpZiAoIGxlbmd0aCAkc3RyaW5nID49ICRsaW1pdCApIHsKKworICAgICAgICAjIHRydW5jYXRlIHRoZSBzdHJpbmcgYW5kIHJhaXNlIGEgd2FybmluZy4KKyAgICAgICAgJHN0cmluZyA9IHN1YnN0ciAkc3RyaW5nLCAwLCAkbGltaXQ7CisgICAgICAgIGNhcnAgJ0NoYXJ0IHN0cmluZ3MgbXVzdCBiZSBsZXNzIHRoYW4gMjU2IGNoYXJhY3RlcnMuICcKKyAgICAgICAgICAuICdTdHJpbmcgdHJ1bmNhdGVkJzsKKyAgICB9CisKKyAgICByZXR1cm4gKCAkc3RyaW5nLCAkZW5jb2RpbmcgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfY29sb3JfaW5kaWNlcygpCisjCisjIENvbnZlcnQgdGhlIHVzZXIgc3BlY2lmaWVkIGNvbG91ciBpbmRleCBvciBzdHJpbmcgdG8gYW4gY29sb3VyIGluZGV4IGFuZAorIyBSR0IgY29sb3VyIG51bWJlci4KKyMKK3N1YiBfZ2V0X2NvbG9yX2luZGljZXMgeworCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJGNvbG9yID0gc2hpZnQ7CisgICAgbXkgJGluZGV4OworICAgIG15ICRyZ2I7CisKKyAgICByZXR1cm4gKCB1bmRlZiwgdW5kZWYgKSBpZiAhZGVmaW5lZCAkY29sb3I7CisKKyAgICBteSAlY29sb3JzID0gKAorICAgICAgICBhcXVhICAgID0+IDB4MEYsCisgICAgICAgIGN5YW4gICAgPT4gMHgwRiwKKyAgICAgICAgYmxhY2sgICA9PiAweDA4LAorICAgICAgICBibHVlICAgID0+IDB4MEMsCisgICAgICAgIGJyb3duICAgPT4gMHgxMCwKKyAgICAgICAgbWFnZW50YSA9PiAweDBFLAorICAgICAgICBmdWNoc2lhID0+IDB4MEUsCisgICAgICAgIGdyYXkgICAgPT4gMHgxNywKKyAgICAgICAgZ3JleSAgICA9PiAweDE3LAorICAgICAgICBncmVlbiAgID0+IDB4MTEsCisgICAgICAgIGxpbWUgICAgPT4gMHgwQiwKKyAgICAgICAgbmF2eSAgICA9PiAweDEyLAorICAgICAgICBvcmFuZ2UgID0+IDB4MzUsCisgICAgICAgIHBpbmsgICAgPT4gMHgyMSwKKyAgICAgICAgcHVycGxlICA9PiAweDE0LAorICAgICAgICByZWQgICAgID0+IDB4MEEsCisgICAgICAgIHNpbHZlciAgPT4gMHgxNiwKKyAgICAgICAgd2hpdGUgICA9PiAweDA5LAorICAgICAgICB5ZWxsb3cgID0+IDB4MEQsCisgICAgKTsKKworCisgICAgIyBDaGVjayBmb3IgdGhlIHZhcmlvdXMgc3VwcG9ydGVkIGNvbG91ciBpbmRleC9uYW1lIHBvc3NpYmlsaXRpZXMuCisgICAgaWYgKCBleGlzdHMgJGNvbG9yc3skY29sb3J9ICkgeworCisgICAgICAgICMgQ29sb3VyIG1hdGNoZXMgb25lIG9mIHRoZSBzdXBwb3J0ZWQgY29sb3VyIG5hbWVzLgorICAgICAgICAkaW5kZXggPSAkY29sb3JzeyRjb2xvcn07CisgICAgfQorICAgIGVsc2lmICggJGNvbG9yID1+IG0vXEQvICkgeworCisgICAgICAgICMgUmV0dXJuIHVuZGVmIGlmICRjb2xvciBpcyBhIHN0cmluZyBidXQgbm90IG9uZSBvZiB0aGUgc3VwcG9ydGVkIG9uZXMuCisgICAgICAgIHJldHVybiAoIHVuZGVmLCB1bmRlZiApOworICAgIH0KKyAgICBlbHNpZiAoICRjb2xvciA8IDggfHwgJGNvbG9yID4gNjMgKSB7CisKKyAgICAgICAgIyBSZXR1cm4gdW5kZWYgaWYgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgorICAgICAgICByZXR1cm4gKCB1bmRlZiwgdW5kZWYgKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgIyBXZSBzaG91bGQgaGF2ZSBhIHZhbGlkIGNvbG9yIGluZGV4IGluIGEgdmFsaWQgcmFuZ2UuCisgICAgICAgICRpbmRleCA9ICRjb2xvcjsKKyAgICB9CisKKyAgICAkcmdiID0gJHNlbGYtPl9nZXRfY29sb3JfcmJnKCAkaW5kZXggKTsKKyAgICByZXR1cm4gKCAkaW5kZXgsICRyZ2IgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfY29sb3JfcmJnKCkKKyMKKyMgR2V0IHRoZSBSZWRHcmVlbkJsdWUgbnVtYmVyIGZvciB0aGUgY29sb3VyIGluZGV4IGZyb20gdGhlIFdvcmtib29rIHBhbGV0dGUuCisjCitzdWIgX2dldF9jb2xvcl9yYmcgeworCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJGluZGV4ID0gc2hpZnQ7CisKKyAgICAjIEFkanVzdCBjb2xvdXIgaW5kZXggZnJvbSA4LTYzICh1c2VyIHJhbmdlKSB0byAwLTU1IChFeGNlbCByYW5nZSkuCisgICAgJGluZGV4IC09IDg7CisKKyAgICBteSBAcmVkX2dyZWVuX2JsdWUgPSBAeyAkc2VsZi0+e19wYWxldHRlfS0+WyRpbmRleF0gfTsKKyAgICByZXR1cm4gdW5wYWNrICdWJywgcGFjayAnQyonLCBAcmVkX2dyZWVuX2JsdWU7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZ2V0X2xpbmVfcGF0dGVybigpCisjCisjIEdldCB0aGUgRXhjZWwgY2hhcnQgaW5kZXggZm9yIGxpbmUgcGF0dGVybiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB1c2VyCisjIGRlZmluZWQgdmFsdWUuCisjCitzdWIgX2dldF9saW5lX3BhdHRlcm4geworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkdmFsdWUgICA9IGxjIHNoaWZ0OworICAgIG15ICRkZWZhdWx0ID0gMDsKKyAgICBteSAkcGF0dGVybjsKKworICAgIG15ICVwYXR0ZXJucyA9ICgKKyAgICAgICAgMCAgICAgICAgICAgICAgPT4gNSwKKyAgICAgICAgMSAgICAgICAgICAgICAgPT4gMCwKKyAgICAgICAgMiAgICAgICAgICAgICAgPT4gMSwKKyAgICAgICAgMyAgICAgICAgICAgICAgPT4gMiwKKyAgICAgICAgNCAgICAgICAgICAgICAgPT4gMywKKyAgICAgICAgNSAgICAgICAgICAgICAgPT4gNCwKKyAgICAgICAgNiAgICAgICAgICAgICAgPT4gNywKKyAgICAgICAgNyAgICAgICAgICAgICAgPT4gNiwKKyAgICAgICAgOCAgICAgICAgICAgICAgPT4gOCwKKyAgICAgICAgJ3NvbGlkJyAgICAgICAgPT4gMCwKKyAgICAgICAgJ2Rhc2gnICAgICAgICAgPT4gMSwKKyAgICAgICAgJ2RvdCcgICAgICAgICAgPT4gMiwKKyAgICAgICAgJ2Rhc2gtZG90JyAgICAgPT4gMywKKyAgICAgICAgJ2Rhc2gtZG90LWRvdCcgPT4gNCwKKyAgICAgICAgJ25vbmUnICAgICAgICAgPT4gNSwKKyAgICAgICAgJ2RhcmstZ3JheScgICAgPT4gNiwKKyAgICAgICAgJ21lZGl1bS1ncmF5JyAgPT4gNywKKyAgICAgICAgJ2xpZ2h0LWdyYXknICAgPT4gOCwKKyAgICApOworCisgICAgaWYgKCBleGlzdHMgJHBhdHRlcm5zeyR2YWx1ZX0gKSB7CisgICAgICAgICRwYXR0ZXJuID0gJHBhdHRlcm5zeyR2YWx1ZX07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkcGF0dGVybiA9ICRkZWZhdWx0OworICAgIH0KKworICAgIHJldHVybiAkcGF0dGVybjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfbGluZV93ZWlnaHQoKQorIworIyBHZXQgdGhlIEV4Y2VsIGNoYXJ0IGluZGV4IGZvciBsaW5lIHdlaWdodCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB1c2VyCisjIGRlZmluZWQgdmFsdWUuCisjCitzdWIgX2dldF9saW5lX3dlaWdodCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICR2YWx1ZSAgID0gbGMgc2hpZnQ7CisgICAgbXkgJGRlZmF1bHQgPSAwOworICAgIG15ICR3ZWlnaHQ7CisKKyAgICBteSAld2VpZ2h0cyA9ICgKKyAgICAgICAgMSAgICAgICAgICA9PiAtMSwKKyAgICAgICAgMiAgICAgICAgICA9PiAwLAorICAgICAgICAzICAgICAgICAgID0+IDEsCisgICAgICAgIDQgICAgICAgICAgPT4gMiwKKyAgICAgICAgJ2hhaXJsaW5lJyA9PiAtMSwKKyAgICAgICAgJ25hcnJvdycgICA9PiAwLAorICAgICAgICAnbWVkaXVtJyAgID0+IDEsCisgICAgICAgICd3aWRlJyAgICAgPT4gMiwKKyAgICApOworCisgICAgaWYgKCBleGlzdHMgJHdlaWdodHN7JHZhbHVlfSApIHsKKyAgICAgICAgJHdlaWdodCA9ICR3ZWlnaHRzeyR2YWx1ZX07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkd2VpZ2h0ID0gJGRlZmF1bHQ7CisgICAgfQorCisgICAgcmV0dXJuICR3ZWlnaHQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRfc3RyZWFtKCkKKyMKKyMgU3RvcmUgdGhlIENIQVJUIHJlY29yZCBhbmQgaXQncyBzdWJzdHJlYW1zLgorIworc3ViIF9zdG9yZV9jaGFydF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfY2hhcnQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfY2hhcnR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKworICAgICMgSWdub3JlIFNDTCByZWNvcmQgZm9yIG5vdy4KKyAgICAkc2VsZi0+X3N0b3JlX3Bsb3Rncm93dGgoKTsKKworICAgIGlmICggJHNlbGYtPntfY2hhcnRhcmVhfS0+e192aXNpYmxlfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9jaGFydGFyZWFfZnJhbWVfc3RyZWFtKCk7CisgICAgfQorCisgICAgIyBTdG9yZSBTRVJJRVMgc3RyZWFtIGZvciBlYWNoIHNlcmllcy4KKyAgICBteSAkaW5kZXggPSAwOworICAgIGZvciBteSAkc2VyaWVzICggQHsgJHNlbGYtPntfc2VyaWVzfSB9ICkgeworCisgICAgICAgICRzZWxmLT5fc3RvcmVfc2VyaWVzX3N0cmVhbSgKKyAgICAgICAgICAgIF9pbmRleCAgICAgICAgICAgID0+ICRpbmRleCwKKyAgICAgICAgICAgIF92YWx1ZV9mb3JtdWxhICAgID0+ICRzZXJpZXMtPntfdmFsdWVzfS0+WzBdLAorICAgICAgICAgICAgX3ZhbHVlX2NvdW50ICAgICAgPT4gJHNlcmllcy0+e192YWx1ZXN9LT5bMV0sCisgICAgICAgICAgICBfY2F0ZWdvcnlfY291bnQgICA9PiAkc2VyaWVzLT57X2NhdGVnb3JpZXN9LT5bMV0sCisgICAgICAgICAgICBfY2F0ZWdvcnlfZm9ybXVsYSA9PiAkc2VyaWVzLT57X2NhdGVnb3JpZXN9LT5bMF0sCisgICAgICAgICAgICBfbmFtZSAgICAgICAgICAgICA9PiAkc2VyaWVzLT57bmFtZX0sCisgICAgICAgICAgICBfbmFtZV9lbmNvZGluZyAgICA9PiAkc2VyaWVzLT57bmFtZV9lbmNvZGluZ30sCisgICAgICAgICAgICBfbmFtZV9mb3JtdWxhICAgICA9PiAkc2VyaWVzLT57X25hbWVfZm9ybXVsYX0sCisgICAgICAgICk7CisKKyAgICAgICAgJGluZGV4Kys7CisgICAgfQorCisgICAgJHNlbGYtPl9zdG9yZV9zaHRwcm9wcygpOworCisgICAgIyBXcml0ZSB0aGUgVEVYVCBzdHJlYW1zLgorICAgIGZvciBteSAkZm9udF9pbmRleCAoIDUgLi4gNiApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9kZWZhdWx0dGV4dCgpOworICAgICAgICAkc2VsZi0+X3N0b3JlX3Nlcmllc190ZXh0X3N0cmVhbSggJGZvbnRfaW5kZXggKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX2F4ZXN1c2VkKCAxICk7CisgICAgJHNlbGYtPl9zdG9yZV9heGlzcGFyZW50X3N0cmVhbSgpOworCisgICAgaWYgKCBkZWZpbmVkICRzZWxmLT57X3RpdGxlX25hbWV9IHx8IGRlZmluZWQgJHNlbGYtPntfdGl0bGVfZm9ybXVsYX0gKSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfdGl0bGVfdGV4dF9zdHJlYW0oKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfc2VyaWVzX3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBTRVJJRVMgY2hhcnQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV9zZXJpZXNfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKworICAgIG15ICRuYW1lX3R5cGUgICAgID0gJGFyZ3tfbmFtZV9mb3JtdWxhfSAgICAgPyAyIDogMTsKKyAgICBteSAkdmFsdWVfdHlwZSAgICA9ICRhcmd7X3ZhbHVlX2Zvcm11bGF9ICAgID8gMiA6IDA7CisgICAgbXkgJGNhdGVnb3J5X3R5cGUgPSAkYXJne19jYXRlZ29yeV9mb3JtdWxhfSA/IDIgOiAwOworCisgICAgJHNlbGYtPl9zdG9yZV9zZXJpZXMoICRhcmd7X3ZhbHVlX2NvdW50fSwgJGFyZ3tfY2F0ZWdvcnlfY291bnR9ICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisKKyAgICAjIFN0b3JlIHRoZSBTZXJpZXMgbmFtZSBBSSByZWNvcmQuCisgICAgJHNlbGYtPl9zdG9yZV9haSggMCwgJG5hbWVfdHlwZSwgJGFyZ3tfbmFtZV9mb3JtdWxhfSApOworICAgIGlmICggZGVmaW5lZCAkYXJne19uYW1lfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9zZXJpZXN0ZXh0KCAkYXJne19uYW1lfSwgJGFyZ3tfbmFtZV9lbmNvZGluZ30gKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAxLCAkdmFsdWVfdHlwZSwgICAgJGFyZ3tfdmFsdWVfZm9ybXVsYX0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAyLCAkY2F0ZWdvcnlfdHlwZSwgJGFyZ3tfY2F0ZWdvcnlfZm9ybXVsYX0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAzLCAxLCAgICAgICAgICAgICAgJycgKTsKKworICAgICRzZWxmLT5fc3RvcmVfZGF0YWZvcm1hdF9zdHJlYW0oICRhcmd7X2luZGV4fSwgJGFyZ3tfaW5kZXh9LCAweEZGRkYgKTsKKyAgICAkc2VsZi0+X3N0b3JlX3NlcnRvY3J0KCAwICk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9kYXRhZm9ybWF0X3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBEQVRBRk9STUFUIGNoYXJ0IHN1YnN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfZGF0YWZvcm1hdF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzZXJpZXNfaW5kZXggPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfZGF0YWZvcm1hdCggJHNlcmllc19pbmRleCwgJHNlcmllc19pbmRleCwgMHhGRkZGICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV8zZGJhcnNoYXBlKCk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zZXJpZXNfdGV4dF9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgc2VyaWVzIFRFWFQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV9zZXJpZXNfdGV4dF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRmb250X2luZGV4ID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX3RleHQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfc2VyaWVzX3RleHR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e19zZXJpZXNfdGV4dF9wb3N9IH0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2ZvbnR4KCAkZm9udF9pbmRleCApOworICAgICRzZWxmLT5fc3RvcmVfYWkoIDAsIDEsICcnICk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV94X2F4aXNfdGV4dF9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgWC1heGlzIFRFWFQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV94X2F4aXNfdGV4dF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRmb3JtdWxhID0gJHNlbGYtPntfeF9heGlzX2Zvcm11bGF9OworICAgIG15ICRhaV90eXBlID0gJGZvcm11bGEgPyAyIDogMTsKKworICAgICRzZWxmLT5fc3RvcmVfdGV4dCggQHsgJHNlbGYtPntfY29uZmlnfS0+e194X2F4aXNfdGV4dH0gfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfcG9zKCBAeyAkc2VsZi0+e19jb25maWd9LT57X3hfYXhpc190ZXh0X3Bvc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfZm9udHgoIDggKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAwLCAkYWlfdHlwZSwgJGZvcm11bGEgKTsKKworICAgIGlmICggZGVmaW5lZCAkc2VsZi0+e194X2F4aXNfbmFtZX0gKSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfc2VyaWVzdGV4dCggJHNlbGYtPntfeF9heGlzX25hbWV9LAorICAgICAgICAgICAgJHNlbGYtPntfeF9heGlzX2VuY29kaW5nfSwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX29iamVjdGxpbmsoIDMgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3lfYXhpc190ZXh0X3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBZLWF4aXMgVEVYVCBzdWJzdHJlYW0uCisjCitzdWIgX3N0b3JlX3lfYXhpc190ZXh0X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJGZvcm11bGEgPSAkc2VsZi0+e195X2F4aXNfZm9ybXVsYX07CisgICAgbXkgJGFpX3R5cGUgPSAkZm9ybXVsYSA/IDIgOiAxOworCisgICAgJHNlbGYtPl9zdG9yZV90ZXh0KCBAeyAkc2VsZi0+e19jb25maWd9LT57X3lfYXhpc190ZXh0fSB9ICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV9wb3MoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfeV9heGlzX3RleHRfcG9zfSB9ICk7CisgICAgJHNlbGYtPl9zdG9yZV9mb250eCggOCApOworICAgICRzZWxmLT5fc3RvcmVfYWkoIDAsICRhaV90eXBlLCAkZm9ybXVsYSApOworCisgICAgaWYgKCBkZWZpbmVkICRzZWxmLT57X3lfYXhpc19uYW1lfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9zZXJpZXN0ZXh0KCAkc2VsZi0+e195X2F4aXNfbmFtZX0sCisgICAgICAgICAgICAkc2VsZi0+e195X2F4aXNfZW5jb2Rpbmd9LAorICAgICAgICApOworICAgIH0KKworICAgICRzZWxmLT5fc3RvcmVfb2JqZWN0bGluayggMiApOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbGVnZW5kX3RleHRfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIGxlZ2VuZCBURVhUIHN1YnN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfbGVnZW5kX3RleHRfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX3RleHQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfbGVnZW5kX3RleHR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e19sZWdlbmRfdGV4dF9wb3N9IH0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAwLCAxLCAnJyApOworCisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV90aXRsZV90ZXh0X3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSB0aXRsZSBURVhUIHN1YnN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfdGl0bGVfdGV4dF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRmb3JtdWxhID0gJHNlbGYtPntfdGl0bGVfZm9ybXVsYX07CisgICAgbXkgJGFpX3R5cGUgPSAkZm9ybXVsYSA/IDIgOiAxOworCisgICAgJHNlbGYtPl9zdG9yZV90ZXh0KCBAeyAkc2VsZi0+e19jb25maWd9LT57X3RpdGxlX3RleHR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e190aXRsZV90ZXh0X3Bvc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfZm9udHgoIDcgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAwLCAkYWlfdHlwZSwgJGZvcm11bGEgKTsKKworICAgIGlmICggZGVmaW5lZCAkc2VsZi0+e190aXRsZV9uYW1lfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9zZXJpZXN0ZXh0KCAkc2VsZi0+e190aXRsZV9uYW1lfSwKKyAgICAgICAgICAgICRzZWxmLT57X3RpdGxlX2VuY29kaW5nfSwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX29iamVjdGxpbmsoIDEgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F4aXNwYXJlbnRfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIEFYSVNQQVJFTlQgY2hhcnQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV9heGlzcGFyZW50X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9heGlzcGFyZW50KCBAeyAkc2VsZi0+e19jb25maWd9LT57X2F4aXNwYXJlbnR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e19heGlzcGFyZW50X3Bvc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfYXhpc19jYXRlZ29yeV9zdHJlYW0oKTsKKyAgICAkc2VsZi0+X3N0b3JlX2F4aXNfdmFsdWVzX3N0cmVhbSgpOworCisgICAgaWYgKCBkZWZpbmVkICRzZWxmLT57X3hfYXhpc19uYW1lfSB8fCBkZWZpbmVkICRzZWxmLT57X3hfYXhpc19mb3JtdWxhfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV94X2F4aXNfdGV4dF9zdHJlYW0oKTsKKyAgICB9CisKKyAgICBpZiAoIGRlZmluZWQgJHNlbGYtPntfeV9heGlzX25hbWV9IHx8IGRlZmluZWQgJHNlbGYtPntfeV9heGlzX2Zvcm11bGF9ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX3lfYXhpc190ZXh0X3N0cmVhbSgpOworICAgIH0KKworICAgIGlmICggJHNlbGYtPntfcGxvdGFyZWF9LT57X3Zpc2libGV9ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX3Bsb3RhcmVhKCk7CisgICAgICAgICRzZWxmLT5fc3RvcmVfcGxvdGFyZWFfZnJhbWVfc3RyZWFtKCk7CisgICAgfQorCisgICAgJHNlbGYtPl9zdG9yZV9jaGFydGZvcm1hdF9zdHJlYW0oKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F4aXNfY2F0ZWdvcnlfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIEFYSVMgY2hhcnQgc3Vic3RyZWFtIGZvciB0aGUgY2hhcnQgY2F0ZWdvcnkuCisjCitzdWIgX3N0b3JlX2F4aXNfY2F0ZWdvcnlfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX2F4aXMoIDAgKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX2NhdHNlcnJhbmdlKCk7CisgICAgJHNlbGYtPl9zdG9yZV9heGNleHQoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3RpY2soKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F4aXNfdmFsdWVzX3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBBWElTIGNoYXJ0IHN1YnN0cmVhbSBmb3IgdGhlIGNoYXJ0IHZhbHVlcy4KKyMKK3N1YiBfc3RvcmVfYXhpc192YWx1ZXNfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX2F4aXMoIDEgKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3ZhbHVlcmFuZ2UoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3RpY2soKTsKKyAgICAkc2VsZi0+X3N0b3JlX2F4aXNsaW5lZm9ybWF0KCk7CisgICAgJHNlbGYtPl9zdG9yZV9saW5lZm9ybWF0KCAweDAwMDAwMDAwLCAweDAwMDAsIDB4RkZGRiwgMHgwMDA5LCAweDAwNEQgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3Bsb3RhcmVhX2ZyYW1lX3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBGUkFNRSBjaGFydCBzdWJzdHJlYW0gZm9yIHRoZSBwbG90YXJlYS4KKyMKK3N1YiBfc3RvcmVfcGxvdGFyZWFfZnJhbWVfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkYXJlYSA9ICRzZWxmLT57X3Bsb3RhcmVhfTsKKworICAgICRzZWxmLT5fc3RvcmVfZnJhbWUoIDB4MDAsIDB4MDMgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2xpbmVmb3JtYXQoCisgICAgICAgICRhcmVhLT57X2xpbmVfY29sb3JfcmdifSwgJGFyZWEtPntfbGluZV9wYXR0ZXJufSwKKyAgICAgICAgJGFyZWEtPntfbGluZV93ZWlnaHR9LCAgICAkYXJlYS0+e19saW5lX29wdGlvbnN9LAorICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX2luZGV4fQorICAgICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2FyZWFmb3JtYXQoCisgICAgICAgICRhcmVhLT57X2ZnX2NvbG9yX3JnYn0sICAgJGFyZWEtPntfYmdfY29sb3JfcmdifSwKKyAgICAgICAgJGFyZWEtPntfYXJlYV9wYXR0ZXJufSwgICAkYXJlYS0+e19hcmVhX29wdGlvbnN9LAorICAgICAgICAkYXJlYS0+e19mZ19jb2xvcl9pbmRleH0sICRhcmVhLT57X2JnX2NvbG9yX2luZGV4fQorICAgICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0YXJlYV9mcmFtZV9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgRlJBTUUgY2hhcnQgc3Vic3RyZWFtIGZvciB0aGUgY2hhcnRhcmVhLgorIworc3ViIF9zdG9yZV9jaGFydGFyZWFfZnJhbWVfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkYXJlYSA9ICRzZWxmLT57X2NoYXJ0YXJlYX07CisKKyAgICAkc2VsZi0+X3N0b3JlX2ZyYW1lKCAweDAwLCAweDAyICk7CisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworCisgICAgJHNlbGYtPl9zdG9yZV9saW5lZm9ybWF0KAorICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX3JnYn0sICRhcmVhLT57X2xpbmVfcGF0dGVybn0sCisgICAgICAgICRhcmVhLT57X2xpbmVfd2VpZ2h0fSwgICAgJGFyZWEtPntfbGluZV9vcHRpb25zfSwKKyAgICAgICAgJGFyZWEtPntfbGluZV9jb2xvcl9pbmRleH0KKyAgICApOworCisgICAgJHNlbGYtPl9zdG9yZV9hcmVhZm9ybWF0KAorICAgICAgICAkYXJlYS0+e19mZ19jb2xvcl9yZ2J9LCAgICRhcmVhLT57X2JnX2NvbG9yX3JnYn0sCisgICAgICAgICRhcmVhLT57X2FyZWFfcGF0dGVybn0sICAgJGFyZWEtPntfYXJlYV9vcHRpb25zfSwKKyAgICAgICAgJGFyZWEtPntfZmdfY29sb3JfaW5kZXh9LCAkYXJlYS0+e19iZ19jb2xvcl9pbmRleH0KKyAgICApOworCisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRmb3JtYXRfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIENIQVJURk9STUFUIGNoYXJ0IHN1YnN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfY2hhcnRmb3JtYXRfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIFRoZSBfdmFyeV9kYXRhX2NvbG9yIGlzIHNldCBieSBjbGFzc2VzIHRoYXQgbmVlZCBpdCwgbGlrZSBQaWUuCisgICAgJHNlbGYtPl9zdG9yZV9jaGFydGZvcm1hdCggJHNlbGYtPntfdmFyeV9kYXRhX2NvbG9yfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworCisgICAgIyBTdG9yZSB0aGUgQklGRiByZWNvcmQgdGhhdCB3aWxsIGRlZmluZSB0aGUgY2hhcnQgdHlwZS4KKyAgICAkc2VsZi0+X3N0b3JlX2NoYXJ0X3R5cGUoKTsKKworICAgICMgTm90ZSwgdGhlIENIQVJURk9STUFUTElOSyByZWNvcmQgaXMgb25seSB3cml0dGVuIGJ5IEV4Y2VsLgorCisgICAgaWYgKCAkc2VsZi0+e19sZWdlbmR9LT57X3Zpc2libGV9ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX2xlZ2VuZF9zdHJlYW0oKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX21hcmtlcl9kYXRhZm9ybWF0X3N0cmVhbSgpOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRfdHlwZSgpCisjCisjIFRoaXMgaXMgYW4gYWJzdHJhY3QgbWV0aG9kIHRoYXQgaXMgb3ZlcnJpZGRlbiBieSB0aGUgc3ViLWNsYXNzZXMgdG8gZGVmaW5lCisjIHRoZSBjaGFydCB0eXBlcyBzdWNoIGFzIENvbHVtbiwgTGluZSwgUGllLCBldGMuCisjCitzdWIgX3N0b3JlX2NoYXJ0X3R5cGUgeworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbWFya2VyX2RhdGFmb3JtYXRfc3RyZWFtKCkKKyMKKyMgVGhpcyBpcyBhbiBhYnN0cmFjdCBtZXRob2QgdGhhdCBpcyBvdmVycmlkZGVuIGJ5IHRoZSBzdWItY2xhc3NlcyB0byBkZWZpbmUKKyMgcHJvcGVydGllcyBvZiBtYXJrZXJzLCBsaW5ldHlwZXMsIHBpZSBmb3JtYXRzIGFuZCBvdGhlci4KKyMKK3N1YiBfc3RvcmVfbWFya2VyX2RhdGFmb3JtYXRfc3RyZWFtIHsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2xlZ2VuZF9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgTEVHRU5EIGNoYXJ0IHN1YnN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfbGVnZW5kX3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9sZWdlbmQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfbGVnZW5kfSB9ICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV9wb3MoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfbGVnZW5kX3Bvc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfbGVnZW5kX3RleHRfc3RyZWFtKCk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEJJRkYgUmVjb3Jkcy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV8zZGJhcnNoYXBlKCkKKyMKKyMgV3JpdGUgdGhlIDNEQkFSU0hBUEUgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlXzNkYmFyc2hhcGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwNUY7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRyaXNlciAgPSAweDAwOyAgICAgICMgU2hhcGUgb2YgYmFzZS4KKyAgICBteSAkdGFwZXIgID0gMHgwMDsgICAgICAjIENvbHVtbiB0YXBlciB0eXBlLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkcmlzZXI7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICR0YXBlcjsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2FpKCkKKyMKKyMgV3JpdGUgdGhlIEFJIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9haSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICA9IDB4MTA1MTsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgICA9IDB4MDAwODsgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkaWQgICAgICAgICAgID0gJF9bMF07ICAgICAgICAgIyBMaW5rIGluZGV4LgorICAgIG15ICR0eXBlICAgICAgICAgPSAkX1sxXTsgICAgICAgICAjIFJlZmVyZW5jZSB0eXBlLgorICAgIG15ICRmb3JtdWxhICAgICAgPSAkX1syXTsgICAgICAgICAjIFByZS1wYXJzZWQgZm9ybXVsYS4KKyAgICBteSAkZm9ybWF0X2luZGV4ID0gJF9bM10gfHwgMDsgICAgIyBOdW0gZm9ybWF0IGluZGV4LgorICAgIG15ICRncmJpdCAgICAgICAgPSAweDAwMDA7ICAgICAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRmb3JtdWxhX2xlbmd0aCA9IGxlbmd0aCAkZm9ybXVsYTsKKworICAgICRsZW5ndGggKz0gJGZvcm11bGFfbGVuZ3RoOworCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkaWQ7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICR0eXBlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRmb3JtYXRfaW5kZXg7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRmb3JtdWxhX2xlbmd0aDsKKyAgICAkZGF0YSAuPSAkZm9ybXVsYTsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2FyZWFmb3JtYXQoKQorIworIyBXcml0ZSB0aGUgQVJFQUZPUk1BVCBjaGFydCBCSUZGIHJlY29yZC4gQ29udGFpbnMgdGhlIHBhdHRlcm5zIGFuZCBjb2xvdXJzCisjIG9mIGEgY2hhcnQgYXJlYS4KKyMKK3N1YiBfc3RvcmVfYXJlYWZvcm1hdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MTAwQTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDEwOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHJnYkZvcmUgICA9ICRfWzBdOyAgICAgIyBGb3JlZ3JvdW5kIFJHQiBjb2xvdXIuCisgICAgbXkgJHJnYkJhY2sgICA9ICRfWzFdOyAgICAgIyBCYWNrZ3JvdW5kIFJHQiBjb2xvdXIuCisgICAgbXkgJHBhdHRlcm4gICA9ICRfWzJdOyAgICAgIyBQYXR0ZXJuLgorICAgIG15ICRncmJpdCAgICAgPSAkX1szXTsgICAgICMgT3B0aW9uIGZsYWdzLgorICAgIG15ICRpbmRleEZvcmUgPSAkX1s0XTsgICAgICMgSW5kZXggdG8gRm9yZWdyb3VuZCBjb2xvdXIuCisgICAgbXkgJGluZGV4QmFjayA9ICRfWzVdOyAgICAgIyBJbmRleCB0byBCYWNrZ3JvdW5kIGNvbG91ci4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJnYkZvcmU7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZ2JCYWNrOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkcGF0dGVybjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaW5kZXhGb3JlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaW5kZXhCYWNrOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhjZXh0KCkKKyMKKyMgV3JpdGUgdGhlIEFYQ0VYVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfYXhjZXh0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgID0gMHgxMDYyOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgICAgPSAweDAwMTI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkY2F0TWluICAgICAgID0gMHgwMDAwOyAgICAjIE1pbmltdW0gY2F0ZWdvcnkgb24gYXhpcy4KKyAgICBteSAkY2F0TWF4ICAgICAgID0gMHgwMDAwOyAgICAjIE1heGltdW0gY2F0ZWdvcnkgb24gYXhpcy4KKyAgICBteSAkY2F0TWFqb3IgICAgID0gMHgwMDAxOyAgICAjIFZhbHVlIG9mIG1ham9yIHVuaXQuCisgICAgbXkgJHVuaXRNYWpvciAgICA9IDB4MDAwMDsgICAgIyBVbml0cyBvZiBtYWpvciB1bml0LgorICAgIG15ICRjYXRNaW5vciAgICAgPSAweDAwMDE7ICAgICMgVmFsdWUgb2YgbWlub3IgdW5pdC4KKyAgICBteSAkdW5pdE1pbm9yICAgID0gMHgwMDAwOyAgICAjIFVuaXRzIG9mIG1pbm9yIHVuaXQuCisgICAgbXkgJHVuaXRCYXNlICAgICA9IDB4MDAwMDsgICAgIyBCYXNlIHVuaXQgb2YgYXhpcy4KKyAgICBteSAkY2F0Q3Jvc3NEYXRlID0gMHgwMDAwOyAgICAjIENyb3NzaW5nIHBvaW50LgorICAgIG15ICRncmJpdCAgICAgICAgPSAweDAwRUY7ICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0TWluOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0TWF4OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0TWFqb3I7CisgICAgJGRhdGEgLj0gcGFjayAndicsICR1bml0TWFqb3I7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRNaW5vcjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHVuaXRNaW5vcjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHVuaXRCYXNlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0Q3Jvc3NEYXRlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9heGVzdXNlZCgpCisjCisjIFdyaXRlIHRoZSBBWEVTVVNFRCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfYXhlc3VzZWQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MTA0NjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkbnVtX2F4ZXMgPSAkX1swXTsgICAgICMgTnVtYmVyIG9mIGF4ZXMgdXNlZC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJG51bV9heGVzOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhpcygpCisjCisjIFdyaXRlIHRoZSBBWElTIGNoYXJ0IEJJRkYgcmVjb3JkIHRvIGRlZmluZSB0aGUgYXhpcyB0eXBlLgorIworc3ViIF9zdG9yZV9heGlzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgxMDFEOyAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDEyOyAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICR0eXBlICAgICAgPSAkX1swXTsgICAgICAgICAjIEF4aXMgdHlwZS4KKyAgICBteSAkcmVzZXJ2ZWQxID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQyID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQzID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQ0ID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHR5cGU7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDE7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDI7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDM7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9heGlzbGluZWZvcm1hdCgpCisjCisjIFdyaXRlIHRoZSBBWElTTElORUZPUk1BVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfYXhpc2xpbmVmb3JtYXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MTAyMTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkbGluZV9mb3JtYXQgPSAweDAwMDE7ICAgICMgQXhpcyBsaW5lIGZvcm1hdC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJGxpbmVfZm9ybWF0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhpc3BhcmVudCgpCisjCisjIFdyaXRlIHRoZSBBWElTUEFSRU5UIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9heGlzcGFyZW50IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDQxOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMTI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkaWF4ICAgID0gJF9bMF07ICAgICAjIEF4aXMgaW5kZXguCisgICAgbXkgJHggICAgICA9ICRfWzFdOyAgICAgIyBYLWNvb3JkLgorICAgIG15ICR5ICAgICAgPSAkX1syXTsgICAgICMgWS1jb29yZC4KKyAgICBteSAkZHggICAgID0gJF9bM107ICAgICAjIExlbmd0aCBvZiB4IGF4aXMuCisgICAgbXkgJGR5ICAgICA9ICRfWzRdOyAgICAgIyBMZW5ndGggb2YgeSBheGlzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaWF4OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHk7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRkeDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJGR5OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYmVnaW4oKQorIworIyBXcml0ZSB0aGUgQkVHSU4gY2hhcnQgQklGRiByZWNvcmQgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgc3ViIHN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfYmVnaW4geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwMzM7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMDsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2F0c2VycmFuZ2UoKQorIworIyBXcml0ZSB0aGUgQ0FUU0VSUkFOR0UgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2NhdHNlcnJhbmdlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgPSAweDEwMjA7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgID0gMHgwMDA4OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGNhdENyb3NzID0gMHgwMDAxOyAgICAjIFZhbHVlL2NhdGVnb3J5IGNyb3NzaW5nLgorICAgIG15ICRjYXRMYWJlbCA9IDB4MDAwMTsgICAgIyBGcmVxdWVuY3kgb2YgbGFiZWxzLgorICAgIG15ICRjYXRNYXJrICA9IDB4MDAwMTsgICAgIyBGcmVxdWVuY3kgb2YgdGlja3MuCisgICAgbXkgJGdyYml0ICAgID0gMHgwMDAxOyAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGNhdENyb3NzOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0TGFiZWw7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRNYXJrOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydCgpCisjCisjIFdyaXRlIHRoZSBDSEFSVCBCSUZGIHJlY29yZC4gVGhpcyBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBjaGFydCBzdWItc3RyZWFtCisjIGFuZCBjb250YWlucyBkaW1lbnNpb25zIG9mIHRoZSBjaGFydCBvbiB0aGUgZGlzcGxheS4gVW5pdHMgYXJlIGluIDEvNzIgaW5jaAorIyBhbmQgYXJlIDIgYnl0ZSBpbnRlZ2VyIHdpdGggMiBieXRlIGZyYWN0aW9uLgorIworc3ViIF9zdG9yZV9jaGFydCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAwMjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDEwOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHhfcG9zICA9ICRfWzBdOyAgICAgIyBYIHBvcyBvZiB0b3AgbGVmdCBjb3JuZXIuCisgICAgbXkgJHlfcG9zICA9ICRfWzFdOyAgICAgIyBZIHBvcyBvZiB0b3AgbGVmdCBjb3JuZXIuCisgICAgbXkgJGR4ICAgICA9ICRfWzJdOyAgICAgIyBYIHNpemUuCisgICAgbXkgJGR5ICAgICA9ICRfWzNdOyAgICAgIyBZIHNpemUuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR4X3BvczsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHlfcG9zOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkZHg7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRkeTsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0Zm9ybWF0KCkKKyMKKyMgV3JpdGUgdGhlIENIQVJURk9STUFUIGNoYXJ0IEJJRkYgcmVjb3JkLiBUaGUgcGFyZW50IHJlY29yZCBmb3IgZm9ybWF0dGluZworIyBvZiBhIGNoYXJ0IGdyb3VwLgorIworc3ViIF9zdG9yZV9jaGFydGZvcm1hdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MTAxNDsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICA9IDB4MDAxNDsgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkcmVzZXJ2ZWQxID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQyID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQzID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQ0ID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkZ3JiaXQgICAgID0gJF9bMF0gfHwgMDsgICAgIyBPcHRpb24gZmxhZ3MuCisgICAgbXkgJGljcnQgICAgICA9IDB4MDAwMDsgICAgICAgICMgRHJhd2luZyBvcmRlci4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMjsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMzsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkNDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaWNydDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0bGluZSgpCisjCisjIFdyaXRlIHRoZSBDSEFSVExJTkUgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2NoYXJ0bGluZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAxQzsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHR5cGUgICA9IDB4MDAwMTsgICAgIyBEcm9wL2hpLWxvIGxpbmUgdHlwZS4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJHR5cGU7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydHRleHQoKQorIworIyBXcml0ZSB0aGUgVEVYVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfY2hhcnR0ZXh0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgICA9IDB4MTAyNTsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgICAgICAgPSAweDAwMjA7ICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGhvcnpfYWxpZ24gICAgICAgPSAweDAyOyAgICAgICAgICAjIEhvcml6b250YWwgYWxpZ25tZW50LgorICAgIG15ICR2ZXJ0X2FsaWduICAgICAgID0gMHgwMjsgICAgICAgICAgIyBWZXJ0aWNhbCBhbGlnbm1lbnQuCisgICAgbXkgJGJnX21vZGUgICAgICAgICAgPSAweDAwMDE7ICAgICAgICAjIEJhY2tncm91bmQgZGlzcGxheS4KKyAgICBteSAkdGV4dF9jb2xvcl9yZ2IgICA9IDB4MDAwMDAwMDA7ICAgICMgVGV4dCBSR0IgY29sb3VyLgorICAgIG15ICR0ZXh0X3ggICAgICAgICAgID0gMHhGRkZGRkY0NjsgICAgIyBUZXh0IHgtcG9zLgorICAgIG15ICR0ZXh0X3kgICAgICAgICAgID0gMHhGRkZGRkYwNjsgICAgIyBUZXh0IHktcG9zLgorICAgIG15ICR0ZXh0X2R4ICAgICAgICAgID0gMHgwMDAwMDAwMDsgICAgIyBXaWR0aC4KKyAgICBteSAkdGV4dF9keSAgICAgICAgICA9IDB4MDAwMDAwMDA7ICAgICMgSGVpZ2h0LgorICAgIG15ICRncmJpdDEgICAgICAgICAgID0gMHgwMEIxOyAgICAgICAgIyBPcHRpb25zCisgICAgbXkgJHRleHRfY29sb3JfaW5kZXggPSAweDAwNEQ7ICAgICAgICAjIEF1dG8gQ29sb3VyLgorICAgIG15ICRncmJpdDIgICAgICAgICAgID0gMHgwMDAwOyAgICAgICAgIyBEYXRhIGxhYmVsIHBsYWNlbWVudC4KKyAgICBteSAkcm90YXRpb24gICAgICAgICA9IDB4MDAwMDsgICAgICAgICMgVGV4dCByb3RhdGlvbi4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJGhvcnpfYWxpZ247CisgICAgJGRhdGEgLj0gcGFjayAnQycsICR2ZXJ0X2FsaWduOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkYmdfbW9kZTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHRleHRfY29sb3JfcmdiOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkdGV4dF94OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkdGV4dF95OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkdGV4dF9keDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHRleHRfZHk7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDE7CisgICAgJGRhdGEgLj0gcGFjayAndicsICR0ZXh0X2NvbG9yX2luZGV4OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQyOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkcm90YXRpb247CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9kYXRhZm9ybWF0KCkKKyMKKyMgV3JpdGUgdGhlIERBVEFGT1JNQVQgY2hhcnQgQklGRiByZWNvcmQuIFRoaXMgcmVjb3JkIHNwZWNpZmllcyB0aGUgc2VyaWVzCisjIHRoYXQgdGhlIHN1YnNlcXVlbnQgc3ViIHN0cmVhbSByZWZlcnMgdG8uCisjCitzdWIgX3N0b3JlX2RhdGFmb3JtYXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgID0gMHgxMDA2OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgICAgID0gMHgwMDA4OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHNlcmllc19pbmRleCAgPSAkX1swXTsgICAgICMgU2VyaWVzIGluZGV4LgorICAgIG15ICRzZXJpZXNfbnVtYmVyID0gJF9bMV07ICAgICAjIFNlcmllcyBudW1iZXIuIChTYW1lIGFzIGluZGV4KS4KKyAgICBteSAkcG9pbnRfbnVtYmVyICA9ICRfWzJdOyAgICAgIyBQb2ludCBudW1iZXIuCisgICAgbXkgJGdyYml0ICAgICAgICAgPSAweDAwMDA7ICAgICMgRm9ybWF0IGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkcG9pbnRfbnVtYmVyOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkc2VyaWVzX2luZGV4OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkc2VyaWVzX251bWJlcjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZGVmYXVsdHRleHQoKQorIworIyBXcml0ZSB0aGUgREVGQVVMVFRFWFQgY2hhcnQgQklGRiByZWNvcmQuIElkZW50aWZpZXIgZm9yIHN1YnNlcXVlbnQgVEVYVAorIyByZWNvcmQuCisjCitzdWIgX3N0b3JlX2RlZmF1bHR0ZXh0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDI0OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkdHlwZSAgID0gMHgwMDAyOyAgICAjIFR5cGUuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gcGFjayAndicsICR0eXBlOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZHJvcGJhcigpCisjCisjIFdyaXRlIHRoZSBEUk9QQkFSIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9kcm9wYmFyIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDEwM0Q7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHBlcmNlbnRfZ2FwID0gMHgwMDk2OyAgICAjIERyb3AgYmFyIHdpZHRoIGdhcCAoJSkuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gcGFjayAndicsICRwZXJjZW50X2dhcDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2VuZCgpCisjCisjIFdyaXRlIHRoZSBFTkQgY2hhcnQgQklGRiByZWNvcmQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiBhIHN1YiBzdHJlYW0uCisjCitzdWIgX3N0b3JlX2VuZCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAzNDsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDAwOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9mYmkoKQorIworIyBXcml0ZSB0aGUgRkJJIGNoYXJ0IEJJRkYgcmVjb3JkLiBTcGVjaWZpZXMgdGhlIGZvbnQgaW5mb3JtYXRpb24gYXQgdGhlIHRpbWUKKyMgaXQgd2FzIGFwcGxpZWQgdG8gdGhlIGNoYXJ0LgorIworc3ViIF9zdG9yZV9mYmkgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgPSAweDEwNjA7ICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgICAgPSAweDAwMEE7ICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGluZGV4ICAgICAgICA9ICRfWzBdOyAgICAgICAgICMgRm9udCBpbmRleC4KKyAgICBteSAkaGVpZ2h0ICAgICAgID0gJF9bMV0gKiAyMDsgICAgIyBEZWZhdWx0IGZvbnQgaGVpZ2h0IGluIHR3aXBzLgorICAgIG15ICR3aWR0aF9iYXNpcyAgPSAkX1syXTsgICAgICAgICAjIFdpZHRoIGJhc2lzLCBpbiB0d2lwcy4KKyAgICBteSAkaGVpZ2h0X2Jhc2lzID0gJF9bM107ICAgICAgICAgIyBIZWlnaHQgYmFzaXMsIGluIHR3aXBzLgorICAgIG15ICRzY2FsZV9iYXNpcyAgPSAkX1s0XTsgICAgICAgICAjIFNjYWxlIGJ5IGNoYXJ0IGFyZWEgb3IgcGxvdCBhcmVhLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkd2lkdGhfYmFzaXM7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRoZWlnaHRfYmFzaXM7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRoZWlnaHQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRzY2FsZV9iYXNpczsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGluZGV4OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZm9udHgoKQorIworIyBXcml0ZSB0aGUgRk9OVFggY2hhcnQgQklGRiByZWNvcmQgd2hpY2ggY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBGT05UCisjIHJlY29yZCBpbiB0aGUgV29ya2Jvb2suCisjCitzdWIgX3N0b3JlX2ZvbnR4IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDI2OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkaW5kZXggID0gJF9bMF07ICAgICAjIEZvbnQgaW5kZXguCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gcGFjayAndicsICRpbmRleDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2ZyYW1lKCkKKyMKKyMgV3JpdGUgdGhlIEZSQU1FIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9mcmFtZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgPSAweDEwMzI7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgPSAweDAwMDQ7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkZnJhbWVfdHlwZSA9ICRfWzBdOyAgICAgIyBGcmFtZSB0eXBlLgorICAgIG15ICRncmJpdCAgICAgID0gJF9bMV07ICAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGZyYW1lX3R5cGU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2xlZ2VuZCgpCisjCisjIFdyaXRlIHRoZSBMRUdFTkQgY2hhcnQgQklGRiByZWNvcmQuIFRoZSBNYXJjdXMgSG9yYW4gbWV0aG9kLgorIworc3ViIF9zdG9yZV9sZWdlbmQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MTAxNTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMTQ7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkeCAgICAgICAgPSAkX1swXTsgICAgICMgWC1wb3NpdGlvbi4KKyAgICBteSAkeSAgICAgICAgPSAkX1sxXTsgICAgICMgWS1wb3NpdGlvbi4KKyAgICBteSAkd2lkdGggICAgPSAkX1syXTsgICAgICMgV2lkdGguCisgICAgbXkgJGhlaWdodCAgID0gJF9bM107ICAgICAjIEhlaWdodC4KKyAgICBteSAkd1R5cGUgICAgPSAkX1s0XTsgICAgICMgVHlwZS4KKyAgICBteSAkd1NwYWNpbmcgPSAkX1s1XTsgICAgICMgU3BhY2luZy4KKyAgICBteSAkZ3JiaXQgICAgPSAkX1s2XTsgICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHk7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR3aWR0aDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJGhlaWdodDsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHdUeXBlOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkd1NwYWNpbmc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2xpbmVmb3JtYXQoKQorIworIyBXcml0ZSB0aGUgTElORUZPUk1BVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfbGluZWZvcm1hdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAwNzsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDBDOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHJnYiAgICA9ICRfWzBdOyAgICAgIyBMaW5lIFJHQiBjb2xvdXIuCisgICAgbXkgJGxucyAgICA9ICRfWzFdOyAgICAgIyBMaW5lIHBhdHRlcm4uCisgICAgbXkgJHdlICAgICA9ICRfWzJdOyAgICAgIyBMaW5lIHdlaWdodC4KKyAgICBteSAkZ3JiaXQgID0gJF9bM107ICAgICAjIE9wdGlvbiBmbGFncy4KKyAgICBteSAkaW5kZXggID0gJF9bNF07ICAgICAjIEluZGV4IHRvIGNvbG91ciBvZiBsaW5lLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmdiOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkbG5zOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkd2U7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGluZGV4OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbWFya2VyZm9ybWF0KCkKKyMKKyMgV3JpdGUgdGhlIE1BUktFUkZPUk1BVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfbWFya2VyZm9ybWF0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MTAwOTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICA9IDB4MDAxNDsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRyZ2JGb3JlID0gJF9bMF07ICAgICAjIEZvcmVncm91bmQgUkdCIGNvbG9yLgorICAgIG15ICRyZ2JCYWNrID0gJF9bMV07ICAgICAjIEJhY2tncm91bmQgUkdCIGNvbG9yLgorICAgIG15ICRtYXJrZXIgID0gJF9bMl07ICAgICAjIFR5cGUgb2YgbWFya2VyLgorICAgIG15ICRncmJpdCAgID0gJF9bM107ICAgICAjIEZvcm1hdCBmbGFncy4KKyAgICBteSAkaWN2Rm9yZSA9ICRfWzRdOyAgICAgIyBDb2xvciBpbmRleCBtYXJrZXIgYm9yZGVyLgorICAgIG15ICRpY3ZCYWNrID0gJF9bNV07ICAgICAjIENvbG9yIGluZGV4IG1hcmtlciBmaWxsLgorICAgIG15ICRtaVNpemUgID0gJF9bNl07ICAgICAjIFNpemUgb2YgbGluZSBtYXJrZXJzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmdiRm9yZTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJnYkJhY2s7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRtYXJrZXI7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGljdkZvcmU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRpY3ZCYWNrOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkbWlTaXplOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfb2JqZWN0bGluaygpCisjCisjIFdyaXRlIHRoZSBPQkpFQ1RMSU5LIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9vYmplY3RsaW5rIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDEwMjc7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDA2OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGxpbmtfdHlwZSAgID0gJF9bMF07ICAgICAjIE9iamVjdCB0ZXh0IGxpbmsgdHlwZS4KKyAgICBteSAkbGlua19pbmRleDEgPSAweDAwMDA7ICAgICMgTGluayBpbmRleCAxLgorICAgIG15ICRsaW5rX2luZGV4MiA9IDB4MDAwMDsgICAgIyBMaW5rIGluZGV4IDIuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRsaW5rX3R5cGU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRsaW5rX2luZGV4MTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGxpbmtfaW5kZXgyOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcGllZm9ybWF0KCkKKyMKKyMgV3JpdGUgdGhlIFBJRUZPUk1BVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfcGllZm9ybWF0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MTAwQjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRwZXJjZW50ID0gMHgwMDAwOyAgICAjIERpc3RhbmNlICUgZnJvbSBjZW50ZXIuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwZXJjZW50OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcGxvdGFyZWEoKQorIworIyBXcml0ZSB0aGUgUExPVEFSRUEgY2hhcnQgQklGRiByZWNvcmQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHN1YnNlcXVlbnQKKyMgRlJBTUUgcmVjb3JkIGJlbG9uZ3MgdG8gYSBwbG90IGFyZWEuCisjCitzdWIgX3N0b3JlX3Bsb3RhcmVhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDM1OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDA7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3Bsb3Rncm93dGgoKQorIworIyBXcml0ZSB0aGUgUExPVEdST1dUSCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfcGxvdGdyb3d0aCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgPSAweDEwNjQ7ICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggID0gMHgwMDA4OyAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRkeF9wbG90ID0gMHgwMDAxMDAwMDsgICAgIyBIb3J6IGdyb3d0aCBmb3IgZm9udCBzY2FsZS4KKyAgICBteSAkZHlfcGxvdCA9IDB4MDAwMTAwMDA7ICAgICMgVmVydCBncm93dGggZm9yIGZvbnQgc2NhbGUuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRkeF9wbG90OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkZHlfcGxvdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3BvcygpCisjCisjIFdyaXRlIHRoZSBQT1MgY2hhcnQgQklGRiByZWNvcmQuIEdlbmVyYWxseSBub3QgcmVxdWlyZWQgd2hlbiB1c2luZworIyBhdXRvbWF0aWMgcG9zaXRpb25pbmcuCisjCitzdWIgX3N0b3JlX3BvcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgPSAweDEwNEY7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgPSAweDAwMTQ7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkbWRUb3BMdCA9ICRfWzBdOyAgICAgIyBUb3AgbGVmdC4KKyAgICBteSAkbWRCb3RSdCA9ICRfWzFdOyAgICAgIyBCb3R0b20gcmlnaHQuCisgICAgbXkgJHgxICAgICAgPSAkX1syXTsgICAgICMgWCBjb29yZGluYXRlLgorICAgIG15ICR5MSAgICAgID0gJF9bM107ICAgICAjIFkgY29vcmRpbmF0ZS4KKyAgICBteSAkeDIgICAgICA9ICRfWzRdOyAgICAgIyBXaWR0aC4KKyAgICBteSAkeTIgICAgICA9ICRfWzVdOyAgICAgIyBIZWlnaHQuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRtZFRvcEx0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkbWRCb3RSdDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHgxOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeTE7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR4MjsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHkyOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfc2VyYXV4dHJlbmQoKQorIworIyBXcml0ZSB0aGUgU0VSQVVYVFJFTkQgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3NlcmF1eHRyZW5kIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICA9IDB4MTA0QjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgICA9IDB4MDAxQzsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRyZWdfdHlwZSAgID0gJF9bMF07ICAgICAjIFJlZ3Jlc3Npb24gdHlwZS4KKyAgICBteSAkcG9seV9vcmRlciA9ICRfWzFdOyAgICAgIyBQb2x5bm9taWFsIG9yZGVyLgorICAgIG15ICRlcXVhdGlvbiAgID0gJF9bMl07ICAgICAjIERpc3BsYXkgZXF1YXRpb24uCisgICAgbXkgJHJfc3F1YXJlZCAgPSAkX1szXTsgICAgICMgRGlzcGxheSBSLXNxdWFyZWQuCisgICAgbXkgJGludGVyY2VwdDsgICAgICAgICAgICAgICMgRm9yY2VkIGludGVyY2VwdC4KKyAgICBteSAkZm9yZWNhc3Q7ICAgICAgICAgICAgICAgIyBGb3JlY2FzdCBmb3J3YXJkLgorICAgIG15ICRiYWNrY2FzdDsgICAgICAgICAgICAgICAjIEZvcmVjYXN0IGJhY2t3YXJkLgorCisgICAgIyBUT0RPLiBXaGVuIHN1cHBvcnRlZCwgaW50ZXJjZXB0IG5lZWRzIHRvIGJlIE5BTiBpZiBub3QgdXNlZC4KKyAgICAjIEFsc28gbmVlZCB0byByZXZlcnNlIGRvdWJsZXMuCisgICAgJGludGVyY2VwdCA9IHBhY2sgJ0gqJywgJ0ZGRkZGRkZGMDAwMUZGRkYnOworICAgICRmb3JlY2FzdCAgPSBwYWNrICdIKicsICcwMDAwMDAwMDAwMDAwMDAwJzsKKyAgICAkYmFja2Nhc3QgID0gcGFjayAnSConLCAnMDAwMDAwMDAwMDAwMDAwMCc7CisKKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHJlZ190eXBlOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkcG9seV9vcmRlcjsKKyAgICAkZGF0YSAuPSAkaW50ZXJjZXB0OworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkZXF1YXRpb247CisgICAgJGRhdGEgLj0gcGFjayAnQycsICRyX3NxdWFyZWQ7CisgICAgJGRhdGEgLj0gJGZvcmVjYXN0OworICAgICRkYXRhIC49ICRiYWNrY2FzdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3NlcmllcygpCisjCisjIFdyaXRlIHRoZSBTRVJJRVMgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3NlcmllcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICAgID0gMHgxMDAzOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgICAgICA9IDB4MDAwQzsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRjYXRlZ29yeV90eXBlICA9IDB4MDAwMTsgICAgIyBUeXBlOiBjYXRlZ29yeS4KKyAgICBteSAkdmFsdWVfdHlwZSAgICAgPSAweDAwMDE7ICAgICMgVHlwZTogdmFsdWUuCisgICAgbXkgJGNhdGVnb3J5X2NvdW50ID0gJF9bMF07ICAgICAjIE51bSBvZiBjYXRlZ29yaWVzLgorICAgIG15ICR2YWx1ZV9jb3VudCAgICA9ICRfWzFdOyAgICAgIyBOdW0gb2YgdmFsdWVzLgorICAgIG15ICRidWJibGVfdHlwZSAgICA9IDB4MDAwMTsgICAgIyBUeXBlOiBidWJibGUuCisgICAgbXkgJGJ1YmJsZV9jb3VudCAgID0gMHgwMDAwOyAgICAjIE51bSBvZiBidWJibGUgdmFsdWVzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0ZWdvcnlfdHlwZTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHZhbHVlX3R5cGU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRlZ29yeV9jb3VudDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHZhbHVlX2NvdW50OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkYnViYmxlX3R5cGU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRidWJibGVfY291bnQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zZXJpZXN0ZXh0KCkKKyMKKyMgV3JpdGUgdGhlIFNFUklFU1RFWFQgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3Nlcmllc3RleHQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MTAwRDsgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICA9IDB4MDAwMDsgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGlkICAgICAgID0gMHgwMDAwOyAgICAgICAgICMgVGV4dCBpZC4KKyAgICBteSAkc3RyICAgICAgPSAkX1swXTsgICAgICAgICAgIyBUZXh0LgorICAgIG15ICRlbmNvZGluZyA9ICRfWzFdOyAgICAgICAgICAjIFN0cmluZyBlbmNvZGluZy4KKyAgICBteSAkY2NoICAgICAgPSBsZW5ndGggJHN0cjsgICAgIyBTdHJpbmcgbGVuZ3RoLgorCisgICAgIyBDaGFyYWN0ZXIgbGVuZ3RoIGlzIG51bSBvZiBjaGFycyBub3QgbnVtIG9mIGJ5dGVzCisgICAgJGNjaCAvPSAyIGlmICRlbmNvZGluZzsKKworICAgICMgQ2hhbmdlIHRoZSBVVEYtMTYgbmFtZSBmcm9tIEJFIHRvIExFCisgICAgJHN0ciA9IHBhY2sgJ24qJywgdW5wYWNrICd2KicsICRzdHIgaWYgJGVuY29kaW5nOworCisgICAgJGxlbmd0aCA9IDQgKyBsZW5ndGgoICRzdHIgKTsKKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGlkOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkY2NoOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkZW5jb2Rpbmc7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEsICRzdHIgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zZXJwYXJlbnQoKQorIworIyBXcml0ZSB0aGUgU0VSUEFSRU5UIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9zZXJwYXJlbnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwNEE7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRzZXJpZXMgPSAkX1swXTsgICAgICMgU2VyaWVzIHBhcmVudC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJHNlcmllczsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3NlcnRvY3J0KCkKKyMKKyMgV3JpdGUgdGhlIFNFUlRPQ1JUIGNoYXJ0IEJJRkYgcmVjb3JkIHRvIGluZGljYXRlIHRoZSBjaGFydCBncm91cCBpbmRleC4KKyMKK3N1YiBfc3RvcmVfc2VydG9jcnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgID0gMHgxMDQ1OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGNoYXJ0Z3JvdXAgPSAweDAwMDA7ICAgICMgQ2hhcnQgZ3JvdXAgaW5kZXguCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gcGFjayAndicsICRjaGFydGdyb3VwOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfc2h0cHJvcHMoKQorIworIyBXcml0ZSB0aGUgU0hUUFJPUFMgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3NodHByb3BzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDEwNDQ7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDA0OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGdyYml0ICAgICAgID0gMHgwMDBFOyAgICAjIE9wdGlvbiBmbGFncy4KKyAgICBteSAkZW1wdHlfY2VsbHMgPSAweDAwMDA7ICAgICMgRW1wdHkgY2VsbCBoYW5kbGluZy4KKworICAgICRncmJpdCA9IDB4MDAwQSBpZiAkc2VsZi0+e19lbWJlZGRlZH07CisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGVtcHR5X2NlbGxzOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdGV4dCgpCisjCisjIFdyaXRlIHRoZSBURVhUIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV90ZXh0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgPSAweDEwMjU7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICA9IDB4MDAyMDsgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkYXQgICAgICAgPSAweDAyOyAgICAgICAgICAgICAjIEhvcml6b250YWwgYWxpZ25tZW50LgorICAgIG15ICR2YXQgICAgICA9IDB4MDI7ICAgICAgICAgICAgICMgVmVydGljYWwgYWxpZ25tZW50LgorICAgIG15ICR3QmtnTW9kZSA9IDB4MDAwMTsgICAgICAgICAgICMgQmFja2dyb3VuZCBkaXNwbGF5LgorICAgIG15ICRyZ2JUZXh0ICA9IDB4MDAwMDsgICAgICAgICAgICMgVGV4dCBSR0IgY29sb3VyLgorICAgIG15ICR4ICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICMgVGV4dCB4LXBvcy4KKyAgICBteSAkeSAgICAgICAgPSAkX1sxXTsgICAgICAgICAgICAjIFRleHQgeS1wb3MuCisgICAgbXkgJGR4ICAgICAgID0gJF9bMl07ICAgICAgICAgICAgIyBXaWR0aC4KKyAgICBteSAkZHkgICAgICAgPSAkX1szXTsgICAgICAgICAgICAjIEhlaWdodC4KKyAgICBteSAkZ3JiaXQxICAgPSAkX1s0XTsgICAgICAgICAgICAjIE9wdGlvbiBmbGFncy4KKyAgICBteSAkaWN2VGV4dCAgPSAweDAwNEQ7ICAgICAgICAgICAjIEF1dG8gQ29sb3VyLgorICAgIG15ICRncmJpdDIgICA9ICRfWzVdOyAgICAgICAgICAgICMgU2hvdyBsZWdlbmQuCisgICAgbXkgJHJvdGF0aW9uID0gJF9bNl0gfHwgMHgwMDsgICAgIyBTaG93IHZhbHVlLgorCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICRhdDsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHZhdDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHdCa2dNb2RlOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmdiVGV4dDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHg7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR5OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkZHg7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRkeTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0MTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGljdlRleHQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDI7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRyb3RhdGlvbjsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV90aWNrKCkKKyMKKyMgV3JpdGUgdGhlIFRJQ0sgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3RpY2sgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDEwMUU7ICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMUU7ICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHRrdE1ham9yICA9IDB4MDI7ICAgICAgICAgICMgVHlwZSBvZiBtYWpvciB0aWNrIG1hcmsuCisgICAgbXkgJHRrdE1pbm9yICA9IDB4MDA7ICAgICAgICAgICMgVHlwZSBvZiBtaW5vciB0aWNrIG1hcmsuCisgICAgbXkgJHRsdCAgICAgICA9IDB4MDM7ICAgICAgICAgICMgVGljayBsYWJlbCBwb3NpdGlvbi4KKyAgICBteSAkd0JrZ01vZGUgID0gMHgwMTsgICAgICAgICAgIyBCYWNrZ3JvdW5kIG1vZGUuCisgICAgbXkgJHJnYiAgICAgICA9IDB4MDAwMDAwMDA7ICAgICMgVGljay1sYWJlbCBSR0IgY29sb3VyLgorICAgIG15ICRyZXNlcnZlZDEgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDIgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDMgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDQgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRncmJpdCAgICAgPSAweDAwMjM7ICAgICAgICAjIE9wdGlvbiBmbGFncy4KKyAgICBteSAkaW5kZXggICAgID0gMHgwMDREOyAgICAgICAgIyBDb2xvdXIgaW5kZXguCisgICAgbXkgJHJlc2VydmVkNSA9IDB4MDAwMDsgICAgICAgICMgUmVzZXJ2ZWQuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICR0a3RNYWpvcjsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHRrdE1pbm9yOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkdGx0OworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkd0JrZ01vZGU7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZ2I7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDE7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDI7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDM7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGluZGV4OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkcmVzZXJ2ZWQ1OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdmFsdWVyYW5nZSgpCisjCisjIFdyaXRlIHRoZSBWQUxVRVJBTkdFIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV92YWx1ZXJhbmdlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgPSAweDEwMUY7ICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICA9IDB4MDAyQTsgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkbnVtTWluICAgPSAweDAwMDAwMDAwOyAgICAjIE1pbmltdW0gdmFsdWUgb24gYXhpcy4KKyAgICBteSAkbnVtTWF4ICAgPSAweDAwMDAwMDAwOyAgICAjIE1heGltdW0gdmFsdWUgb24gYXhpcy4KKyAgICBteSAkbnVtTWFqb3IgPSAweDAwMDAwMDAwOyAgICAjIFZhbHVlIG9mIG1ham9yIGluY3JlbWVudC4KKyAgICBteSAkbnVtTWlub3IgPSAweDAwMDAwMDAwOyAgICAjIFZhbHVlIG9mIG1pbm9yIGluY3JlbWVudC4KKyAgICBteSAkbnVtQ3Jvc3MgPSAweDAwMDAwMDAwOyAgICAjIFZhbHVlIHdoZXJlIGNhdGVnb3J5IGF4aXMgY3Jvc3Nlcy4KKyAgICBteSAkZ3JiaXQgICAgPSAweDAxMUY7ICAgICAgICAjIEZvcm1hdCBmbGFncy4KKworICAgICMgVE9ETy4gUmV2ZXJzZSBkb3VibGVzIHdoZW4gdGhleSBhcmUgaGFuZGxlZC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdkJywgJG51bU1pbjsKKyAgICAkZGF0YSAuPSBwYWNrICdkJywgJG51bU1heDsKKyAgICAkZGF0YSAuPSBwYWNrICdkJywgJG51bU1ham9yOworICAgICRkYXRhIC49IHBhY2sgJ2QnLCAkbnVtTWlub3I7CisgICAgJGRhdGEgLj0gcGFjayAnZCcsICRudW1Dcm9zczsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDb25maWcgZGF0YS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zZXRfZGVmYXVsdF9wcm9wZXJ0aWVzKCkKKyMKKyMgU2V0dXAgdGhlIGRlZmF1bHQgcHJvcGVydGllcyBmb3IgYSBjaGFydC4KKyMKK3N1YiBfc2V0X2RlZmF1bHRfcHJvcGVydGllcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfbGVnZW5kfSA9IHsKKyAgICAgICAgX3Zpc2libGUgID0+IDEsCisgICAgICAgIF9wb3NpdGlvbiA9PiAwLAorICAgICAgICBfdmVydGljYWwgPT4gMCwKKyAgICB9OworCisgICAgJHNlbGYtPntfY2hhcnRhcmVhfSA9IHsKKyAgICAgICAgX3Zpc2libGUgICAgICAgICAgPT4gMCwKKyAgICAgICAgX2ZnX2NvbG9yX2luZGV4ICAgPT4gMHg0RSwKKyAgICAgICAgX2ZnX2NvbG9yX3JnYiAgICAgPT4gMHhGRkZGRkYsCisgICAgICAgIF9iZ19jb2xvcl9pbmRleCAgID0+IDB4NEQsCisgICAgICAgIF9iZ19jb2xvcl9yZ2IgICAgID0+IDB4MDAwMDAwLAorICAgICAgICBfYXJlYV9wYXR0ZXJuICAgICA9PiAweDAwMDAsCisgICAgICAgIF9hcmVhX29wdGlvbnMgICAgID0+IDB4MDAwMCwKKyAgICAgICAgX2xpbmVfcGF0dGVybiAgICAgPT4gMHgwMDA1LAorICAgICAgICBfbGluZV93ZWlnaHQgICAgICA9PiAweEZGRkYsCisgICAgICAgIF9saW5lX2NvbG9yX2luZGV4ID0+IDB4NEQsCisgICAgICAgIF9saW5lX2NvbG9yX3JnYiAgID0+IDB4MDAwMDAwLAorICAgICAgICBfbGluZV9vcHRpb25zICAgICA9PiAweDAwMDgsCisgICAgfTsKKworICAgICRzZWxmLT57X3Bsb3RhcmVhfSA9IHsKKyAgICAgICAgX3Zpc2libGUgICAgICAgICAgPT4gMSwKKyAgICAgICAgX2ZnX2NvbG9yX2luZGV4ICAgPT4gMHgxNiwKKyAgICAgICAgX2ZnX2NvbG9yX3JnYiAgICAgPT4gMHhDMEMwQzAsCisgICAgICAgIF9iZ19jb2xvcl9pbmRleCAgID0+IDB4NEYsCisgICAgICAgIF9iZ19jb2xvcl9yZ2IgICAgID0+IDB4MDAwMDAwLAorICAgICAgICBfYXJlYV9wYXR0ZXJuICAgICA9PiAweDAwMDEsCisgICAgICAgIF9hcmVhX29wdGlvbnMgICAgID0+IDB4MDAwMCwKKyAgICAgICAgX2xpbmVfcGF0dGVybiAgICAgPT4gMHgwMDAwLAorICAgICAgICBfbGluZV93ZWlnaHQgICAgICA9PiAweDAwMDAsCisgICAgICAgIF9saW5lX2NvbG9yX2luZGV4ID0+IDB4MTcsCisgICAgICAgIF9saW5lX2NvbG9yX3JnYiAgID0+IDB4ODA4MDgwLAorICAgICAgICBfbGluZV9vcHRpb25zICAgICA9PiAweDAwMDAsCisgICAgfTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zZXRfZGVmYXVsdF9jb25maWdfZGF0YSgpCisjCisjIFNldHVwIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgYSBjaGFydC4KKyMKK3N1YiBfc2V0X2RlZmF1bHRfY29uZmlnX2RhdGEgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICM8PDwgUGVybHRpZHkgaWdub3JlIHRoaXMuCisgICAgJHNlbGYtPntfY29uZmlnfSA9IHsKKyAgICAgICAgX2F4aXNwYXJlbnQgICAgICA9PiBbIDAsIDB4MDBGOCwgMHgwMUY1LCAweDBFN0YsIDB4MEIzNiAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2F4aXNwYXJlbnRfcG9zICA9PiBbIDIsIDIsIDB4MDA4QywgMHgwMUFBLCAweDBFRUEsIDB4MEM1MiAgICAgICAgICAgXSwKKyAgICAgICAgX2NoYXJ0ICAgICAgICAgICA9PiBbIDB4MDAwMCwgMHgwMDAwLCAweDAyREQ1MUUwLCAweDAxQzJCODM4ICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfbnVtYmVycyAgICA9PiBbIDUsIDEwLCAweDM4QjgsIDB4MjJBMSwgMHgwMDAwICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfc2VyaWVzICAgICA9PiBbIDYsIDEwLCAweDM4QjgsIDB4MjJBMSwgMHgwMDAxICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfdGl0bGUgICAgICA9PiBbIDcsIDEyLCAweDM4QjgsIDB4MjJBMSwgMHgwMDAwICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfYXhlcyAgICAgICA9PiBbIDgsIDEwLCAweDM4QjgsIDB4MjJBMSwgMHgwMDAxICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2xlZ2VuZCAgICAgICAgICA9PiBbIDB4MDVGOSwgMHgwRUU5LCAweDA0N0QsIDB4OUMsIDB4MDAsIDB4MDEsIDB4MEYgXSwKKyAgICAgICAgX2xlZ2VuZF9wb3MgICAgICA9PiBbIDUsIDIsIDB4MDVGOSwgMHgwRUU5LCAwLCAwICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2xlZ2VuZF90ZXh0ICAgICA9PiBbIDB4RkZGRkZGNDYsIDB4RkZGRkZGMDYsIDAsIDAsIDB4MDBCMSwgMHgwMDAwICAgXSwKKyAgICAgICAgX2xlZ2VuZF90ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3Nlcmllc190ZXh0ICAgICA9PiBbIDB4RkZGRkZGNDYsIDB4RkZGRkZGMDYsIDAsIDAsIDB4MDBCMSwgMHgxMDIwICAgXSwKKyAgICAgICAgX3Nlcmllc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3RpdGxlX3RleHQgICAgICA9PiBbIDB4MDZFNCwgMHgwMDUxLCAweDAxREIsIDB4MDBDNCwgMHgwMDgxLCAweDEwMzAgXSwKKyAgICAgICAgX3RpdGxlX3RleHRfcG9zICA9PiBbIDIsIDIsIDAsIDAsIDB4NzMsIDB4MUQgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3hfYXhpc190ZXh0ICAgICA9PiBbIDB4MDdFMSwgMHgwREZDLCAweEIyLCAweDlDLCAweDAwODEsIDB4MDAwMCAgICAgXSwKKyAgICAgICAgX3hfYXhpc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsICAweDJCLCAgMHgxNyAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3lfYXhpc190ZXh0ICAgICA9PiBbIDB4MDAyRCwgMHgwNkFBLCAweDVGLCAweDFDQywgMHgwMjgxLCAweDAwLCA5MCAgXSwKKyAgICAgICAgX3lfYXhpc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDB4MTcsICAweDQ0ICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICB9OyAjPj4+CisKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3NldF9lbWJlZGRlZF9jb25maWdfZGF0YSgpCisjCisjIFNldHVwIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgYW4gZW1iZWRkZWQgY2hhcnQuCisjCitzdWIgX3NldF9lbWJlZGRlZF9jb25maWdfZGF0YSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfZW1iZWRkZWR9ID0gMTsKKworICAgICRzZWxmLT57X2NoYXJ0YXJlYX0gPSB7CisgICAgICAgIF92aXNpYmxlICAgICAgICAgID0+IDEsCisgICAgICAgIF9mZ19jb2xvcl9pbmRleCAgID0+IDB4NEUsCisgICAgICAgIF9mZ19jb2xvcl9yZ2IgICAgID0+IDB4RkZGRkZGLAorICAgICAgICBfYmdfY29sb3JfaW5kZXggICA9PiAweDRELAorICAgICAgICBfYmdfY29sb3JfcmdiICAgICA9PiAweDAwMDAwMCwKKyAgICAgICAgX2FyZWFfcGF0dGVybiAgICAgPT4gMHgwMDAxLAorICAgICAgICBfYXJlYV9vcHRpb25zICAgICA9PiAweDAwMDEsCisgICAgICAgIF9saW5lX3BhdHRlcm4gICAgID0+IDB4MDAwMCwKKyAgICAgICAgX2xpbmVfd2VpZ2h0ICAgICAgPT4gMHgwMDAwLAorICAgICAgICBfbGluZV9jb2xvcl9pbmRleCA9PiAweDRELAorICAgICAgICBfbGluZV9jb2xvcl9yZ2IgICA9PiAweDAwMDAwMCwKKyAgICAgICAgX2xpbmVfb3B0aW9ucyAgICAgPT4gMHgwMDA5LAorICAgIH07CisKKworICAgICM8PDwgUGVybHRpZHkgaWdub3JlIHRoaXMuCisgICAgJHNlbGYtPntfY29uZmlnfSA9IHsKKyAgICAgICAgX2F4aXNwYXJlbnQgICAgICA9PiBbIDAsIDB4MDFEOCwgMHgwMzFELCAweDBENzksIDB4MDdFOSAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2F4aXNwYXJlbnRfcG9zICA9PiBbIDIsIDIsIDB4MDEwQywgMHgwMjkyLCAweDBFNDYsIDB4MDlGRCAgICAgICAgICAgXSwKKyAgICAgICAgX2NoYXJ0ICAgICAgICAgICA9PiBbIDB4MDAwMCwgMHgwMDAwLCAweDAxODQ3RkU4LCAweDAwRjQ3RkU4ICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfbnVtYmVycyAgICA9PiBbIDUsIDEwLCAweDFEQzQsIDB4MTI4NCwgMHgwMDAwICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfc2VyaWVzICAgICA9PiBbIDYsIDEwLCAweDFEQzQsIDB4MTI4NCwgMHgwMDAxICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfdGl0bGUgICAgICA9PiBbIDcsIDEyLCAweDFEQzQsIDB4MTI4NCwgMHgwMDAwICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfYXhlcyAgICAgICA9PiBbIDgsIDEwLCAweDFEQzQsIDB4MTI4NCwgMHgwMDAxICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2xlZ2VuZCAgICAgICAgICA9PiBbIDB4MDQ0RSwgMHgwRTRBLCAweDA4OEQsIDB4MDEyMywgMHgwLCAweDEsIDB4RiAgXSwKKyAgICAgICAgX2xlZ2VuZF9wb3MgICAgICA9PiBbIDUsIDIsIDB4MDQ0RSwgMHgwRTRBLCAwLCAwICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2xlZ2VuZF90ZXh0ICAgICA9PiBbIDB4RkZGRkZGRDksIDB4RkZGRkZGQzEsIDAsIDAsIDB4MDBCMSwgMHgwMDAwICAgXSwKKyAgICAgICAgX2xlZ2VuZF90ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3Nlcmllc190ZXh0ICAgICA9PiBbIDB4RkZGRkZGRDksIDB4RkZGRkZGQzEsIDAsIDAsIDB4MDBCMSwgMHgxMDIwICAgXSwKKyAgICAgICAgX3Nlcmllc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3RpdGxlX3RleHQgICAgICA9PiBbIDB4MDYwRiwgMHgwMDRDLCAweDAzOEEsIDB4MDE2RiwgMHgwMDgxLCAweDEwMzAgXSwKKyAgICAgICAgX3RpdGxlX3RleHRfcG9zICA9PiBbIDIsIDIsIDAsIDAsIDB4NzMsIDB4MUQgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3hfYXhpc190ZXh0ICAgICA9PiBbIDB4MDdFRiwgMHgwQzhGLCAweDE1MywgMHgxMjMsIDB4ODEsIDB4MDAgICAgICAgXSwKKyAgICAgICAgX3hfYXhpc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDB4MkIsIDB4MTcgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3lfYXhpc190ZXh0ICAgICA9PiBbIDB4MDA1NywgMHgwNTY0LCAweEI1LCAweDAzNUQsIDB4MDI4MSwgMHgwMCwgOTAgXSwKKyAgICAgICAgX3lfYXhpc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDB4MTcsIDB4NDQgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICB9OyAjPj4+Cit9CisKKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitDaGFydCAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBDaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUbyBjcmVhdGUgYSBzaW1wbGUgRXhjZWwgZmlsZSB3aXRoIGEgY2hhcnQgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydC54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgbXkgJGNoYXJ0ICAgICA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdjb2x1bW4nICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgY2hhcnQuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoZSBjaGFydCByZWZlcnMgdG8uCisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgJ0NhdGVnb3J5JywgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbICdWYWx1ZScsICAgIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRkYXRhICk7CisKKyAgICBfX0VORF9fCisKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBDPENoYXJ0PiBtb2R1bGUgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbW9kdWxlcyB0aGF0IGltcGxlbWVudCBjaGFydHMgaW4gTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4uIFRoZSBpbmZvcm1hdGlvbiBiZWxvdyBpcyBhcHBsaWNhYmxlIHRvIGFsbCBvZiB0aGUgYXZhaWxhYmxlIHN1YmNsYXNzZXMuCisKK1RoZSBDPENoYXJ0PiBtb2R1bGUgaXNuJ3QgdXNlZCBkaXJlY3RseSwgYSBjaGFydCBvYmplY3QgaXMgY3JlYXRlZCB2aWEgdGhlIFdvcmtib29rIEM8YWRkX2NoYXJ0KCk+IG1ldGhvZCB3aGVyZSB0aGUgY2hhcnQgdHlwZSBpcyBzcGVjaWZpZWQ6CisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnY29sdW1uJyApOworCitDdXJyZW50bHkgdGhlIHN1cHBvcnRlZCBjaGFydCB0eXBlcyBhcmU6CisKKz1vdmVyCisKKz1pdGVtICogQzxhcmVhPjogQ3JlYXRlcyBhbiBBcmVhIChmaWxsZWQgbGluZSkgc3R5bGUgY2hhcnQuIFNlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6QXJlYT4uCisKKz1pdGVtICogQzxiYXI+OiBDcmVhdGVzIGEgQmFyIHN0eWxlICh0cmFuc3Bvc2VkIGhpc3RvZ3JhbSkgY2hhcnQuIFNlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6QmFyPi4KKworPWl0ZW0gKiBDPGNvbHVtbj46IENyZWF0ZXMgYSBjb2x1bW4gc3R5bGUgKGhpc3RvZ3JhbSkgY2hhcnQuIFNlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6Q29sdW1uPi4KKworPWl0ZW0gKiBDPGxpbmU+OiBDcmVhdGVzIGEgTGluZSBzdHlsZSBjaGFydC4gU2VlIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpMaW5lPi4KKworPWl0ZW0gKiBDPHBpZT46IENyZWF0ZXMgYW4gUGllIHN0eWxlIGNoYXJ0LiBTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OlBpZT4uCisKKz1pdGVtICogQzxzY2F0dGVyPjogQ3JlYXRlcyBhbiBTY2F0dGVyIHN0eWxlIGNoYXJ0LiBTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OlNjYXR0ZXI+LgorCis9aXRlbSAqIEM8c3RvY2s+OiBDcmVhdGVzIGFuIFN0b2NrIHN0eWxlIGNoYXJ0LiBTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OlN0b2NrPi4KKworPWJhY2sKKworTW9yZSBjaGFydHMgYW5kIHN1Yi10eXBlcyB3aWxsIGJlIHN1cHBvcnRlZCBpbiB0aW1lLiBTZWUgdGhlIEw8L1RPRE8+IHNlY3Rpb24uCisKK01ldGhvZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFydCB0eXBlcyBhcmUgZG9jdW1lbnRlZCBiZWxvdy4KKworPWhlYWQxIENIQVJUIE1FVEhPRFMKKworPWhlYWQyIGFkZF9zZXJpZXMoKQorCitJbiBhbiBFeGNlbCBjaGFydCBhICJzZXJpZXMiIGlzIGEgY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBzdWNoIGFzIHZhbHVlcywgeC1heGlzIGxhYmVscyBhbmQgdGhlIG5hbWUgdGhhdCBkZWZpbmUgd2hpY2ggZGF0YSBpcyBwbG90dGVkLiBUaGVzZSBzZXR0aW5ncyBhcmUgZGlzcGxheWVkIHdoZW4geW91IHNlbGVjdCB0aGUgQzw8IENoYXJ0IC0+IFNvdXJjZSBEYXRhLi4uID4+IG1lbnUgb3B0aW9uLgorCitXaXRoIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgY2hhcnQgb2JqZWN0IHRoZSBDPGFkZF9zZXJpZXMoKT4gbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSBwcm9wZXJ0aWVzIGZvciBhIHNlcmllczoKKworICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyAgICA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDEwJywKKyAgICAgICAgbmFtZSAgICAgICAgICA9PiAnU2VyaWVzIG5hbWUnLAorICAgICAgICBuYW1lX2Zvcm11bGEgID0+ICc9U2hlZXQxISRCJDEnLAorICAgICk7CisKK1RoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHNldCBhcmU6CisKKz1vdmVyCisKKz1pdGVtICogQzx2YWx1ZXM+CisKK1RoaXMgaXMgdGhlIG1vc3QgaW1wb3J0YW50IHByb3BlcnR5IG9mIGEgc2VyaWVzIGFuZCBtdXN0IGJlIHNldCBmb3IgZXZlcnkgY2hhcnQgb2JqZWN0LiBJdCBsaW5rcyB0aGUgY2hhcnQgd2l0aCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCBpdCBkaXNwbGF5cy4gTm90ZSB0aGUgZm9ybWF0IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBmb3JtdWxhLiBTZWUgTDwvV29ya2luZyB3aXRoIENlbGwgUmFuZ2VzPi4KKworPWl0ZW0gKiBDPGNhdGVnb3JpZXM+CisKK1RoaXMgc2V0cyB0aGUgY2hhcnQgY2F0ZWdvcnkgbGFiZWxzLiBUaGUgY2F0ZWdvcnkgaXMgbW9yZSBvciBsZXNzIHRoZSBzYW1lIGFzIHRoZSBYLWF4aXMuIEluIG1vc3QgY2hhcnQgdHlwZXMgdGhlIEM8Y2F0ZWdvcmllcz4gcHJvcGVydHkgaXMgb3B0aW9uYWwgYW5kIHRoZSBjaGFydCB3aWxsIGp1c3QgYXNzdW1lIGEgc2VxdWVudGlhbCBzZXJpZXMgZnJvbSBDPDEgLi4gbj4uCisKKz1pdGVtICogQzxuYW1lPgorCitTZXQgdGhlIG5hbWUgZm9yIHRoZSBzZXJpZXMuIFRoZSBuYW1lIGlzIGRpc3BsYXllZCBpbiB0aGUgY2hhcnQgbGVnZW5kIGFuZCBpbiB0aGUgZm9ybXVsYSBiYXIuIFRoZSBuYW1lIHByb3BlcnR5IGlzIG9wdGlvbmFsIGFuZCBpZiBpdCBpc24ndCBzdXBwbGllZCB3aWxsIGRlZmF1bHQgdG8gQzxTZXJpZXMgMSAuLiBuPi4KKworPWl0ZW0gKiBDPG5hbWVfZm9ybXVsYT4KKworT3B0aW9uYWwsIGNhbiBiZSB1c2VkIHRvIGxpbmsgdGhlIG5hbWUgdG8gYSB3b3Jrc2hlZXQgY2VsbC4gU2VlIEw8L0NoYXJ0IG5hbWVzIGFuZCBsaW5rcz4uCisKKz1iYWNrCisKK1lvdSBjYW4gYWRkIG1vcmUgdGhhbiBvbmUgc2VyaWVzIHRvIGEgY2hhcnQsIGluIGZhY3Qgc29tZSBjaGFydCB0eXBlcyBzdWNoIGFzIEM8c3RvY2s+IHJlcXVpcmUgaXQuIFRoZSBzZXJpZXMgbnVtYmVyaW5nIGFuZCBvcmRlciBpbiB0aGUgZmluYWwgY2hhcnQgaXMgdGhlIHNhbWUgYXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoYXQgYXJlIGFkZGVkLgorCisgICAgIyBBZGQgdGhlIGZpcnN0IHNlcmllcy4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisKKyAgICAjIEFkZCBhbm90aGVyIHNlcmllcy4gQ2F0ZWdvcnkgaXMgdGhlIHNhbWUgYnV0IHZhbHVlcyBhcmUgZGlmZmVyZW50LgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMicsCisgICAgKTsKKworCisKKz1oZWFkMiBzZXRfeF9heGlzKCkKKworVGhlIEM8c2V0X3hfYXhpcygpPiBtZXRob2QgaXMgdXNlZCB0byBzZXQgcHJvcGVydGllcyBvZiB0aGUgWCBheGlzLgorCisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChtKScgKTsKKworVGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IGFyZToKKworPW92ZXIKKworPWl0ZW0gKiBDPG5hbWU+CisKK1NldCB0aGUgbmFtZSAodGl0bGUgb3IgY2FwdGlvbikgZm9yIHRoZSBheGlzLiBUaGUgbmFtZSBpcyBkaXNwbGF5ZWQgYmVsb3cgdGhlIFggYXhpcy4gVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbC4gVGhlIGRlZmF1bHQgaXMgdG8gaGF2ZSBubyBheGlzIG5hbWUuCisKKz1pdGVtICogQzxuYW1lX2Zvcm11bGE+CisKK09wdGlvbmFsLCBjYW4gYmUgdXNlZCB0byBsaW5rIHRoZSBuYW1lIHRvIGEgd29ya3NoZWV0IGNlbGwuIFNlZSBMPC9DaGFydCBuYW1lcyBhbmQgbGlua3M+LgorCis9YmFjaworCitBZGRpdGlvbmFsIGF4aXMgcHJvcGVydGllcyBzdWNoIGFzIHJhbmdlLCBkaXZpc2lvbnMgYW5kIHRpY2tzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgaW4gbGF0ZXIgcmVsZWFzZXMuIFNlZSB0aGUgTDwvVE9ETz4gc2VjdGlvbi4KKworCis9aGVhZDIgc2V0X3lfYXhpcygpCisKK1RoZSBDPHNldF95X2F4aXMoKT4gbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHByb3BlcnRpZXMgb2YgdGhlIFkgYXhpcy4KKworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIHdlaWdodCAoa2cpJyApOworCitUaGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBzZXQgYXJlOgorCis9b3ZlcgorCis9aXRlbSAqIEM8bmFtZT4KKworU2V0IHRoZSBuYW1lICh0aXRsZSBvciBjYXB0aW9uKSBmb3IgdGhlIGF4aXMuIFRoZSBuYW1lIGlzIGRpc3BsYXllZCB0byB0aGUgbGVmdCBvZiB0aGUgWSBheGlzLiBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLiBUaGUgZGVmYXVsdCBpcyB0byBoYXZlIG5vIGF4aXMgbmFtZS4KKworPWl0ZW0gKiBDPG5hbWVfZm9ybXVsYT4KKworT3B0aW9uYWwsIGNhbiBiZSB1c2VkIHRvIGxpbmsgdGhlIG5hbWUgdG8gYSB3b3Jrc2hlZXQgY2VsbC4gU2VlIEw8L0NoYXJ0IG5hbWVzIGFuZCBsaW5rcz4uCisKKz1iYWNrCisKK0FkZGl0aW9uYWwgYXhpcyBwcm9wZXJ0aWVzIHN1Y2ggYXMgcmFuZ2UsIGRpdmlzaW9ucyBhbmQgdGlja3Mgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBpbiBsYXRlciByZWxlYXNlcy4gU2VlIHRoZSBMPC9UT0RPPiBzZWN0aW9uLgorCis9aGVhZDIgc2V0X3RpdGxlKCkKKworVGhlIEM8c2V0X3RpdGxlKCk+IG1ldGhvZCBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzIG9mIHRoZSBjaGFydCB0aXRsZS4KKworICAgICRjaGFydC0+c2V0X3RpdGxlKCBuYW1lID0+ICdZZWFyIEVuZCBSZXN1bHRzJyApOworCitUaGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBzZXQgYXJlOgorCis9b3ZlcgorCis9aXRlbSAqIEM8bmFtZT4KKworU2V0IHRoZSBuYW1lICh0aXRsZSkgZm9yIHRoZSBjaGFydC4gVGhlIG5hbWUgaXMgZGlzcGxheWVkIGFib3ZlIHRoZSBjaGFydC4gVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbC4gVGhlIGRlZmF1bHQgaXMgdG8gaGF2ZSBubyBjaGFydCB0aXRsZS4KKworPWl0ZW0gKiBDPG5hbWVfZm9ybXVsYT4KKworT3B0aW9uYWwsIGNhbiBiZSB1c2VkIHRvIGxpbmsgdGhlIG5hbWUgdG8gYSB3b3Jrc2hlZXQgY2VsbC4gU2VlIEw8L0NoYXJ0IG5hbWVzIGFuZCBsaW5rcz4uCisKKz1iYWNrCisKKworPWhlYWQyIHNldF9sZWdlbmQoKQorCitUaGUgQzxzZXRfbGVnZW5kKCk+IG1ldGhvZCBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzIG9mIHRoZSBjaGFydCBsZWdlbmQuCisKKyAgICAkY2hhcnQtPnNldF9sZWdlbmQoIHBvc2l0aW9uID0+ICdub25lJyApOworCitUaGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBzZXQgYXJlOgorCis9b3ZlcgorCis9aXRlbSAqIEM8cG9zaXRpb24+CisKK1NldCB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJ0IGxlZ2VuZC4KKworICAgICRjaGFydC0+c2V0X2xlZ2VuZCggcG9zaXRpb24gPT4gJ25vbmUnICk7CisKK1RoZSBkZWZhdWx0IGxlZ2VuZCBwb3NpdGlvbiBpcyBDPGJvdHRvbT4uIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGNoYXJ0IHBvc2l0aW9ucyBhcmU6CisKKyAgICBub25lCisgICAgYm90dG9tCisKK1RoZSBvdGhlciBsZWdlbmQgcG9zaXRpb25zIHdpbGwgYmUgYWRkZWQgc29vbi4KKworPWJhY2sKKworCis9aGVhZDIgc2V0X2NoYXJ0YXJlYSgpCisKK1RoZSBDPHNldF9jaGFydGFyZWEoKT4gbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjaGFydCBhcmVhLiBJbiBFeGNlbCB0aGUgY2hhcnQgYXJlYSBpcyB0aGUgYmFja2dyb3VuZCBhcmVhIGJlaGluZCB0aGUgY2hhcnQuCisKK1RoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHNldCBhcmU6CisKKz1vdmVyCisKKz1pdGVtICogQzxjb2xvcj4KKworU2V0IHRoZSBjb2xvdXIgb2YgdGhlIGNoYXJ0IGFyZWEuIFRoZSBFeGNlbCBkZWZhdWx0IGNoYXJ0IGFyZWEgY29sb3IgaXMgJ3doaXRlJywgaW5kZXggOS4gU2VlIEw8L0NoYXJ0IG9iamVjdCBjb2xvdXJzPi4KKworPWl0ZW0gKiBDPGxpbmVfY29sb3I+CisKK1NldCB0aGUgY29sb3VyIG9mIHRoZSBjaGFydCBhcmVhIGJvcmRlciBsaW5lLiBUaGUgRXhjZWwgZGVmYXVsdCBib3JkZXIgbGluZSBjb2xvdXIgaXMgJ2JsYWNrJywgaW5kZXggOS4gIFNlZSBMPC9DaGFydCBvYmplY3QgY29sb3Vycz4uCisKKz1pdGVtICogQzxsaW5lX3BhdHRlcm4+CisKK1NldCB0aGUgcGF0dGVybiBvZiB0aGUgb2YgdGhlIGNoYXJ0IGFyZWEgYm9yZGVyIGxpbmUuIFRoZSBFeGNlbCBkZWZhdWx0IHBhdHRlcm4gaXMgJ25vbmUnLCBpbmRleCAwIGZvciBhIGNoYXJ0IHNoZWV0IGFuZCAnc29saWQnLCBpbmRleCAxLCBmb3IgYW4gZW1iZWRkZWQgY2hhcnQuIFNlZSBMPC9DaGFydCBsaW5lIHBhdHRlcm5zPi4KKworPWl0ZW0gKiBDPGxpbmVfd2VpZ2h0PgorCitTZXQgdGhlIHdlaWdodCBvZiB0aGUgb2YgdGhlIGNoYXJ0IGFyZWEgYm9yZGVyIGxpbmUuIFRoZSBFeGNlbCBkZWZhdWx0IHdlaWdodCBpcyAnbmFycm93JywgaW5kZXggMi4gU2VlIEw8L0NoYXJ0IGxpbmUgd2VpZ2h0cz4uCisKKz1iYWNrCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBzZXR0aW5nIHNldmVyYWwgcHJvcGVydGllczoKKworICAgICRjaGFydC0+c2V0X2NoYXJ0YXJlYSgKKyAgICAgICAgY29sb3IgICAgICAgID0+ICdyZWQnLAorICAgICAgICBsaW5lX2NvbG9yICAgPT4gJ2JsYWNrJywKKyAgICAgICAgbGluZV9wYXR0ZXJuID0+IDIsCisgICAgICAgIGxpbmVfd2VpZ2h0ICA9PiAzLAorICAgICk7CisKK05vdGUsIGZvciBjaGFydCBzaGVldHMgdGhlIGNoYXJ0IGFyZWEgYm9yZGVyIGlzIG9mZiBieSBkZWZhdWx0LiBGb3IgZW1iZWRkZWQgY2hhcnRzIGlzIGlzIG9uIGJ5IGRlZmF1bHQuCisKKz1oZWFkMiBzZXRfcGxvdGFyZWEoKQorCitUaGUgQzxzZXRfcGxvdGFyZWEoKT4gbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHByb3BlcnRpZXMgb2YgdGhlIHBsb3QgYXJlYSBvZiBhIGNoYXJ0LiBJbiBFeGNlbCB0aGUgcGxvdCBhcmVhIGlzIHRoZSBhcmVhIGJldHdlZW4gdGhlIGF4ZXMgb24gd2hpY2ggdGhlIGNoYXJ0IHNlcmllcyBhcmUgcGxvdHRlZC4KKworVGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IGFyZToKKworPW92ZXIKKworPWl0ZW0gKiBDPHZpc2libGU+CisKK1NldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgcGxvdCBhcmVhLiBUaGUgZGVmYXVsdCBpcyAxIGZvciB2aXNpYmxlLiBTZXQgdG8gMCB0byBoaWRlIHRoZSBwbG90IGFyZWEgYW5kIGhhdmUgdGhlIHNhbWUgY29sb3VyIGFzIHRoZSBiYWNrZ3JvdW5kIGNoYXJ0IGFyZWEuCisKKz1pdGVtICogQzxjb2xvcj4KKworU2V0IHRoZSBjb2xvdXIgb2YgdGhlIHBsb3QgYXJlYS4gVGhlIEV4Y2VsIGRlZmF1bHQgcGxvdCBhcmVhIGNvbG9yIGlzICdzaWx2ZXInLCBpbmRleCAyMy4gU2VlIEw8L0NoYXJ0IG9iamVjdCBjb2xvdXJzPi4KKworPWl0ZW0gKiBDPGxpbmVfY29sb3I+CisKK1NldCB0aGUgY29sb3VyIG9mIHRoZSBwbG90IGFyZWEgYm9yZGVyIGxpbmUuIFRoZSBFeGNlbCBkZWZhdWx0IGJvcmRlciBsaW5lIGNvbG91ciBpcyAnZ3JheScsIGluZGV4IDIyLiBTZWUgTDwvQ2hhcnQgb2JqZWN0IGNvbG91cnM+LgorCis9aXRlbSAqIEM8bGluZV9wYXR0ZXJuPgorCitTZXQgdGhlIHBhdHRlcm4gb2YgdGhlIG9mIHRoZSBwbG90IGFyZWEgYm9yZGVyIGxpbmUuIFRoZSBFeGNlbCBkZWZhdWx0IHBhdHRlcm4gaXMgJ3NvbGlkJywgaW5kZXggMS4gU2VlIEw8L0NoYXJ0IGxpbmUgcGF0dGVybnM+LgorCis9aXRlbSAqIEM8bGluZV93ZWlnaHQ+CisKK1NldCB0aGUgd2VpZ2h0IG9mIHRoZSBvZiB0aGUgcGxvdCBhcmVhIGJvcmRlciBsaW5lLiBUaGUgRXhjZWwgZGVmYXVsdCB3ZWlnaHQgaXMgJ25hcnJvdycsIGluZGV4IDIuIFNlZSBMPC9DaGFydCBsaW5lIHdlaWdodHM+LgorCis9YmFjaworCitIZXJlIGlzIGFuIGV4YW1wbGUgb2Ygc2V0dGluZyBzZXZlcmFsIHByb3BlcnRpZXM6CisKKyAgICAkY2hhcnQtPnNldF9wbG90YXJlYSgKKyAgICAgICAgY29sb3IgICAgICAgID0+ICdyZWQnLAorICAgICAgICBsaW5lX2NvbG9yICAgPT4gJ2JsYWNrJywKKyAgICAgICAgbGluZV9wYXR0ZXJuID0+IDIsCisgICAgICAgIGxpbmVfd2VpZ2h0ICA9PiAzLAorICAgICk7CisKKworCis9aGVhZDEgV09SS1NIRUVUIE1FVEhPRFMKKworSW4gRXhjZWwgYSBjaGFydCBzaGVldCAoaS5lLCBhIGNoYXJ0IHRoYXQgaXNuJ3QgZW1iZWRkZWQpIHNoYXJlcyBwcm9wZXJ0aWVzIHdpdGggZGF0YSB3b3Jrc2hlZXRzIHN1Y2ggYXMgdGFiIHNlbGVjdGlvbiwgaGVhZGVycywgZm9vdGVycywgbWFyZ2lucyBhbmQgcHJpbnQgcHJvcGVydGllcy4KKworSW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgeW91IGNhbiBzZXQgY2hhcnQgc2hlZXQgcHJvcGVydGllcyB1c2luZyB0aGUgc2FtZSBtZXRob2RzIHRoYXQgYXJlIHVzZWQgZm9yIFdvcmtzaGVldCBvYmplY3RzLgorCitUaGUgZm9sbG93aW5nIFdvcmtzaGVldCBtZXRob2RzIGFyZSBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIGEgbm9uLWVtYmVkZGVkIENoYXJ0IG9iamVjdDoKKworICAgIGdldF9uYW1lKCkKKyAgICBhY3RpdmF0ZSgpCisgICAgc2VsZWN0KCkKKyAgICBoaWRlKCkKKyAgICBzZXRfZmlyc3Rfc2hlZXQoKQorICAgIHByb3RlY3QoKQorICAgIHNldF96b29tKCkKKyAgICBzZXRfdGFiX2NvbG9yKCkKKworICAgIHNldF9sYW5kc2NhcGUoKQorICAgIHNldF9wb3J0cmFpdCgpCisgICAgc2V0X3BhcGVyKCkKKyAgICBzZXRfbWFyZ2lucygpCisgICAgc2V0X2hlYWRlcigpCisgICAgc2V0X2Zvb3RlcigpCisKK1NlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPiBmb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGVzZSBtZXRob2RzLgorCis9aGVhZDEgRVhBTVBMRQorCitIZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBzb21lIG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMgd2hlbiBjcmVhdGluZyBhIGNoYXJ0LgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnRfYXJlYS54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ051bWJlcicsICdTYW1wbGUgMScsICdTYW1wbGUgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKworICAgICMgQ3JlYXRlIGEgbmV3IGNoYXJ0IG9iamVjdC4gSW4gdGhpcyBjYXNlIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdhcmVhJywgZW1iZWRkZWQgPT4gMSApOworCisgICAgIyBDb25maWd1cmUgdGhlIGZpcnN0IHNlcmllcy4gKFNhbXBsZSAxKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDEnLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBDb25maWd1cmUgdGhlIHNlY29uZCBzZXJpZXMuIChTYW1wbGUgMikKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAyJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgKTsKKworICAgICMgQWRkIGEgY2hhcnQgdGl0bGUgYW5kIHNvbWUgYXhpcyBsYWJlbHMuCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUgKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1Rlc3QgbnVtYmVyJyApOworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0QyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9hcmVhMS5qcGciIHdpZHRoPSI1MjciIGhlaWdodD0iMzIwIiBhbHQ9IkNoYXJ0IGV4YW1wbGUuIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKKworPWhlYWQxIENoYXJ0IG9iamVjdCBjb2xvdXJzCisKK01hbnkgb2YgdGhlIGNoYXJ0IG9iamVjdHMgc3VwcG9ydGVkIGJ5IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2wgYWxsb3cgdGhlIGRlZmF1bHQgY29sb3VycyB0byBiZSBjaGFuZ2VkLiBFeGNlbCBwcm92aWRlcyBhIHBhbGV0dGUgb2YgNTYgY29sb3VycyBhbmQgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdGhlc2UgY29sb3VycyBhcmUgYWNjZXNzZWQgdmlhIHRoZWlyIHBhbGV0dGUgaW5kZXggaW4gdGhlIHJhbmdlIDguLjYzLgorCitUaGUgbW9zdCBjb21tb25seSB1c2VkIGNvbG91cnMgY2FuIGJlIGFjY2Vzc2VkIGJ5IG5hbWUgb3IgaW5kZXguCisKKyAgICBibGFjayAgID0+ICAgOCwgICAgZ3JlZW4gICAgPT4gIDE3LCAgICBuYXZ5ICAgICA9PiAgMTgsCisgICAgd2hpdGUgICA9PiAgIDksICAgIG9yYW5nZSAgID0+ICA1MywgICAgcGluayAgICAgPT4gIDMzLAorICAgIHJlZCAgICAgPT4gIDEwLCAgICBncmF5ICAgICA9PiAgMjMsICAgIHB1cnBsZSAgID0+ICAyMCwKKyAgICBibHVlICAgID0+ICAxMiwgICAgbGltZSAgICAgPT4gIDExLCAgICBzaWx2ZXIgICA9PiAgMjIsCisgICAgeWVsbG93ICA9PiAgMTMsICAgIGN5YW4gICAgID0+ICAxNSwKKyAgICBicm93biAgID0+ICAxNiwgICAgbWFnZW50YSAgPT4gIDE0LAorCitGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50LgorCisgICAgJGNoYXJ0LT5zZXRfcGxvdGFyZWEoIGNvbG9yID0+IDEwICAgICk7CisgICAgJGNoYXJ0LT5zZXRfcGxvdGFyZWEoIGNvbG9yID0+ICdyZWQnICk7CisKK1RoZSBjb2xvdXIgcGFsZXR0ZSBpcyBzaG93biBpbiBDPHBhbGV0dGUuaHRtbD4gaW4gdGhlIEM8ZG9jcz4gZGlyZWN0b3J5ICBvZiB0aGUgZGlzdHJvLiBBbiBFeGNlbCB2ZXJzaW9uIG9mIHRoZSBwYWxldHRlIGNhbiBiZSBnZW5lcmF0ZWQgdXNpbmcgQzxjb2xvcnMucGw+IGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3RvcnkuCisKK1VzZXIgZGVmaW5lZCBjb2xvdXJzIGNhbiBiZSBzZXQgdXNpbmcgdGhlIEM8c2V0X2N1c3RvbV9jb2xvcigpPiB3b3JrYm9vayBtZXRob2QuIFRoaXMgYW5kIG90aGVyIGFzcGVjdHMgb2YgdXNpbmcgY29sb3VycyBhcmUgZGlzY3Vzc2VkIGluIHRoZSAiQ29sb3VycyBpbiBFeGNlbCIgc2VjdGlvbiBvZiB0aGUgbWFpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsL2xpYi9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsLnBtI0NPTE9VUlNfSU5fRVhDRUw+LgorCis9aGVhZDEgQ2hhcnQgbGluZSBwYXR0ZXJucworCitDaGFydCBsaW5lcyBwYXR0ZXJucyBjYW4gYmUgc2V0IHVzaW5nIGVpdGhlciBhbiBpbmRleCBvciBhIG5hbWU6CisKKyAgICAkY2hhcnQtPnNldF9wbG90YXJlYSggd2VpZ2h0ID0+IDIgICAgICApOworICAgICRjaGFydC0+c2V0X3Bsb3RhcmVhKCB3ZWlnaHQgPT4gJ2Rhc2gnICk7CisKK0NoYXJ0IGxpbmVzIGhhdmUgOSBwb3NzaWJsZSBwYXR0ZXJucyBhcmUgZm9sbG93czoKKworICAgICdub25lJyAgICAgICAgID0+IDAsCisgICAgJ3NvbGlkJyAgICAgICAgPT4gMSwKKyAgICAnZGFzaCcgICAgICAgICA9PiAyLAorICAgICdkb3QnICAgICAgICAgID0+IDMsCisgICAgJ2Rhc2gtZG90JyAgICAgPT4gNCwKKyAgICAnZGFzaC1kb3QtZG90JyA9PiA1LAorICAgICdtZWRpdW0tZ3JheScgID0+IDYsCisgICAgJ2RhcmstZ3JheScgICAgPT4gNywKKyAgICAnbGlnaHQtZ3JheScgICA9PiA4LAorCitUaGUgcGF0dGVybnMgMS04IGFyZSBzaG93biBpbiBvcmRlciBpbiB0aGUgZHJvcCBkb3duIGRpYWxvZyBib3hlcyBpbiBFeGNlbC4gVGhlIGRlZmF1bHQgcGF0dGVybiBpcyAnc29saWQnLCBpbmRleCAxLgorCisKKz1oZWFkMSBDaGFydCBsaW5lIHdlaWdodHMKKworQ2hhcnQgbGluZXMgd2VpZ2h0cyBjYW4gYmUgc2V0IHVzaW5nIGVpdGhlciBhbiBpbmRleCBvciBhIG5hbWU6CisKKyAgICAkY2hhcnQtPnNldF9wbG90YXJlYSggd2VpZ2h0ID0+IDEgICAgICAgICAgKTsKKyAgICAkY2hhcnQtPnNldF9wbG90YXJlYSggd2VpZ2h0ID0+ICdoYWlybGluZScgKTsKKworQ2hhcnQgbGluZXMgaGF2ZSA0IHBvc3NpYmxlIHdlaWdodHMgYXJlIGZvbGxvd3M6CisKKyAgICAnaGFpcmxpbmUnID0+IDEsCisgICAgJ25hcnJvdycgICA9PiAyLAorICAgICdtZWRpdW0nICAgPT4gMywKKyAgICAnd2lkZScgICAgID0+IDQsCisKK1RoZSB3ZWlnaHRzIDEtNCBhcmUgc2hvd24gaW4gb3JkZXIgaW4gdGhlIGRyb3AgZG93biBkaWFsb2cgYm94ZXMgaW4gRXhjZWwuIFRoZSBkZWZhdWx0IHdlaWdodCBpcyAnbmFycm93JywgaW5kZXggMi4KKworCis9aGVhZDEgQ2hhcnQgbmFtZXMgYW5kIGxpbmtzCisKK1RoZSBDPGFkZF9zZXJpZXMoKSk+LCBDPHNldF94X2F4aXMoKT4sIEM8c2V0X3lfYXhpcygpPiBhbmQgQzxzZXRfdGl0bGUoKT4gbWV0aG9kcyBhbGwgc3VwcG9ydCBhIEM8bmFtZT4gcHJvcGVydHkuIEluIGdlbmVyYWwgdGhlc2UgbmFtZXMgY2FuIGJlIGVpdGhlciBhIHN0YXRpYyBzdHJpbmcgb3IgYSBsaW5rIHRvIGEgd29ya3NoZWV0IGNlbGwuIElmIHlvdSBjaG9vc2UgdG8gdXNlIHRoZSBDPG5hbWVfZm9ybXVsYT4gcHJvcGVydHkgdG8gc3BlY2lmeSBhIGxpbmsgdGhlbiB5b3Ugc2hvdWxkIGFsc28gdGhlIEM8bmFtZT4gcHJvcGVydHkuIFRoaXMgaXNuJ3Qgc3RyaWN0bHkgcmVxdWlyZWQgYnkgRXhjZWwgYnV0IHNvbWUgdGhpcmQgcGFydHkgYXBwbGljYXRpb25zIGV4cGVjdCBpdCB0byBiZSBwcmVzZW50LgorCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoCisgICAgICAgIG5hbWUgICAgICAgICAgPT4gJ1llYXIgRW5kIFJlc3VsdHMnLAorICAgICAgICBuYW1lX2Zvcm11bGEgID0+ICc9U2hlZXQxISRDJDEnLAorICAgICk7CisKK1RoZXNlIGxpbmtzIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseSBzaW5jZSB0aGV5IGFyZW4ndCBjb21tb25seSB1c2VkIGluIEV4Y2VsIGNoYXJ0cy4KKworCis9aGVhZDEgQ2hhcnQgbmFtZXMgYW5kIFVuaWNvZGUKKworVGhlIEM8YWRkX3NlcmllcygpKT4sIEM8c2V0X3hfYXhpcygpPiwgQzxzZXRfeV9heGlzKCk+IGFuZCBDPHNldF90aXRsZSgpPiBtZXRob2RzIGFsbCBzdXBwb3J0IGEgQzxuYW1lPiBwcm9wZXJ0eS4gVGhlc2UgbmFtZXMgY2FuIGJlIFVURjggc3RyaW5ncyBpZiB5b3UgYXJlIHVzaW5nIHBlcmwgNS44Ky4KKworCisgICAgIyBwZXJsIDUuOCsgZXhhbXBsZToKKyAgICBteSAkc21pbGV5ID0gIlx4ezI2M0F9IjsKKworICAgICRjaGFydC0+c2V0X3RpdGxlKCBuYW1lID0+ICJCZXN0LiBSZXN1bHRzLiBFdmVyISAkc21pbGV5IiApOworCitGb3Igb2xkZXIgcGVybHMgeW91IHdyaXRlIFVuaWNvZGUgc3RyaW5ncyBhcyBVVEYtMTZCRSBieSBhZGRpbmcgYSBDPG5hbWVfZW5jb2Rpbmc+IHByb3BlcnR5OgorCisgICAgIyBwZXJsIDUuMDA1IGV4YW1wbGU6CisgICAgbXkgJHV0ZjE2YmVfbmFtZSA9IHBhY2sgJ24nLCAweDI2M0E7CisKKyAgICAkY2hhcnQtPnNldF90aXRsZSgKKyAgICAgICAgbmFtZSAgICAgICAgICA9PiAkdXRmMTZiZV9uYW1lLAorICAgICAgICBuYW1lX2VuY29kaW5nID0+IDEsCisgICAgKTsKKworVGhpcyBtZXRob2RvbG9neSBpcyBleHBsYWluZWQgaW4gdGhlICJVTklDT0RFIElOIEVYQ0VMIiBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+IGJ1dCBpcyBzZW1pLWRlcHJlY2F0ZWQuIElmIHlvdSBhcmUgdXNpbmcgVW5pY29kZSB0aGUgZWFzaWVzdCBvcHRpb24gaXMgdG8ganVzdCB1c2UgVVRGOCBpbiBwZXJsIDUuOCsuCisKKworPWhlYWQxIFdvcmtpbmcgd2l0aCBDZWxsIFJhbmdlcworCisKK0luIHRoZSBzZWN0aW9uIG9uIEM8YWRkX3NlcmllcygpPiBpdCB3YXMgbm90ZWQgdGhhdCB0aGUgc2VyaWVzIG11c3QgYmUgZGVmaW5lZCB1c2luZyBhIHJhbmdlIGZvcm11bGE6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoIHZhbHVlcyA9PiAnPVNoZWV0MSEkQiQyOiRCJDEwJyApOworCitUaGUgd29ya3NoZWV0IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgKGV2ZW4gZm9yIGVtYmVkZGVkIGNoYXJ0cykgYW5kIHRoZSBjZWxsIHJlZmVyZW5jZXMgbXVzdCBiZSAiYWJzb2x1dGUiIHJlZmVyZW5jZXMsIGkuZS4sIHRoZXkgbXVzdCBjb250YWluIEM8JD4gc2lnbnMuIFRoaXMgaXMgdGhlIGZvcm1hdCB0aGF0IGlzIHJlcXVpcmVkIGJ5IEV4Y2VsIGZvciBjaGFydCByZWZlcmVuY2VzLgorCitTaW5jZSBpdCBpc24ndCB2ZXJ5IGNvbnZlbmllbnQgdG8gd29yayB3aXRoIHRoaXMgdHlwZSBvZiBzdHJpbmcgcHJvZ3JhbW1hdGljYWxseSB0aGUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4gbW9kdWxlLCB3aGljaCBpcyBpbmNsdWRlZCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLCBwcm92aWRlcyBhIGZ1bmN0aW9uIGNhbGxlZCBDPHhsX3JhbmdlX2Zvcm11bGEoKT4gdG8gY29udmVydCBmcm9tIHplcm8gYmFzZWQgcm93IGFuZCBjb2x1bW4gY2VsbCByZWZlcmVuY2VzIHRvIGFuIEExIHN0eWxlIGZvcm11bGEgc3RyaW5nLgorCitUaGUgc3ludGF4IGlzOgorCisgICAgeGxfcmFuZ2VfZm9ybXVsYSgkc2hlZXRuYW1lLCAkcm93XzEsICRyb3dfMiwgJGNvbF8xLCAkY29sXzIpCisKK0lmIHlvdSBpbmNsdWRlIGl0IGluIHlvdXIgcHJvZ3JhbSwgdXNpbmcgdGhlIHN0YW5kYXJkIGltcG9ydCBzeW50YXgsIHlvdSBjYW4gdXNlIHRoZSBmdW5jdGlvbiBhcyBmb2xsb3dzOgorCisKKyAgICAjIEluY2x1ZGUgdGhlIFV0aWxpdHkgbW9kdWxlIG9yIGp1c3QgdGhlIGZ1bmN0aW9uIHlvdSBuZWVkLgorICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eSBxdyggeGxfcmFuZ2VfZm9ybXVsYSApOworICAgIC4uLgorCisgICAgIyBUaGVuIHVzZSBpdCBhcyByZXF1aXJlZC4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgICAgPT4geGxfcmFuZ2VfZm9ybXVsYSggJ1NoZWV0MScsIDEsIDksIDAsIDAgKSwKKyAgICAgICAgdmFsdWVzICAgICAgICA9PiB4bF9yYW5nZV9mb3JtdWxhKCAnU2hlZXQxJywgMSwgOSwgMSwgMSApOywKKyAgICApOworCisgICAgIyBXaGljaCBpcyB0aGUgc2FtZSBhczoKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgICAgPT4gJz1TaGVldDEhJEEkMjokQSQxMCcsCisgICAgICAgIHZhbHVlcyAgICAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQxMCcsCisgICAgKTsKKworU2VlIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OlV0aWxpdHk+IGZvciBtb3JlIGRldGFpbHMuCisKKworPWhlYWQxIFRPRE8KKworQ2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFyZSBhIHdvcmsgaW4gcHJvZ3Jlc3MuIE1vcmUgY2hhcnQgdHlwZXMgYW5kIGZlYXR1cmVzIHdpbGwgYmUgYWRkZWQgaW4gdGltZS4gUGxlYXNlIGJlIHBhdGllbnQuIEV2ZW4gYSBzbWFsbCBmZWF0dXJlIGNhbiB0YWtlIGEgd2VlayBvciBtb3JlIHRvIGltcGxlbWVudCwgdGVzdCBhbmQgZG9jdW1lbnQuCisKK0ZlYXR1cmVzIHRoYXQgYXJlIG9uIHRoZSBUT0RPIGxpc3QgYW5kIHdpbGwgYmUgYWRkZWQgYXJlOgorCis9b3ZlcgorCis9aXRlbSAqICBDaGFydCBzdWItdHlwZXMuCisKKz1pdGVtICogQ29sb3VycyBhbmQgZm9ybWF0dGluZyBvcHRpb25zLiBGb3Igbm93IHlvdSB3aWxsIGhhdmUgdG8gbWFrZSBkbyB3aXRoIHRoZSBkZWZhdWx0IEV4Y2VsIGNvbG91cnMgYW5kIGZvcm1hdHMuCisKKz1pdGVtICogQXhpcyBjb250cm9scywgZ3JpZGxpbmVzLgorCis9aXRlbSAqIDNEIGNoYXJ0cy4KKworPWl0ZW0gKiBFbWJlZGRlZCBkYXRhIGluIGNoYXJ0cyBmb3IgdGhpcmQgcGFydHkgYXBwbGljYXRpb24gc3VwcG9ydC4gU2VlIEtub3duIElzc3Vlcy4KKworPWl0ZW0gKiBBZGRpdGlvbmFsIGNoYXJ0IHR5cGVzIHN1Y2ggYXMgQnViYmxlIGFuZCBSYWRhci4gU2VuZCBhbiBlbWFpbCBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gb3RoZXIgdHlwZXMgYW5kIHRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUuCisKKz1iYWNrCisKK0lmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBzcG9uc29yaW5nIGEgZmVhdHVyZSBsZXQgbWUga25vdy4KKworPWhlYWQxIEtOT1dOIElTU1VFUworCis9b3ZlcgorCis9aXRlbSAqIEN1cnJlbnRseSBjaGFydHMgZG9uJ3QgY29udGFpbiBlbWJlZGRlZCBkYXRhIGZyb20gd2hpY2ggdGhlIGNoYXJ0cyBjYW4gYmUgcmVuZGVyZWQuIEV4Y2VsIGFuZCBtb3N0IG90aGVyIHRoaXJkIHBhcnR5IGFwcGxpY2F0aW9ucyBpZ25vcmUgdGhpcyBhbmQgcmVhZCB0aGUgZGF0YSB2aWEgdGhlIGxpbmtzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZC4gSG93ZXZlciwgc29tZSBhcHBsaWNhdGlvbnMgbWF5IGNvbXBsYWluIG9yIG5vdCByZW5kZXIgY2hhcnRzIGNvcnJlY3RseS4gVGhlIHByZXZpZXcgb3B0aW9uIGluIE1hYyBPUyBYIGlzIGFuIGtub3duIGV4YW1wbGUuIFRoaXMgd2lsbCBiZSBmaXhlZCBpbiBhIGxhdGVyIHJlbGVhc2UuCisKKz1pdGVtICogV2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCBjaGFydHMgd2l0aCB0aXRsZXMgc2V0IGluIGEgd29ya2Jvb2sgc29tZSBvZiB0aGUgdGl0bGVzIG1heSBkaXNwbGF5IGF0IGEgZm9udCBzaXplIG9mIDEwIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMTIgdW50aWwgYW5vdGhlciBjaGFydCB3aXRoIHRoZSB0aXRsZSBzZXQgaXMgdmlld2VkLgorCis9aXRlbSAqIFN0b2NrIChhbmQgb3RoZXIpIGNoYXJ0cyBzaG91bGQgaGF2ZSB0aGUgWC1heGlzIGRhdGVzIGFsaWduZWQgYXQgYW4gYW5nbGUgZm9yIGNsYXJpdHkuIFRoaXMgd2lsbCBiZSBmaXhlZCBhdCBhIGxhdGVyIHN0YWdlLgorCis9YmFjaworCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQXJlYS5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQXJlYS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDI1Nzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9BcmVhLnBtCkBAIC0wLDAgKzEsMTk0IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6QXJlYTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBBcmVhIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIEFyZWEgY2hhcnRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBTZWUgZm9ybWF0dGluZyBub3RlIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDsKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPm5ldyggQF8gKTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0X3R5cGUoKQorIworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGZyb20gdGhlIHNwZWNpZmljIGNoYXJ0IGNsYXNzLgorIworIyBXcml0ZSB0aGUgQVJFQSBjaGFydCBCSUZGIHJlY29yZC4gRGVmaW5lcyBhIGFyZWEgY2hhcnQgdHlwZS4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAxQTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGdyYml0ICA9IDB4MDAwMTsgICAgIyBPcHRpb24gZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gcGFjayAndicsICRncmJpdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK0FyZWEgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgQXJlYSBjaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUbyBjcmVhdGUgYSBzaW1wbGUgRXhjZWwgZmlsZSB3aXRoIGEgQXJlYSBjaGFydCB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0LnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisKKyAgICBteSAkY2hhcnQgICAgID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2FyZWEnICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgY2hhcnQuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoZSBjaGFydCByZWZlcnMgdG8uCisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgJ0NhdGVnb3J5JywgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbICdWYWx1ZScsICAgIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRkYXRhICk7CisKKyAgICBfX0VORF9fCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIEFyZWEgY2hhcnRzIGZvciBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gVGhlIGNoYXJ0IG9iamVjdCBpcyBjcmVhdGVkIHZpYSB0aGUgV29ya2Jvb2sgQzxhZGRfY2hhcnQoKT4gbWV0aG9kOgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2FyZWEnICk7CisKK09uY2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkIGl0IGNhbiBiZSBjb25maWd1cmVkIHZpYSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFydCBjbGFzc2VzOgorCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoKTsKKworVGhlc2UgbWV0aG9kcyBhcmUgZXhwbGFpbmVkIGluIGRldGFpbCBpbiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uIENsYXNzIHNwZWNpZmljIG1ldGhvZHMgb3Igc2V0dGluZ3MsIGlmIGFueSwgYXJlIGV4cGxhaW5lZCBiZWxvdy4KKworPWhlYWQxIEFyZWEgQ2hhcnQgTWV0aG9kcworCitUaGVyZSBhcmVuJ3QgY3VycmVudGx5IGFueSBhcmVhIGNoYXJ0IHNwZWNpZmljIG1ldGhvZHMuIFNlZSB0aGUgVE9ETyBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4KKworPWhlYWQxIEVYQU1QTEUKKworSGVyZSBpcyBhIGNvbXBsZXRlIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgbW9zdCBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzIHdoZW4gY3JlYXRpbmcgYSBjaGFydC4KKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X2FyZWEueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdOdW1iZXInLCAnU2FtcGxlIDEnLCAnU2FtcGxlIDInIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICAgICAgWyAzLCA2LCA3LCA1LCA0LCAzIF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisKKyAgICAjIENyZWF0ZSBhIG5ldyBjaGFydCBvYmplY3QuIEluIHRoaXMgY2FzZSBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYXJlYScsIGVtYmVkZGVkID0+IDEgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBmaXJzdCBzZXJpZXMuIChTYW1wbGUgMSkKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAxJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBzZWNvbmQgc2VyaWVzLiAoU2FtcGxlIDIpCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdTYW1wbGUgMicsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDcnLAorICAgICk7CisKKyAgICAjIEFkZCBhIGNoYXJ0IHRpdGxlIGFuZCBzb21lIGF4aXMgbGFiZWxzLgorICAgICRjaGFydC0+c2V0X3RpdGxlICggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCBuYW1lID0+ICdUZXN0IG51bWJlcicgKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKworICAgICMgSW5zZXJ0IHRoZSBjaGFydCBpbnRvIHRoZSB3b3Jrc2hlZXQgKHdpdGggYW4gb2Zmc2V0KS4KKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfY2hhcnQoICdEMicsICRjaGFydCwgMjUsIDEwICk7CisKKyAgICBfX0VORF9fCisKKworPWJlZ2luIGh0bWwKKworPHA+VGhpcyB3aWxsIHByb2R1Y2UgYSBjaGFydCB0aGF0IGxvb2tzIGxpa2UgdGhpczo8L3A+CisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvYXJlYTEuanBnIiB3aWR0aD0iNTI3IiBoZWlnaHQ9IjMyMCIgYWx0PSJDaGFydCBleGFtcGxlLiIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQmFyLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9CYXIucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwZDliNwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQmFyLnBtCkBAIC0wLDAgKzEsMjI4IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6QmFyOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEJhciAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBCYXIgY2hhcnRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBTZWUgZm9ybWF0dGluZyBub3RlIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDsKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPm5ldyggQF8gKTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisKKyAgICAjIFRoZSBheGlzIHBvc2l0aW9ucyBhcmUgcmV2ZXJzZWQgZm9yIGEgYmFyIGNoYXJ0IHNvIHdlIGNoYW5nZSB0aGUgY29uZmlnLgorICAgIG15ICRjID0gJHNlbGYtPntfY29uZmlnfTsKKyAgICAkYy0+e194X2F4aXNfdGV4dH0gICAgID0gWyAweDJELCAgIDB4NkQ5LCAgMHg1RiwgICAweDFDQywgMHgyODEsICAweDAsIDkwIF07CisgICAgJGMtPntfeF9heGlzX3RleHRfcG9zfSA9IFsgMiwgICAgICAyLCAgICAgIDAsICAgICAgMCwgICAgIDB4MTcsICAgMHgyQSBdOworICAgICRjLT57X3lfYXhpc190ZXh0fSAgICAgPSBbIDB4MDc4QSwgMHgwREZDLCAweDAxMUQsIDB4OUMsICAweDAwODEsIDB4MDAwMCBdOworICAgICRjLT57X3lfYXhpc190ZXh0X3Bvc30gPSBbIDIsICAgICAgMiwgICAgICAwLCAgICAgIDAsICAgICAweDQ1LCAgIDB4MTcgXTsKKworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydF90eXBlKCkKKyMKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBmcm9tIHRoZSBzcGVjaWZpYyBjaGFydCBjbGFzcy4KKyMKKyMgV3JpdGUgdGhlIEJBUiBjaGFydCBCSUZGIHJlY29yZC4gRGVmaW5lcyBhIGJhciBvciBjb2x1bW4gY2hhcnQgdHlwZS4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MTAxNzsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDA2OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHBjT3ZlcmxhcCA9IDB4MDAwMDsgICAgIyBTcGFjZSBiZXR3ZWVuIGJhcnMuCisgICAgbXkgJHBjR2FwICAgICA9IDB4MDA5NjsgICAgIyBTcGFjZSBiZXR3ZWVuIGNhdHMuCisgICAgbXkgJGdyYml0ICAgICA9IDB4MDAwMTsgICAgIyBPcHRpb24gZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwY092ZXJsYXA7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwY0dhcDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3NldF9lbWJlZGRlZF9jb25maWdfZGF0YSgpCisjCisjIE92ZXJyaWRlIHNvbWUgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkYXRhIGZvciBhbiBlbWJlZGRlZCBjaGFydC4KKyMKK3N1YiBfc2V0X2VtYmVkZGVkX2NvbmZpZ19kYXRhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIFNldCB0aGUgcGFyZW50IGNvbmZpZ3VyYXRpb24gZmlyc3QuCisgICAgJHNlbGYtPlNVUEVSOjpfc2V0X2VtYmVkZGVkX2NvbmZpZ19kYXRhKCk7CisKKyAgICAjIFRoZSBheGlzIHBvc2l0aW9ucyBhcmUgcmV2ZXJzZWQgZm9yIGEgYmFyIGNoYXJ0IHNvIHdlIGNoYW5nZSB0aGUgY29uZmlnLgorICAgIG15ICRjID0gJHNlbGYtPntfY29uZmlnfTsKKyAgICAkYy0+e194X2F4aXNfdGV4dH0gICAgID0gWyAweDU3LCAgIDB4NUJDLCAgMHhCNSwgICAweDIxNCwgMHgyODEsIDB4MCwgOTAgXTsKKyAgICAkYy0+e194X2F4aXNfdGV4dF9wb3N9ID0gWyAyLCAgICAgIDIsICAgICAgMCwgICAgICAwLCAgICAgMHgxNywgIDB4MkEgXTsKKyAgICAkYy0+e195X2F4aXNfdGV4dH0gICAgID0gWyAweDA3NEEsIDB4MEM4RiwgMHgwMjFGLCAweDEyMywgMHg4MSwgIDB4MDAwMCBdOworICAgICRjLT57X3lfYXhpc190ZXh0X3Bvc30gPSBbIDIsICAgICAgMiwgICAgICAwLCAgICAgIDAsICAgICAweDQ1LCAgMHgxNyBdOworCit9CisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK0JhciAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBCYXIgY2hhcnRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworVG8gY3JlYXRlIGEgc2ltcGxlIEV4Y2VsIGZpbGUgd2l0aCBhIEJhciBjaGFydCB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0LnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisKKyAgICBteSAkY2hhcnQgICAgID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2JhcicgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBjaGFydC4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhlIGNoYXJ0IHJlZmVycyB0by4KKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAnQ2F0ZWdvcnknLCAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgJ1ZhbHVlJywgICAgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGRhdGEgKTsKKworICAgIF9fRU5EX18KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgQmFyIGNoYXJ0cyBmb3IgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4uIFRoZSBjaGFydCBvYmplY3QgaXMgY3JlYXRlZCB2aWEgdGhlIFdvcmtib29rIEM8YWRkX2NoYXJ0KCk+IG1ldGhvZDoKKworICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdiYXInICk7CisKK09uY2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkIGl0IGNhbiBiZSBjb25maWd1cmVkIHZpYSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFydCBjbGFzc2VzOgorCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoKTsKKworVGhlc2UgbWV0aG9kcyBhcmUgZXhwbGFpbmVkIGluIGRldGFpbCBpbiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uIENsYXNzIHNwZWNpZmljIG1ldGhvZHMgb3Igc2V0dGluZ3MsIGlmIGFueSwgYXJlIGV4cGxhaW5lZCBiZWxvdy4KKworPWhlYWQxIEJhciBDaGFydCBNZXRob2RzCisKK1RoZXJlIGFyZW4ndCBjdXJyZW50bHkgYW55IGJhciBjaGFydCBzcGVjaWZpYyBtZXRob2RzLiBTZWUgdGhlIFRPRE8gc2VjdGlvbiBvZiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uCisKKz1oZWFkMSBFWEFNUExFCisKK0hlcmUgaXMgYSBjb21wbGV0ZSBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIG1vc3Qgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcyB3aGVuIGNyZWF0aW5nIGEgY2hhcnQuCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9iYXIueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdOdW1iZXInLCAnU2FtcGxlIDEnLCAnU2FtcGxlIDInIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICAgICAgWyAzLCA2LCA3LCA1LCA0LCAzIF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisKKyAgICAjIENyZWF0ZSBhIG5ldyBjaGFydCBvYmplY3QuIEluIHRoaXMgY2FzZSBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYmFyJywgZW1iZWRkZWQgPT4gMSApOworCisgICAgIyBDb25maWd1cmUgdGhlIGZpcnN0IHNlcmllcy4gKFNhbXBsZSAxKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDEnLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBDb25maWd1cmUgdGhlIHNlY29uZCBzZXJpZXMuIChTYW1wbGUgMikKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAyJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgKTsKKworICAgICMgQWRkIGEgY2hhcnQgdGl0bGUgYW5kIHNvbWUgYXhpcyBsYWJlbHMuCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUgKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1Rlc3QgbnVtYmVyJyApOworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0QyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9iYXIxLmpwZyIgd2lkdGg9IjUyNyIgaGVpZ2h0PSIzMjAiIGFsdD0iQ2hhcnQgZXhhbXBsZS4iIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0NvbHVtbi5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQ29sdW1uLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDA0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0NvbHVtbi5wbQpAQCAtMCwwICsxLDE5OSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OkNvbHVtbjsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDb2x1bW4gLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgQ29sdW1uIGNoYXJ0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgU2VlIGZvcm1hdHRpbmcgbm90ZSBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKworcmVxdWlyZSBFeHBvcnRlcjsKKwordXNlIHN0cmljdDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ7CisKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0IEV4cG9ydGVyKTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LT5uZXcoIEBfICk7CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydF90eXBlKCkKKyMKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBmcm9tIHRoZSBzcGVjaWZpYyBjaGFydCBjbGFzcy4KKyMKKyMgV3JpdGUgdGhlIEJBUiBjaGFydCBCSUZGIHJlY29yZC4gRGVmaW5lcyBhIGJhciBvciBjb2x1bW4gY2hhcnQgdHlwZS4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MTAxNzsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDA2OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHBjT3ZlcmxhcCA9IDB4MDAwMDsgICAgIyBTcGFjZSBiZXR3ZWVuIGJhcnMuCisgICAgbXkgJHBjR2FwICAgICA9IDB4MDA5NjsgICAgIyBTcGFjZSBiZXR3ZWVuIGNhdHMuCisgICAgbXkgJGdyYml0ICAgICA9IDB4MDAwMDsgICAgIyBPcHRpb24gZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwY092ZXJsYXA7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwY0dhcDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworQ29sdW1uIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIENvbHVtbiBjaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUbyBjcmVhdGUgYSBzaW1wbGUgRXhjZWwgZmlsZSB3aXRoIGEgQ29sdW1uIGNoYXJ0IHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnQueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG15ICRjaGFydCAgICAgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnY29sdW1uJyApOworCisgICAgIyBDb25maWd1cmUgdGhlIGNoYXJ0LgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGUgY2hhcnQgcmVmZXJzIHRvLgorICAgIG15ICRkYXRhID0gWworICAgICAgICBbICdDYXRlZ29yeScsIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAnVmFsdWUnLCAgICAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkZGF0YSApOworCisgICAgX19FTkRfXworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBDb2x1bW4gY2hhcnRzIGZvciBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gVGhlIGNoYXJ0IG9iamVjdCBpcyBjcmVhdGVkIHZpYSB0aGUgV29ya2Jvb2sgQzxhZGRfY2hhcnQoKT4gbWV0aG9kOgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicgKTsKKworT25jZSB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGNoYXJ0IGNsYXNzZXM6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF90aXRsZSgpOworCitUaGVzZSBtZXRob2RzIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGluIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4gQ2xhc3Mgc3BlY2lmaWMgbWV0aG9kcyBvciBzZXR0aW5ncywgaWYgYW55LCBhcmUgZXhwbGFpbmVkIGJlbG93LgorCis9aGVhZDEgQ29sdW1uIENoYXJ0IE1ldGhvZHMKKworVGhlcmUgYXJlbid0IGN1cnJlbnRseSBhbnkgY29sdW1uIGNoYXJ0IHNwZWNpZmljIG1ldGhvZHMuIFNlZSB0aGUgVE9ETyBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4KKworPWhlYWQxIEVYQU1QTEUKKworSGVyZSBpcyBhIGNvbXBsZXRlIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgbW9zdCBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzIHdoZW4gY3JlYXRpbmcgYSBjaGFydC4KKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X2NvbHVtbi54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ051bWJlcicsICdTYW1wbGUgMScsICdTYW1wbGUgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKworICAgICMgQ3JlYXRlIGEgbmV3IGNoYXJ0IG9iamVjdC4gSW4gdGhpcyBjYXNlIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdjb2x1bW4nLCBlbWJlZGRlZCA9PiAxICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgZmlyc3Qgc2VyaWVzLiAoU2FtcGxlIDEpCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdTYW1wbGUgMScsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2Vjb25kIHNlcmllcy4gKFNhbXBsZSAyKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDInLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICApOworCisgICAgIyBBZGQgYSBjaGFydCB0aXRsZSBhbmQgc29tZSBheGlzIGxhYmVscy4KKyAgICAkY2hhcnQtPnNldF90aXRsZSAoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnVGVzdCBudW1iZXInICk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgd29ya3NoZWV0ICh3aXRoIGFuIG9mZnNldCkuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRDInLCAkY2hhcnQsIDI1LCAxMCApOworCisgICAgX19FTkRfXworCisKKz1iZWdpbiBodG1sCisKKzxwPlRoaXMgd2lsbCBwcm9kdWNlIGEgY2hhcnQgdGhhdCBsb29rcyBsaWtlIHRoaXM6PC9wPgorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NvbHVtbjEuanBnIiB3aWR0aD0iNTI3IiBoZWlnaHQ9IjMyMCIgYWx0PSJDaGFydCBleGFtcGxlLiIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvRXh0ZXJuYWwucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0V4dGVybmFsLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDBiODUKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0V4dGVybmFsLnBtCkBAIC0wLDAgKzEsMTE5IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6RXh0ZXJuYWw7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRXh0ZXJuYWwgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgZXh0ZXJuYWwgY2hhcnRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyMKKyMgcGVybHRpZHkgd2l0aCBvcHRpb25zOiAtbWJsPTIgLXB0PTAgLW5vbGEKKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDsKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgICAgICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkZXh0ZXJuYWxfZmlsZW5hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgICAgICAgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPm5ldyggQF8gKTsKKworICAgICRzZWxmLT57X2ZpbGVuYW1lfSAgICAgPSAkZXh0ZXJuYWxfZmlsZW5hbWU7CisgICAgJHNlbGYtPntfZXh0ZXJuYWxfYmlufSA9IDE7CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgICRzZWxmLT5faW5pdGlhbGl6ZSgpOyAgICAjIFJlcXVpcmVzIG92ZXJyaWRkZW4gaW5pdGlhbGl6ZSgpLgorICAgIHJldHVybiAkc2VsZjsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfaW5pdGlhbGl6ZSgpCisjCisjIFJlYWQgYWxsIHRoZSBkYXRhIGludG8gbWVtb3J5IGZvciB0aGUgZXh0ZXJuYWwgYmluYXJ5IHN0eWxlIGNoYXJ0LgorIworIworc3ViIF9pbml0aWFsaXplIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkZmlsZW5hbWUgICA9ICRzZWxmLT57X2ZpbGVuYW1lfTsKKyAgICBteSAkZmlsZWhhbmRsZSA9IEZpbGVIYW5kbGUtPm5ldyggJGZpbGVuYW1lICkKKyAgICAgIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiAkZmlsZW5hbWUgaW4gYWRkX2NoYXJ0X2V4dCgpOiAkIS5cbiI7CisKKyAgICBiaW5tb2RlKCAkZmlsZWhhbmRsZSApOworCisgICAgJHNlbGYtPntfZmlsZWhhbmRsZX0gICAgPSAkZmlsZWhhbmRsZTsKKyAgICAkc2VsZi0+e19kYXRhc2l6ZX0gICAgICA9IC1zICRmaWxlaGFuZGxlOworICAgICRzZWxmLT57X3VzaW5nX3RtcGZpbGV9ID0gMDsKKworICAgICMgUmVhZCB0aGUgZW50aXJlIGV4dGVybmFsIGNoYXJ0IGJpbmFyeSBpbnRvIHRoZSB0aGUgZGF0YSBidWZmZXIuCisgICAgIyBUaGlzIHdpbGwgYmUgcmV0cmlldmVkIGJ5IF9nZXRfZGF0YSgpIHdoZW4gdGhlIGNoYXJ0IGlzIGNsb3NlZCgpLgorICAgIHJlYWQoICRzZWxmLT57X2ZpbGVoYW5kbGV9LCAkc2VsZi0+e19kYXRhfSwgJHNlbGYtPntfZGF0YXNpemV9ICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2xvc2UoKQorIworIyBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBvciBzdG9yZSBDaGFydCBkYXRhIHN0cnVjdHVyZXMgd2hlbiB1c2luZyBhbgorIyBleHRlcm5hbCBiaW5hcnksIHNvIHdlIGhhdmUgYSBkZWZhdWx0IGNsb3NlIG1ldGhvZC4KKyMKK3N1YiBfY2xvc2UgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiB1bmRlZjsKK30KKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworRXh0ZXJuYWwgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgZXh0ZXJuYWwgY2hhcnRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworVGhpcyBtb2R1bGUgaXMgdXNlZCB0byBpbmNsdWRlIGV4dGVybmFsIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgdG8gaW5jbHVkZSBleHRlcm5hbCBjaGFydHMgaW4gTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4uIEl0IGlzIGFuIGludGVybmFsIG1vZHVsZSBhbmQgaXNuJ3QgdXNlZCBkaXJlY3RseSBieSB0aGUgZW5kIHVzZXIuCisKK0l0IGlzIHNlbWktZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgdXNpbmcgIm5hdGl2ZSIgY2hhcnRzLiBTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LgorCitGb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZWQgZXh0ZXJuYWwgY2hhcnRzIHNlZSB0aGUgQzxleHRlcm5hbF9jaGFydHMudHh0PiAgKG9yIEM8LnBvZD4pIGluIHRoZSBDPGV4dGVybmFsX2NoYXJ0cz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKwpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9MaW5lLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9MaW5lLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMzIwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0xpbmUucG0KQEAgLTAsMCArMSwxOTQgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpMaW5lOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIExpbmUgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgTGluZSBjaGFydHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIFNlZSBmb3JtYXR0aW5nIG5vdGUgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3JlcXVpcmUgRXhwb3J0ZXI7CisKK3VzZSBzdHJpY3Q7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydCBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC0+bmV3KCBAXyApOworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRfdHlwZSgpCisjCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBtZXRob2QgZnJvbSB0aGUgc3BlY2lmaWMgY2hhcnQgY2xhc3MuCisjCisjIFdyaXRlIHRoZSBMSU5FIGNoYXJ0IEJJRkYgcmVjb3JkLiBEZWZpbmVzIGEgbGluZSBjaGFydCB0eXBlLgorIworc3ViIF9zdG9yZV9jaGFydF90eXBlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDE4OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkZ3JiaXQgID0gMHgwMDAwOyAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworTGluZSAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBMaW5lIGNoYXJ0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1RvIGNyZWF0ZSBhIHNpbXBsZSBFeGNlbCBmaWxlIHdpdGggYSBMaW5lIGNoYXJ0IHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnQueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG15ICRjaGFydCAgICAgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBjaGFydC4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhlIGNoYXJ0IHJlZmVycyB0by4KKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAnQ2F0ZWdvcnknLCAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgJ1ZhbHVlJywgICAgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGRhdGEgKTsKKworICAgIF9fRU5EX18KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgTGluZSBjaGFydHMgZm9yIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+LiBUaGUgY2hhcnQgb2JqZWN0IGlzIGNyZWF0ZWQgdmlhIHRoZSBXb3JrYm9vayBDPGFkZF9jaGFydCgpPiBtZXRob2Q6CisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScgKTsKKworT25jZSB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGNoYXJ0IGNsYXNzZXM6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF90aXRsZSgpOworCitUaGVzZSBtZXRob2RzIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGluIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4gQ2xhc3Mgc3BlY2lmaWMgbWV0aG9kcyBvciBzZXR0aW5ncywgaWYgYW55LCBhcmUgZXhwbGFpbmVkIGJlbG93LgorCis9aGVhZDEgTGluZSBDaGFydCBNZXRob2RzCisKK1RoZXJlIGFyZW4ndCBjdXJyZW50bHkgYW55IGxpbmUgY2hhcnQgc3BlY2lmaWMgbWV0aG9kcy4gU2VlIHRoZSBUT0RPIHNlY3Rpb24gb2YgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LgorCis9aGVhZDEgRVhBTVBMRQorCitIZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBtb3N0IG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMgd2hlbiBjcmVhdGluZyBhIGNoYXJ0LgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnRfbGluZS54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ051bWJlcicsICdTYW1wbGUgMScsICdTYW1wbGUgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKworICAgICMgQ3JlYXRlIGEgbmV3IGNoYXJ0IG9iamVjdC4gSW4gdGhpcyBjYXNlIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdsaW5lJywgZW1iZWRkZWQgPT4gMSApOworCisgICAgIyBDb25maWd1cmUgdGhlIGZpcnN0IHNlcmllcy4gKFNhbXBsZSAxKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDEnLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBDb25maWd1cmUgdGhlIHNlY29uZCBzZXJpZXMuIChTYW1wbGUgMikKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAyJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgKTsKKworICAgICMgQWRkIGEgY2hhcnQgdGl0bGUgYW5kIHNvbWUgYXhpcyBsYWJlbHMuCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUgKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1Rlc3QgbnVtYmVyJyApOworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0QyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9saW5lMS5qcGciIHdpZHRoPSI1MjciIGhlaWdodD0iMzIwIiBhbHQ9IkNoYXJ0IGV4YW1wbGUuIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKwpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9QaWUucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1BpZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDI3ZTQwCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9QaWUucG0KQEAgLTAsMCArMSwyMTcgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpQaWU7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUGllIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIFBpZSBjaGFydHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIFNlZSBmb3JtYXR0aW5nIG5vdGUgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3JlcXVpcmUgRXhwb3J0ZXI7CisKK3VzZSBzdHJpY3Q7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydCBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC0+bmV3KCBAXyApOworCisgICAgJHNlbGYtPntfdmFyeV9kYXRhX2NvbG9yfSA9IDE7CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydF90eXBlKCkKKyMKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBmcm9tIHRoZSBzcGVjaWZpYyBjaGFydCBjbGFzcy4KKyMKKyMgV3JpdGUgdGhlIFBpZSBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAxOTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDA2OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGFuZ2xlICA9IDB4MDAwMDsgICAgIyBBbmdsZS4KKyAgICBteSAkZG9udXQgID0gMHgwMDAwOyAgICAjIERvbnV0IGhvbGUgc2l6ZS4KKyAgICBteSAkZ3JiaXQgID0gMHgwMDAyOyAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGFuZ2xlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZG9udXQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F4aXNwYXJlbnRfc3RyZWFtKCkuIE92ZXJyaWRkZW4uCisjCisjIFdyaXRlIHRoZSBBWElTUEFSRU5UIGNoYXJ0IHN1YnN0cmVhbS4KKyMKKyMgQSBQaWUgY2hhcnQgaGFzIG5vIFggb3IgWSBheGlzIHNvIHdlIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJlbW92ZSB0aGVtLgorIworc3ViIF9zdG9yZV9heGlzcGFyZW50X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9heGlzcGFyZW50KCBAeyAkc2VsZi0+e19jb25maWd9LT57X2F4aXNwYXJlbnR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e19heGlzcGFyZW50X3Bvc30gfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9jaGFydGZvcm1hdF9zdHJlYW0oKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK1BpZSAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBQaWUgY2hhcnRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworVG8gY3JlYXRlIGEgc2ltcGxlIEV4Y2VsIGZpbGUgd2l0aCBhIFBpZSBjaGFydCB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0LnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisKKyAgICBteSAkY2hhcnQgICAgID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBjaGFydC4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhlIGNoYXJ0IHJlZmVycyB0by4KKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAnQ2F0ZWdvcnknLCAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgJ1ZhbHVlJywgICAgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGRhdGEgKTsKKworICAgIF9fRU5EX18KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgUGllIGNoYXJ0cyBmb3IgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4uIFRoZSBjaGFydCBvYmplY3QgaXMgY3JlYXRlZCB2aWEgdGhlIFdvcmtib29rIEM8YWRkX2NoYXJ0KCk+IG1ldGhvZDoKKworICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdwaWUnICk7CisKK09uY2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkIGl0IGNhbiBiZSBjb25maWd1cmVkIHZpYSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFydCBjbGFzc2VzOgorCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCk7CisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoKTsKKworVGhlc2UgbWV0aG9kcyBhcmUgZXhwbGFpbmVkIGluIGRldGFpbCBpbiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uIENsYXNzIHNwZWNpZmljIG1ldGhvZHMgb3Igc2V0dGluZ3MsIGlmIGFueSwgYXJlIGV4cGxhaW5lZCBiZWxvdy4KKworPWhlYWQxIFBpZSBDaGFydCBNZXRob2RzCisKK1RoZXJlIGFyZW4ndCBjdXJyZW50bHkgYW55IHBpZSBjaGFydCBzcGVjaWZpYyBtZXRob2RzLiBTZWUgdGhlIFRPRE8gc2VjdGlvbiBvZiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uCisKK0EgUGllIGNoYXJ0IGRvZXNuJ3QgaGF2ZSBhbiBYIG9yIFkgYXhpcyBzbyB0aGUgZm9sbG93aW5nIGNvbW1vbiBjaGFydCBtZXRob2RzIGFyZSBpZ25vcmVkLgorCisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCk7CisKKz1oZWFkMSBFWEFNUExFCisKK0hlcmUgaXMgYSBjb21wbGV0ZSBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIG1vc3Qgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcyB3aGVuIGNyZWF0aW5nIGEgY2hhcnQuCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9waWUueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdDYXRlZ29yeScsICdWYWx1ZXMnIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgJ0FwcGxlJywgJ0NoZXJyeScsICdQZWNhbicgXSwKKyAgICAgICAgWyA2MCwgICAgICAgMzAsICAgICAgIDEwICAgICBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGhlYWRpbmdzLCAkYm9sZCApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTInLCAkZGF0YSApOworCisgICAgIyBDcmVhdGUgYSBuZXcgY2hhcnQgb2JqZWN0LiBJbiB0aGlzIGNhc2UgYW4gZW1iZWRkZWQgY2hhcnQuCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScsIGVtYmVkZGVkID0+IDEgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdQaWUgc2FsZXMgZGF0YScsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ0JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDQnLAorICAgICk7CisKKyAgICAjIEFkZCBhIHRpdGxlLgorICAgICRjaGFydC0+c2V0X3RpdGxlKCBuYW1lID0+ICdQb3B1bGFyIFBpZSBUeXBlcycgKTsKKworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0MyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9waWUxLmpwZyIgd2lkdGg9IjUyNyIgaGVpZ2h0PSIzMjAiIGFsdD0iQ2hhcnQgZXhhbXBsZS4iIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1NjYXR0ZXIucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1NjYXR0ZXIucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyMDVkZQotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvU2NhdHRlci5wbQpAQCAtMCwwICsxLDI0NSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OlNjYXR0ZXI7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU2NhdHRlciAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBTY2F0dGVyIGNoYXJ0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgU2VlIGZvcm1hdHRpbmcgbm90ZSBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKworcmVxdWlyZSBFeHBvcnRlcjsKKwordXNlIHN0cmljdDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ7CisKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0IEV4cG9ydGVyKTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LT5uZXcoIEBfICk7CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydF90eXBlKCkKKyMKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBmcm9tIHRoZSBzcGVjaWZpYyBjaGFydCBjbGFzcy4KKyMKKyMgV3JpdGUgdGhlIFNDQVRURVIgY2hhcnQgQklGRiByZWNvcmQuIERlZmluZXMgYSBzY2F0dGVyIGNoYXJ0IHR5cGUuCisjCitzdWIgX3N0b3JlX2NoYXJ0X3R5cGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgPSAweDEwMUI7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgICA9IDB4MDAwNjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRidWJibGVfcmF0aW8gPSAweDAwNjQ7ICAgICMgQnViYmxlIHJhdGlvLgorICAgIG15ICRidWJibGVfdHlwZSAgPSAweDAwMDE7ICAgICMgQnViYmxlIHR5cGUuCisgICAgbXkgJGdyYml0ICAgICAgICA9IDB4MDAwMDsgICAgIyBPcHRpb24gZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRidWJibGVfcmF0aW87CisgICAgJGRhdGEgLj0gcGFjayAndicsICRidWJibGVfdHlwZTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhpc19jYXRlZ29yeV9zdHJlYW0oKS4gT3ZlcnJpZGRlbi4KKyMKKyMgV3JpdGUgdGhlIEFYSVMgY2hhcnQgc3Vic3RyZWFtIGZvciB0aGUgY2hhcnQgY2F0ZWdvcnkuCisjCisjIEZvciBhIFNjYXR0ZXIgY2hhcnQgdGhlIGNhdGVnb3J5IHN0cmVhbSBpcyByZXBsYWNlIHdpdGggYSB2YWx1ZXMgc3RyZWFtLiBXZQorIyBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgdHVybiBpdCBpbnRvIGEgdmFsdWVzIHN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfYXhpc19jYXRlZ29yeV9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfYXhpcyggMCApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfdmFsdWVyYW5nZSgpOworICAgICRzZWxmLT5fc3RvcmVfdGljaygpOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbWFya2VyX2RhdGFmb3JtYXRfc3RyZWFtKCkuIE92ZXJyaWRkZW4uCisjCisjIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHBhcmVudCBhYnN0cmFjdCBtZXRob2QgIHRvIGRlZmluZQorIyBwcm9wZXJ0aWVzIG9mIG1hcmtlcnMsIGxpbmV0eXBlcywgcGllIGZvcm1hdHMgYW5kIG90aGVyLgorIworc3ViIF9zdG9yZV9tYXJrZXJfZGF0YWZvcm1hdF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfZGF0YWZvcm1hdCggMHgwMDAwLCAweEZGRkQsIDB4MDAwMCApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfM2RiYXJzaGFwZSgpOworICAgICRzZWxmLT5fc3RvcmVfbGluZWZvcm1hdCggMHgwMDAwMDAwMCwgMHgwMDA1LCAweEZGRkYsIDB4MDAwOCwgMHgwMDREICk7CisgICAgJHNlbGYtPl9zdG9yZV9hcmVhZm9ybWF0KCAweDAwRkZGRkZGLCAweDAwMDAsIDB4MDEsIDB4MDEsIDB4NEUsIDB4NEQgKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BpZWZvcm1hdCgpOworICAgICRzZWxmLT5fc3RvcmVfbWFya2VyZm9ybWF0KCAweDAwLCAweDAwLCAweDAyLCAweDAxLCAweDRELCAweDRELCAweDNDICk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKKworfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK1NjYXR0ZXIgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgU2NhdHRlciBjaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUbyBjcmVhdGUgYSBzaW1wbGUgRXhjZWwgZmlsZSB3aXRoIGEgU2NhdHRlciBjaGFydCB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0LnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisKKyAgICBteSAkY2hhcnQgICAgID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3NjYXR0ZXInICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgY2hhcnQuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoZSBjaGFydCByZWZlcnMgdG8uCisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgJ0NhdGVnb3J5JywgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbICdWYWx1ZScsICAgIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRkYXRhICk7CisKKyAgICBfX0VORF9fCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIFNjYXR0ZXIgY2hhcnRzIGZvciBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gVGhlIGNoYXJ0IG9iamVjdCBpcyBjcmVhdGVkIHZpYSB0aGUgV29ya2Jvb2sgQzxhZGRfY2hhcnQoKT4gbWV0aG9kOgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3NjYXR0ZXInICk7CisKK09uY2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkIGl0IGNhbiBiZSBjb25maWd1cmVkIHZpYSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFydCBjbGFzc2VzOgorCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoKTsKKworVGhlc2UgbWV0aG9kcyBhcmUgZXhwbGFpbmVkIGluIGRldGFpbCBpbiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uIENsYXNzIHNwZWNpZmljIG1ldGhvZHMgb3Igc2V0dGluZ3MsIGlmIGFueSwgYXJlIGV4cGxhaW5lZCBiZWxvdy4KKworPWhlYWQxIFNjYXR0ZXIgQ2hhcnQgTWV0aG9kcworCitUaGVyZSBhcmVuJ3QgY3VycmVudGx5IGFueSBzY2F0dGVyIGNoYXJ0IHNwZWNpZmljIG1ldGhvZHMuIFNlZSB0aGUgVE9ETyBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4KKworPWhlYWQxIEVYQU1QTEUKKworSGVyZSBpcyBhIGNvbXBsZXRlIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgbW9zdCBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzIHdoZW4gY3JlYXRpbmcgYSBjaGFydC4KKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X3NjYXR0ZXIueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdOdW1iZXInLCAnU2FtcGxlIDEnLCAnU2FtcGxlIDInIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICAgICAgWyAzLCA2LCA3LCA1LCA0LCAzIF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisKKyAgICAjIENyZWF0ZSBhIG5ldyBjaGFydCBvYmplY3QuIEluIHRoaXMgY2FzZSBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnc2NhdHRlcicsIGVtYmVkZGVkID0+IDEgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBmaXJzdCBzZXJpZXMuIChTYW1wbGUgMSkKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAxJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBzZWNvbmQgc2VyaWVzLiAoU2FtcGxlIDIpCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdTYW1wbGUgMicsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDcnLAorICAgICk7CisKKyAgICAjIEFkZCBhIGNoYXJ0IHRpdGxlIGFuZCBzb21lIGF4aXMgbGFiZWxzLgorICAgICRjaGFydC0+c2V0X3RpdGxlICggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCBuYW1lID0+ICdUZXN0IG51bWJlcicgKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKworICAgICMgSW5zZXJ0IHRoZSBjaGFydCBpbnRvIHRoZSB3b3Jrc2hlZXQgKHdpdGggYW4gb2Zmc2V0KS4KKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfY2hhcnQoICdEMicsICRjaGFydCwgMjUsIDEwICk7CisKKyAgICBfX0VORF9fCisKKworPWJlZ2luIGh0bWwKKworPHA+VGhpcyB3aWxsIHByb2R1Y2UgYSBjaGFydCB0aGF0IGxvb2tzIGxpa2UgdGhpczo8L3A+CisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvc2NhdHRlcjEuanBnIiB3aWR0aD0iNTI3IiBoZWlnaHQ9IjMyMCIgYWx0PSJDaGFydCBleGFtcGxlLiIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvU3RvY2sucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1N0b2NrLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTI5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1N0b2NrLnBtCkBAIC0wLDAgKzEsMjU3IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6U3RvY2s7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3RvY2sgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgU3RvY2sgY2hhcnRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBTZWUgZm9ybWF0dGluZyBub3RlIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDsKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPm5ldyggQF8gKTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0X3R5cGUoKQorIworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGZyb20gdGhlIHNwZWNpZmljIGNoYXJ0IGNsYXNzLgorIworIyBXcml0ZSB0aGUgTElORSBjaGFydCBCSUZGIHJlY29yZC4gQSBzdG9jayBjaGFydCB1c2VzIHRoZSBzYW1lIExJTkUgcmVjb3JkCisjIGFzIGEgbGluZSBjaGFydCBidXQgd2l0aCBhZGRpdGlvbmFsIERST1BCQVIgYW5kIENIQVJUTElORSByZWNvcmRzIHRvIGRlZmluZQorIyB0aGUgc3RvY2sgc3R5bGUuCisjCitzdWIgX3N0b3JlX2NoYXJ0X3R5cGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwMTg7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRncmJpdCAgPSAweDAwMDA7ICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbWFya2VyX2RhdGFmb3JtYXRfc3RyZWFtKCkuIE92ZXJyaWRkZW4uCisjCisjIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHBhcmVudCBhYnN0cmFjdCBtZXRob2QgdG8gZGVmaW5lCisjIHByb3BlcnRpZXMgb2YgbWFya2VycywgbGluZXR5cGVzLCBwaWUgZm9ybWF0cyBhbmQgb3RoZXIuCisjCitzdWIgX3N0b3JlX21hcmtlcl9kYXRhZm9ybWF0X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9kcm9wYmFyKCk7CisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfbGluZWZvcm1hdCggMHgwMDAwMDAwMCwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMSwgMHgwMDRGICk7CisgICAgJHNlbGYtPl9zdG9yZV9hcmVhZm9ybWF0KCAweDAwRkZGRkZGLCAweDAwMDAsIDB4MDEsIDB4MDEsIDB4MDksIDB4MDggKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworCisgICAgJHNlbGYtPl9zdG9yZV9kcm9wYmFyKCk7CisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfbGluZWZvcm1hdCggMHgwMDAwMDAwMCwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMSwgMHgwMDRGICk7CisgICAgJHNlbGYtPl9zdG9yZV9hcmVhZm9ybWF0KCAweDAwMDAsIDB4MDBGRkZGRkYsIDB4MDEsIDB4MDEsIDB4MDgsIDB4MDkgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworCisgICAgJHNlbGYtPl9zdG9yZV9jaGFydGxpbmUoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2xpbmVmb3JtYXQoIDB4MDAwMDAwMDAsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4MDA0RiApOworCisKKyAgICAkc2VsZi0+X3N0b3JlX2RhdGFmb3JtYXQoIDB4MDAwMCwgMHhGRkZELCAweDAwMDAgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV8zZGJhcnNoYXBlKCk7CisgICAgJHNlbGYtPl9zdG9yZV9saW5lZm9ybWF0KCAweDAwMDAwMDAwLCAweDAwMDUsIDB4RkZGRiwgMHgwMDAwLCAweDAwNEYgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FyZWFmb3JtYXQoIDB4MDAwMDAwMDAsIDB4MDAwMCwgMHgwMCwgMHgwMSwgMHg0RCwgMHg0RCApOworICAgICRzZWxmLT5fc3RvcmVfcGllZm9ybWF0KCk7CisgICAgJHNlbGYtPl9zdG9yZV9tYXJrZXJmb3JtYXQoIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NEQsIDB4NEQsIDB4M0MgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworCit9CisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworU3RvY2sgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgU3RvY2sgY2hhcnRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworVG8gY3JlYXRlIGEgc2ltcGxlIEV4Y2VsIGZpbGUgd2l0aCBhIFN0b2NrIGNoYXJ0IHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnQueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG15ICRjaGFydCAgICAgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnc3RvY2snICk7CisKKyAgICAjIEFkZCBhIHNlcmllcyBmb3IgZWFjaCBPcGVuLUhpZ2gtTG93LUNsb3NlLgorICAgICRjaGFydC0+YWRkX3NlcmllcyggY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDYnLCB2YWx1ZXMgPT4gJz1TaGVldDEhJEIkMjokQiQ2JyApOworICAgICRjaGFydC0+YWRkX3NlcmllcyggY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDYnLCB2YWx1ZXMgPT4gJz1TaGVldDEhJEMkMjokQyQ2JyApOworICAgICRjaGFydC0+YWRkX3NlcmllcyggY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDYnLCB2YWx1ZXMgPT4gJz1TaGVldDEhJEQkMjokRCQ2JyApOworICAgICRjaGFydC0+YWRkX3NlcmllcyggY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDYnLCB2YWx1ZXMgPT4gJz1TaGVldDEhJEUkMjokRSQ2JyApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoZSBjaGFydCByZWZlcnMgdG8uCisgICAgIyAuLi4gU2VlIHRoZSBmdWxsIGV4YW1wbGUgYmVsb3cuCisKKyAgICBfX0VORF9fCisKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgU3RvY2sgY2hhcnRzIGZvciBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gVGhlIGNoYXJ0IG9iamVjdCBpcyBjcmVhdGVkIHZpYSB0aGUgV29ya2Jvb2sgQzxhZGRfY2hhcnQoKT4gbWV0aG9kOgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3N0b2NrJyApOworCitPbmNlIHRoZSBvYmplY3QgaXMgY3JlYXRlZCBpdCBjYW4gYmUgY29uZmlndXJlZCB2aWEgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgY2hhcnQgY2xhc3NlczoKKworICAgICRjaGFydC0+YWRkX3NlcmllcygpOworICAgICRjaGFydC0+c2V0X3hfYXhpcygpOworICAgICRjaGFydC0+c2V0X3lfYXhpcygpOworICAgICRjaGFydC0+c2V0X3RpdGxlKCk7CisKK1RoZXNlIG1ldGhvZHMgYXJlIGV4cGxhaW5lZCBpbiBkZXRhaWwgaW4gTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LiBDbGFzcyBzcGVjaWZpYyBtZXRob2RzIG9yIHNldHRpbmdzLCBpZiBhbnksIGFyZSBleHBsYWluZWQgYmVsb3cuCisKKz1oZWFkMSBTdG9jayBDaGFydCBNZXRob2RzCisKK1RoZXJlIGFyZW4ndCBjdXJyZW50bHkgYW55IHN0b2NrIGNoYXJ0IHNwZWNpZmljIG1ldGhvZHMuIFNlZSB0aGUgVE9ETyBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4KKworVGhlIGRlZmF1bHQgU3RvY2sgY2hhcnQgaXMgYW4gT3Blbi1IaWdoLUxvdy1DbG9zZSBjaGFydC4gQSBzZXJpZXMgbXVzdCBiZSBhZGRlZCBmb3IgZWFjaCBvZiB0aGVzZSBkYXRhIHNvdXJjZXMuCisKK1RoZSBkZWZhdWx0IFN0b2NrIGNoYXJ0IGlzIGluIGJsYWNrIGFuZCB3aGl0ZS4gVXNlciBkZWZpbmVkIGNvbG91cnMgd2lsbCBiZSBhZGRlZCBhdCBhIGxhdGVyIHN0YWdlLgorCis9aGVhZDEgRVhBTVBMRQorCitIZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBtb3N0IG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMgd2hlbiBjcmVhdGluZyBhIFN0b2NrIGNoYXJ0LgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9zdG9ja19leC54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCAgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKyAgICBteSAkZGF0ZV9mb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIG51bV9mb3JtYXQgPT4gJ2RkL21tL3l5eXknICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uCisgICAgbXkgJGhlYWRpbmdzID0gWyAnRGF0ZScsICdPcGVuJywgJ0hpZ2gnLCAnTG93JywgJ0Nsb3NlJyBdOworICAgIG15IEBkYXRhID0gKAorICAgICAgICBbICcyMDA5LTA4LTIzJywgMTEwLjc1LCAxMTMuNDgsIDEwOS4wNSwgMTA5LjQwIF0sCisgICAgICAgIFsgJzIwMDktMDgtMjQnLCAxMTEuMjQsIDExMS42MCwgMTAzLjU3LCAxMDQuODcgXSwKKyAgICAgICAgWyAnMjAwOS0wOC0yNScsIDEwNC45NiwgMTA4LjAwLCAxMDMuODgsIDEwNi4wMCBdLAorICAgICAgICBbICcyMDA5LTA4LTI2JywgMTA0Ljk1LCAxMDcuOTUsIDEwNC42NiwgMTA3LjkxIF0sCisgICAgICAgIFsgJzIwMDktMDgtMjcnLCAxMDguMTAsIDEwOC42MiwgMTA1LjY5LCAxMDYuMTUgXSwKKyAgICApOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKworICAgIG15ICRyb3cgPSAxOworICAgIGZvciBteSAkZGF0YSAoIEBkYXRhICkgeworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSggJHJvdywgMCwgJGRhdGEtPlswXSwgJGRhdGVfZm9ybWF0ICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCAxLCAkZGF0YS0+WzFdICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCAyLCAkZGF0YS0+WzJdICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCAzLCAkZGF0YS0+WzNdICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCA0LCAkZGF0YS0+WzRdICk7CisgICAgICAgICRyb3crKzsKKyAgICB9CisKKyAgICAjIENyZWF0ZSBhIG5ldyBjaGFydCBvYmplY3QuIEluIHRoaXMgY2FzZSBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnc3RvY2snLCBlbWJlZGRlZCA9PiAxICk7CisKKyAgICAjIEFkZCBhIHNlcmllcyBmb3IgZWFjaCBvZiB0aGUgT3Blbi1IaWdoLUxvdy1DbG9zZSBjb2x1bW5zLgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDYnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNicsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ09wZW4nLAorICAgICk7CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ2JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDYnLAorICAgICAgICBuYW1lICAgICAgID0+ICdIaWdoJywKKyAgICApOworCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNicsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEQkMjokRCQ2JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnTG93JywKKyAgICApOworCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNicsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEUkMjokRSQ2JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnQ2xvc2UnLAorICAgICk7CisKKyAgICAjIEFkZCBhIGNoYXJ0IHRpdGxlIGFuZCBzb21lIGF4aXMgbGFiZWxzLgorICAgICRjaGFydC0+c2V0X3RpdGxlKCBuYW1lID0+ICdPcGVuLUhpZ2gtTG93LUNsb3NlJywgKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ0RhdGUnLCApOworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2hhcmUgcHJpY2UnLCApOworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0YyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9zdG9jazEuanBnIiB3aWR0aD0iNTI3IiBoZWlnaHQ9IjMyMCIgYWx0PSJDaGFydCBleGFtcGxlLiIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvRXhhbXBsZXMucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0V4YW1wbGVzLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjk2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0V4YW1wbGVzLnBtCkBAIC0wLDAgKzEsMTA2MzggQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkV4YW1wbGVzOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEV4YW1wbGVzIC0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZXhhbXBsZXMuCisjCisjIEEgZG9jdW1lbnRhdGlvbiBvbmx5IG1vZHVsZSBzaG93aW5nIHRoZSBleGFtcGxlcyB0aGF0IGFyZQorIyBpbmNsdWRlZCBpbiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZGlzdHJpYnV0aW9uLiBUaGlzCisjIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgZ2VuX2V4YW1wbGVzX3BvZC5wbAorIyBwcm9ncmFtIHRoYXQgaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3VzZSBzdHJpY3Q7Cit1c2UgdmFycyBxdygkVkVSU0lPTik7CiskVkVSU0lPTiA9ICcyLjM3JzsKKworMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0V4YW1wbGVzIC0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZXhhbXBsZSBwcm9ncmFtcy4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgaXMgYSBkb2N1bWVudGF0aW9uIG9ubHkgbW9kdWxlIHNob3dpbmcgdGhlIGV4YW1wbGVzIHRoYXQgYXJlCitpbmNsdWRlZCBpbiB0aGUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4gZGlzdHJpYnV0aW9uLgorCitUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIHZpYSB0aGUgZ2VuX2V4YW1wbGVzX3BvZC5wbAorcHJvZ3JhbSB0aGF0IGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeS4KKworPWhlYWQxIEV4YW1wbGUgcHJvZ3JhbXMKKworVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgdGhlIDg1IGV4YW1wbGUgcHJvZ3JhbXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRpc3RyaWJ1dGlvbi4KKworPW92ZXIKKworPWl0ZW0gKiBMPEV4YW1wbGU6IGFfc2ltcGxlLnBsPiBBIGdldCBzdGFydGVkIGV4YW1wbGUgd2l0aCBzb21lIGJhc2ljIGZlYXR1cmVzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZGVtby5wbD4gQSBkZW1vIG9mIHNvbWUgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHJlZ2lvbnMucGw+IEEgc2ltcGxlIGV4YW1wbGUgb2YgbXVsdGlwbGUgd29ya3NoZWV0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHN0YXRzLnBsPiBCYXNpYyBmb3JtdWxhcyBhbmQgZnVuY3Rpb25zLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZm9ybWF0cy5wbD4gQWxsIHRoZSBhdmFpbGFibGUgZm9ybWF0dGluZyBvbiBzZXZlcmFsIHdvcmtzaGVldHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBidWdfcmVwb3J0LnBsPiBBIHRlbXBsYXRlIGZvciBzdWJtaXR0aW5nIGJ1ZyByZXBvcnRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogYXV0b2ZpbHRlci5wbD4gRXhhbXBsZXMgb2Ygd29ya3NoZWV0IGF1dG9maWx0ZXJzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogYXV0b2ZpdC5wbD4gU2ltdWxhdGUgRXhjZWwncyBhdXRvZml0IGZvciBjb2x1bW4gd2lkdGhzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogYmlnZmlsZS5wbD4gV3JpdGUgcGFzdCB0aGUgN01CIGxpbWl0IHdpdGggT0xFOjpTdG9yYWdlX0xpdGUuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjZ2kucGw+IEEgc2ltcGxlIENHSSBwcm9ncmFtLgorCis9aXRlbSAqIEw8RXhhbXBsZTogY2hhcnRfYXJlYS5wbD4gQSBkZW1vIG9mIGFyZWEgc3R5bGUgY2hhcnRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogY2hhcnRfYmFyLnBsPiBBIGRlbW8gb2YgYmFyICh2ZXJ0aWNhbCBoaXN0b2dyYW0pIHN0eWxlIGNoYXJ0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNoYXJ0X2NvbHVtbi5wbD4gQSBkZW1vIG9mIGNvbHVtbiAoaGlzdG9ncmFtKSBzdHlsZSBjaGFydHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjaGFydF9saW5lLnBsPiBBIGRlbW8gb2YgbGluZSBzdHlsZSBjaGFydHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjaGFydF9waWUucGw+IEEgZGVtbyBvZiBwaWUgc3R5bGUgY2hhcnRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogY2hhcnRfc2NhdHRlci5wbD4gQSBkZW1vIG9mIHNjYXR0ZXIgc3R5bGUgY2hhcnRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogY2hhcnRfc3RvY2sucGw+IEEgZGVtbyBvZiBzdG9jayBzdHlsZSBjaGFydHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjaGVzcy5wbD4gQW4gZXhhbXBsZSBvZiByZXVzaW5nIGZvcm1hdHRpbmcgdmlhIHByb3BlcnRpZXMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjb2xvcnMucGw+IEEgZGVtbyBvZiB0aGUgY29sb3VyIHBhbGV0dGUgYW5kIG5hbWVkIGNvbG91cnMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjb21tZW50czEucGw+IEFkZCBjb21tZW50cyB0byB3b3Jrc2hlZXQgY2VsbHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjb21tZW50czIucGw+IEFkZCBjb21tZW50cyB3aXRoIGFkdmFuY2VkIG9wdGlvbnMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjb3B5Zm9ybWF0LnBsPiBFeGFtcGxlIG9mIGNvcHlpbmcgYSBjZWxsIGZvcm1hdC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGRhdGFfdmFsaWRhdGUucGw+IEFuIGV4YW1wbGUgb2YgZGF0YSB2YWxpZGF0aW9uIGFuZCBkcm9wZG93biBsaXN0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGRhdGVfdGltZS5wbD4gV3JpdGUgZGF0ZXMgYW5kIHRpbWVzIHdpdGggd3JpdGVfZGF0ZV90aW1lKCkuCisKKz1pdGVtICogTDxFeGFtcGxlOiBkZWZpbmVkX25hbWUucGw+IEV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBkZWZpbmVkIG5hbWVzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZGlhZ19ib3JkZXIucGw+IEEgc2ltcGxlIGV4YW1wbGUgb2YgZGlhZ29uYWwgY2VsbCBib3JkZXJzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZWFzdGVyX2VnZy5wbD4gRXhwb3NlIHRoZSBFeGNlbDk3IGZsaWdodCBzaW11bGF0b3IuCisKKz1pdGVtICogTDxFeGFtcGxlOiBmaWxlaGFuZGxlLnBsPiBFeGFtcGxlcyBvZiB3b3JraW5nIHdpdGggZmlsZWhhbmRsZXMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBmb3JtdWxhX3Jlc3VsdC5wbD4gRm9ybXVsYXMgd2l0aCB1c2VyIHNwZWNpZmllZCByZXN1bHRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogaGVhZGVycy5wbD4gRXhhbXBsZXMgb2Ygd29ya3NoZWV0IGhlYWRlcnMgYW5kIGZvb3RlcnMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBoaWRlX3NoZWV0LnBsPiBTaW1wbGUgZXhhbXBsZSBvZiBoaWRpbmcgYSB3b3Jrc2hlZXQuCisKKz1pdGVtICogTDxFeGFtcGxlOiBoeXBlcmxpbmsxLnBsPiBTaG93cyBob3cgdG8gY3JlYXRlIHdlYiBoeXBlcmxpbmtzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogaHlwZXJsaW5rMi5wbD4gRXhhbXBsZXMgb2YgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGh5cGVybGlua3MuCisKKz1pdGVtICogTDxFeGFtcGxlOiBpbWFnZXMucGw+IEFkZGluZyBpbWFnZXMgdG8gd29ya3NoZWV0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGluZGVudC5wbD4gQW4gZXhhbXBsZSBvZiBjZWxsIGluZGVudGF0aW9uLgorCis9aXRlbSAqIEw8RXhhbXBsZTogbWVyZ2UxLnBsPiBBIHNpbXBsZSBleGFtcGxlIG9mIGNlbGwgbWVyZ2luZy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IG1lcmdlMi5wbD4gQSBzaW1wbGUgZXhhbXBsZSBvZiBjZWxsIG1lcmdpbmcgd2l0aCBmb3JtYXR0aW5nLgorCis9aXRlbSAqIEw8RXhhbXBsZTogbWVyZ2UzLnBsPiBBZGQgaHlwZXJsaW5rcyB0byBtZXJnZWQgY2VsbHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBtZXJnZTQucGw+IEFuIGFkdmFuY2VkIGV4YW1wbGUgb2YgbWVyZ2luZyB3aXRoIGZvcm1hdHRpbmcuCisKKz1pdGVtICogTDxFeGFtcGxlOiBtZXJnZTUucGw+IEFuIGFkdmFuY2VkIGV4YW1wbGUgb2YgbWVyZ2luZyB3aXRoIGZvcm1hdHRpbmcuCisKKz1pdGVtICogTDxFeGFtcGxlOiBtZXJnZTYucGw+IEFuIGV4YW1wbGUgb2YgbWVyZ2luZyB3aXRoIFVuaWNvZGUgc3RyaW5ncy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IG1vZF9wZXJsMS5wbD4gQSBzaW1wbGUgbW9kX3BlcmwgMSBwcm9ncmFtLgorCis9aXRlbSAqIEw8RXhhbXBsZTogbW9kX3BlcmwyLnBsPiBBIHNpbXBsZSBtb2RfcGVybCAyIHByb2dyYW0uCisKKz1pdGVtICogTDxFeGFtcGxlOiBvdXRsaW5lLnBsPiBBbiBleGFtcGxlIG9mIG91dGxpbmVzIGFuZCBncm91cGluZy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IG91dGxpbmVfY29sbGFwc2VkLnBsPiBBbiBleGFtcGxlIG9mIGNvbGxhcHNlZCBvdXRsaW5lcy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHBhbmVzLnBsPiBBbiBleGFtcGxlcyBvZiBob3cgdG8gY3JlYXRlIHBhbmVzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogcHJvcGVydGllcy5wbD4gQWRkIGRvY3VtZW50IHByb3BlcnRpZXMgdG8gYSB3b3JrYm9vay4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHByb3RlY3Rpb24ucGw+IEV4YW1wbGUgb2YgY2VsbCBsb2NraW5nIGFuZCBmb3JtdWxhIGhpZGluZy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHJlcGVhdC5wbD4gRXhhbXBsZSBvZiB3cml0aW5nIHJlcGVhdGVkIGZvcm11bGFzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogcmlnaHRfdG9fbGVmdC5wbD4gQ2hhbmdlIGRlZmF1bHQgc2hlZXQgZGlyZWN0aW9uIHRvIHJpZ2h0IHRvIGxlZnQuCisKKz1pdGVtICogTDxFeGFtcGxlOiByb3dfd3JhcC5wbD4gSG93IHRvIHdyYXAgZGF0YSBmcm9tIG9uZSB3b3Jrc2hlZXQgb250byBhbm90aGVyLgorCis9aXRlbSAqIEw8RXhhbXBsZTogc2FsZXMucGw+IEFuIGV4YW1wbGUgb2YgYSBzaW1wbGUgc2FsZXMgc3ByZWFkc2hlZXQuCisKKz1pdGVtICogTDxFeGFtcGxlOiBzZW5kbWFpbC5wbD4gU2VuZCBhbiBFeGNlbCBlbWFpbCBhdHRhY2htZW50IHVzaW5nIE1haWw6OlNlbmRlci4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHN0YXRzX2V4dC5wbD4gU2FtZSBhcyBzdGF0cy5wbCB3aXRoIGV4dGVybmFsIHJlZmVyZW5jZXMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBzdG9ja3MucGw+IERlbW9uc3RyYXRlcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nLgorCis9aXRlbSAqIEw8RXhhbXBsZTogdGFiX2NvbG9ycy5wbD4gRXhhbXBsZSBvZiBob3cgdG8gc2V0IHdvcmtzaGVldCB0YWIgY29sb3Vycy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHRleHR3cmFwLnBsPiBEZW1vbnN0cmF0ZXMgdGV4dCB3cmFwcGluZyBvcHRpb25zLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd2luMzJvbGUucGw+IEEgc2FtcGxlIFdpbjMyOjpPTEUgZXhhbXBsZSBmb3IgY29tcGFyaXNvbi4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHdyaXRlX2FycmF5cy5wbD4gRXhhbXBsZSBvZiB3cml0aW5nIDFEIG9yIDJEIGFycmF5cyBvZiBkYXRhLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVfaGFuZGxlcjEucGw+IEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAxLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVfaGFuZGxlcjIucGw+IEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAyLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVfaGFuZGxlcjMucGw+IEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVfaGFuZGxlcjQucGw+IEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCA0LgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVfdG9fc2NhbGFyLnBsPiBFeGFtcGxlIG9mIHdyaXRpbmcgYW4gRXhjZWwgZmlsZSB0byBhIFBlcmwgc2NhbGFyLgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV91dGYxNi5wbD4gU2ltcGxlIGV4YW1wbGUgb2YgdXNpbmcgVW5pY29kZSBVVEYxNiBzdHJpbmdzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV91dGYxNl9qYXBhbi5wbD4gV3JpdGUgSmFwYW5lc2UgVW5pY29kZSBzdHJpbmdzIHVzaW5nIFVURi0xNi4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfY3lyaWxsaWMucGw+IFdyaXRlIFJ1c3NpYW4gQ3lyaWxsaWMgc3RyaW5ncyB1c2luZyBVVEYtOC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfbGlzdC5wbD4gTGlzdCB0aGUgY2hhcnMgaW4gYSBVbmljb2RlIGZvbnQuCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlXzIwMjJfanAucGw+IEphcGFuZXNlOiBJU08tMjAyMi1KUCB0byB1dGY4IGluIHBlcmwgNS44LgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV84ODU5XzExLnBsPiBUaGFpOiAgICAgSVNPLTg4NTlfMTEgdG8gdXRmOCBpbiBwZXJsIDUuOC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfODg1OV83LnBsPiBHcmVlazogICAgSVNPLTg4NTlfNyAgdG8gdXRmOCBpbiBwZXJsIDUuOC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfYmlnNS5wbD4gQ2hpbmVzZTogIEJJRzUgICAgICAgIHRvIHV0ZjggaW4gcGVybCA1LjguCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlX2NwMTI1MS5wbD4gUnVzc2lhbjogIENQMTI1MSAgICAgIHRvIHV0ZjggaW4gcGVybCA1LjguCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlX2NwMTI1Ni5wbD4gQXJhYmljOiAgIENQMTI1NiAgICAgIHRvIHV0ZjggaW4gcGVybCA1LjguCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlX2tvaThyLnBsPiBSdXNzaWFuOiAgS09JOC1SICAgICAgdG8gdXRmOCBpbiBwZXJsIDUuOC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfcG9saXNoX3V0ZjgucGw+IFBvbGlzaCA6ICBVVEY4ICAgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV9zaGlmdF9qaXMucGw+IEphcGFuZXNlOiBTaGlmdCBKSVMgICB0byB1dGY4IGluIHBlcmwgNS44LgorCis9aXRlbSAqIEw8RXhhbXBsZTogY3N2Mnhscy5wbD4gUHJvZ3JhbSB0byBjb252ZXJ0IGEgQ1NWIGZpbGUgdG8gYW4gRXhjZWwgZmlsZS4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHRhYjJ4bHMucGw+IFByb2dyYW0gdG8gY29udmVydCBhIHRhYiBzZXBhcmF0ZWQgZmlsZSB0byB4bHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBkYXRlY2FsYzEucGw+IENvbnZlcnQgVW5peC9QZXJsIHRpbWUgdG8gRXhjZWwgdGltZS4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGRhdGVjYWxjMi5wbD4gQ2FsY3VsYXRlIGFuIEV4Y2VsIGRhdGUgdXNpbmcgRGF0ZTo6Q2FsYy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGxlY3hlLnBsPiBDb252ZXJ0IEV4Y2VsIHRvIFdyaXRlRXhjZWwgdXNpbmcgV2luMzI6Ok9MRS4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNvbnZlcnRBMS5wbD4gSGVscGVyIGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIEExIG5vdGF0aW9uLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZnVuY3Rpb25fbG9jYWxlLnBsPiBBZGQgbm9uLUVuZ2xpc2ggZnVuY3Rpb24gbmFtZXMgdG8gRm9ybXVsYS5wbS4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHdyaXRlQTEucGw+IEV4YW1wbGUgb2YgaG93IHRvIGV4dGVuZCB0aGUgbW9kdWxlLgorCis9YmFjaworCis9aGVhZDIgRXhhbXBsZTogYV9zaW1wbGUucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHRvIHdyaXRlCitzb21lICB0ZXh0IGFuZCBudW1iZXJzIHRvIGFuIEV4Y2VsIGJpbmFyeSBmaWxlLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9hX3NpbXBsZS5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGFfc2ltcGxlLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8gd3JpdGUKKyAgICAjIHNvbWUgIHRleHQgYW5kIG51bWJlcnMgdG8gYW4gRXhjZWwgYmluYXJ5IGZpbGUuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgY2FsbGVkIHNpbXBsZS54bHMgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdhX3NpbXBsZS54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBUaGUgZ2VuZXJhbCBzeW50YXggaXMgd3JpdGUoJHJvdywgJGNvbHVtbiwgJHRva2VuKS4gTm90ZSB0aGF0IHJvdyBhbmQKKyAgICAjIGNvbHVtbiBhcmUgemVybyBpbmRleGVkCisgICAgIworICAgIAorICAgICMgV3JpdGUgc29tZSB0ZXh0CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgICJIaSBFeGNlbCEiKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgbnVtYmVycworICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDAsICAzKTsgICAgICAgICAgIyBXcml0ZXMgMworICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDAsICAzLjAwMDAwKTsgICAgIyBXcml0ZXMgMworICAgICR3b3Jrc2hlZXQtPndyaXRlKDQsIDAsICAzLjAwMDAxKTsgICAgIyBXcml0ZXMgMy4wMDAwMQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsIDAsICAzLjE0MTU5KTsgICAgIyBUZVggcmV2aXNpb24gbm8uPworICAgIAorICAgIAorICAgICMgV3JpdGUgc29tZSBmb3JtdWxhcworICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsIDAsICAnPUEzICsgQTYnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg4LCAwLCAgJz1JRihBNT4zLCJZZXMiLCAiTm8iKScpOworICAgIAorICAgIAorICAgICMgV3JpdGUgYSBoeXBlcmxpbmsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxMCwgMCwgJ2h0dHA6Ly93d3cucGVybC5jb20vJyk7CisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9hX3NpbXBsZS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGRlbW8ucGwKKworCisKK0Egc2ltcGxlIGRlbW8gb2Ygc29tZSBvZiB0aGUgZmVhdHVyZXMgb2YgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK1RoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvamVjdCBzY3JlZW5zaG90IGZvciBGcmVzaG1lYXQ6CitMPGh0dHA6Ly9mcmVzaG1lYXQubmV0L3Byb2plY3RzL3dyaXRlZXhjZWwvPgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9kZW1vLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gZGVtby5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBkZW1vIG9mIHNvbWUgb2YgdGhlIGZlYXR1cmVzIG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorICAgICMKKyAgICAjIFRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvamVjdCBzY3JlZW5zaG90IGZvciBGcmVzaG1lYXQ6CisgICAgIyBMPGh0dHA6Ly9mcmVzaG1lYXQubmV0L3Byb2plY3RzL3dyaXRlZXhjZWwvPgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgT2N0b2JlciAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJkZW1vLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdEZW1vJyk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0Fub3RoZXIgc2hlZXQnKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnQW5kIGFub3RoZXInKTsKKyAgICAKKyAgICBteSAkYm9sZCAgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChib2xkID0+IDEpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgV3JpdGUgYSBnZW5lcmFsIGhlYWRpbmcKKyAgICAjCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgMzYsICRib2xkKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkInLCAyMCAgICAgICApOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3cgICAoMCwgICAgIDQwICAgICAgICk7CisgICAgCisgICAgbXkgJGhlYWRpbmcgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgPT4gJ2JsdWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICAgID0+IDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZSAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICA9PiAndmNlbnRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgbXkgQGhlYWRpbmdzID0gKCdGZWF0dXJlcyBvZiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCcsICcnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9yb3coJ0ExJywgXEBoZWFkaW5ncywgJGhlYWRpbmcpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU29tZSB0ZXh0IGV4YW1wbGVzCisgICAgIworICAgIG15ICR0ZXh0X2Zvcm1hdCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGFsaWMgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgICA9PiAxOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgICAgPT4nTHVjaWRhIENhbGxpZ3JhcGh5JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgICMgQSBwaHJhc2UgaW4gQ3lyaWxsaWMKKyAgICBteSAkdW5pY29kZSA9IHBhY2sgIkgqIiwgIjA0MmQwNDQyMDQzZTAwMjAwNDQ0MDQ0MDA0MzAwNDM3MDQzMDAwMjAwNCIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzZDA0MzAwMDIwMDQ0MDA0NDMwNDQxMDQ0MTA0M2EwNDNlMDQzYzAwMjEiOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICJUZXh0Iik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IyJywgIkhlbGxvIEV4Y2VsIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgIkZvcm1hdHRlZCB0ZXh0Iik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IzJywgIkhlbGxvIEV4Y2VsIiwgJHRleHRfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTQnLCAiVW5pY29kZSB0ZXh0Iik7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJ0I0JywgJHVuaWNvZGUpOworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU29tZSBudW1lcmljIGV4YW1wbGVzCisgICAgIworICAgIG15ICRudW0xX2Zvcm1hdCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnJCMsIyMwLjAwJyk7CisgICAgbXkgJG51bTJfZm9ybWF0ICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICcgZCBtbW1tIHl5eScpOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNScsICJOdW1iZXJzIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I1JywgMTIzNC41Nik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E2JywgIkZvcm1hdHRlZCBudW1iZXJzIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I2JywgMTIzNC41NiwgJG51bTFfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTcnLCAiRm9ybWF0dGVkIG51bWJlcnMiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjcnLCAzNzI1NywgJG51bTJfZm9ybWF0KTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEZvcm11bGFlCisgICAgIworICAgICR3b3Jrc2hlZXQtPnNldF9zZWxlY3Rpb24oJ0I4Jyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E4JywgJ0Zvcm11bGFzIGFuZCBmdW5jdGlvbnMsICI9U0lOKFBJKCkvNCkiJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I4JywgJz1TSU4oUEkoKS80KScpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgSHlwZXJsaW5rcworICAgICMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTknLCAiSHlwZXJsaW5rcyIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCOScsICAnaHR0cDovL3d3dy5wZXJsLmNvbS8nICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBJbWFnZXMKKyAgICAjCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExMCcsICJJbWFnZXMiKTsKKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfaW1hZ2UoJ0IxMCcsICdyZXB1YmxpYy5wbmcnLCAxNiwgOCk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBNaXNjCisgICAgIworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTgnLCAiUGFnZS9wcmludGVyIHNldHVwIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExOScsICJNdWx0aXBsZSB3b3Jrc2hlZXRzIik7CisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9kZW1vLnBsPgorCis9aGVhZDIgRXhhbXBsZTogcmVnaW9ucy5wbAorCisKKworQW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDpXcml0ZUV4Y2VsIG1vZHVsZSB0byB3cml0ZSBhIGJhc2ljCitFeGNlbCB3b3JrYm9vayB3aXRoIG11bHRpcGxlIHdvcmtzaGVldHMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3JlZ2lvbnMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSByZWdpb25zLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDpXcml0ZUV4Y2VsIG1vZHVsZSB0byB3cml0ZSBhIGJhc2ljCisgICAgIyBFeGNlbCB3b3JrYm9vayB3aXRoIG11bHRpcGxlIHdvcmtzaGVldHMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgRXhjZWwgd29ya2Jvb2sKKyAgICBteSAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJyZWdpb25zLnhscyIpOworICAgIAorICAgICMgQWRkIHNvbWUgd29ya3NoZWV0cworICAgIG15ICRub3J0aCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgiTm9ydGgiKTsKKyAgICBteSAkc291dGggPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoIlNvdXRoIik7CisgICAgbXkgJGVhc3QgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCJFYXN0Iik7CisgICAgbXkgJHdlc3QgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCJXZXN0Iik7CisgICAgCisgICAgIyBBZGQgYSBGb3JtYXQKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2JvbGQoKTsKKyAgICAkZm9ybWF0LT5zZXRfY29sb3IoJ2JsdWUnKTsKKyAgICAKKyAgICAjIEFkZCBhIGNhcHRpb24gdG8gZWFjaCB3b3Jrc2hlZXQKKyAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKCR3b3JrYm9vay0+c2hlZXRzKCkpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIlNhbGVzIiwgJGZvcm1hdCk7CisgICAgfQorICAgIAorICAgICMgV3JpdGUgc29tZSBkYXRhCisgICAgJG5vcnRoLT53cml0ZSgwLCAxLCAyMDAwMDApOworICAgICRzb3V0aC0+d3JpdGUoMCwgMSwgMTAwMDAwKTsKKyAgICAkZWFzdC0+d3JpdGUgKDAsIDEsIDE1MDAwMCk7CisgICAgJHdlc3QtPndyaXRlICgwLCAxLCAxMDAwMDApOworICAgIAorICAgICMgU2V0IHRoZSBhY3RpdmUgd29ya3NoZWV0CisgICAgJHNvdXRoLT5hY3RpdmF0ZSgpOworICAgIAorICAgICMgU2V0IHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgY29sdW1uCisgICAgJHNvdXRoLT5zZXRfY29sdW1uKDAsIDAsIDIwKTsKKyAgICAKKyAgICAjIFNldCB0aGUgYWN0aXZlIGNlbGwKKyAgICAkc291dGgtPnNldF9zZWxlY3Rpb24oMCwgMSk7CisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3JlZ2lvbnMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBzdGF0cy5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZ1bmN0aW9ucyB3aXRoIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorbW9kdWxlLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9zdGF0cy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHN0YXRzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZ1bmN0aW9ucyB3aXRoIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorICAgICMgbW9kdWxlLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygic3RhdHMueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnVGVzdCBkYXRhJyk7CisgICAgCisgICAgIyBTZXQgdGhlIGNvbHVtbiB3aWR0aCBmb3IgY29sdW1ucyAxCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAwLCAyMCk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBoZWFkaW5ncworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworICAgIAorICAgIAorICAgICMgV3JpdGUgdGhlIHNhbXBsZSBkYXRhCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgJ1NhbXBsZScsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsIDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDIsIDIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsIDMpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDQsIDQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDUsIDUpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDYsIDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDcsIDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDgsIDgpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDAsICdMZW5ndGgnLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAxLCAyNS40KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAyLCAyNS40KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAzLCAyNC44KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA0LCAyNS4wKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA1LCAyNS4zKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA2LCAyNC45KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA3LCAyNS4yKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA4LCAyNC44KTsKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgc3RhdGlzdGljYWwgZnVuY3Rpb25zCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgIDAsICdDb3VudCcsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDQsICAxLCAnPUNPVU5UKEIxOkkxKScpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsICAwLCAnU3VtJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgIDEsICc9U1VNKEIyOkkyKScpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsICAwLCAnQXZlcmFnZScsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsICAxLCAnPUFWRVJBR0UoQjI6STIpJyk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNywgIDAsICdNaW4nLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg3LCAgMSwgJz1NSU4oQjI6STIpJyk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoOCwgIDAsICdNYXgnLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg4LCAgMSwgJz1NQVgoQjI6STIpJyk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoOSwgIDAsICdTdGFuZGFyZCBEZXZpYXRpb24nLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg5LCAgMSwgJz1TVERFVihCMjpJMiknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxMCwgMCwgJ0t1cnRvc2lzJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMTAsIDEsICc9S1VSVChCMjpJMiknKTsKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3N0YXRzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZm9ybWF0cy5wbAorCisKKworRXhhbXBsZXMgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgorCitUaGlzIHByb2dyYW0gZGVtb25zdHJhdGVzIGFsbW9zdCBhbGwgcG9zc2libGUgZm9ybWF0dGluZyBvcHRpb25zLiBJdCBpcyB3b3J0aAorcnVubmluZyB0aGlzIHByb2dyYW0gYW5kIHZpZXdpbmcgdGhlIG91dHB1dCBFeGNlbCBmaWxlIGlmIHlvdSBhcmUgaW50ZXJlc3RlZAoraW4gdGhlIHZhcmlvdXMgZm9ybWF0dGluZyBwb3NzaWJpbGl0aWVzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9mb3JtYXRzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gZm9ybWF0cy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGVzIG9mIGZvcm1hdHRpbmcgdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZS4KKyAgICAjCisgICAgIyBUaGlzIHByb2dyYW0gZGVtb25zdHJhdGVzIGFsbW9zdCBhbGwgcG9zc2libGUgZm9ybWF0dGluZyBvcHRpb25zLiBJdCBpcyB3b3J0aAorICAgICMgcnVubmluZyB0aGlzIHByb2dyYW0gYW5kIHZpZXdpbmcgdGhlIG91dHB1dCBFeGNlbCBmaWxlIGlmIHlvdSBhcmUgaW50ZXJlc3RlZAorICAgICMgaW4gdGhlIHZhcmlvdXMgZm9ybWF0dGluZyBwb3NzaWJpbGl0aWVzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdmb3JtYXRzLnhscycpOworICAgIAorICAgICMgU29tZSBjb21tb24gZm9ybWF0cworICAgIG15ICRjZW50ZXIgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGFsaWduID0+ICdjZW50ZXInKTsKKyAgICBteSAkaGVhZGluZyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChhbGlnbiA9PiAnY2VudGVyJywgYm9sZCA9PiAxKTsKKyAgICAKKyAgICAjIFRoZSBuYW1lZCBjb2xvcnMKKyAgICBteSAlY29sb3JzID0gKAorICAgICAgICAgICAgICAgICAgICAweDA4LCAnYmxhY2snLAorICAgICAgICAgICAgICAgICAgICAweDBDLCAnYmx1ZScsCisgICAgICAgICAgICAgICAgICAgIDB4MTAsICdicm93bicsCisgICAgICAgICAgICAgICAgICAgIDB4MEYsICdjeWFuJywKKyAgICAgICAgICAgICAgICAgICAgMHgxNywgJ2dyYXknLAorICAgICAgICAgICAgICAgICAgICAweDExLCAnZ3JlZW4nLAorICAgICAgICAgICAgICAgICAgICAweDBCLCAnbGltZScsCisgICAgICAgICAgICAgICAgICAgIDB4MEUsICdtYWdlbnRhJywKKyAgICAgICAgICAgICAgICAgICAgMHgxMiwgJ25hdnknLAorICAgICAgICAgICAgICAgICAgICAweDM1LCAnb3JhbmdlJywKKyAgICAgICAgICAgICAgICAgICAgMHgyMSwgJ3BpbmsnLAorICAgICAgICAgICAgICAgICAgICAweDE0LCAncHVycGxlJywKKyAgICAgICAgICAgICAgICAgICAgMHgwQSwgJ3JlZCcsCisgICAgICAgICAgICAgICAgICAgIDB4MTYsICdzaWx2ZXInLAorICAgICAgICAgICAgICAgICAgICAweDA5LCAnd2hpdGUnLAorICAgICAgICAgICAgICAgICAgICAweDBELCAneWVsbG93JywKKyAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAjIENhbGwgdGhlc2Ugc3Vicm91dGluZXMgdG8gZGVtb25zdHJhdGUgZGlmZmVyZW50IGZvcm1hdHRpbmcgb3B0aW9ucworICAgIGludHJvKCk7CisgICAgZm9udHMoKTsKKyAgICBuYW1lZF9jb2xvcnMoKTsKKyAgICBzdGFuZGFyZF9jb2xvcnMoKTsKKyAgICBudW1lcmljX2Zvcm1hdHMoKTsKKyAgICBib3JkZXJzKCk7CisgICAgcGF0dGVybnMoKTsKKyAgICBhbGlnbm1lbnQoKTsKKyAgICBtaXNjKCk7CisgICAgCisgICAgIyBOb3RlOiB0aGlzIGlzIHJlcXVpcmVkCisgICAgJHdvcmtib29rLT5jbG9zZSgpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBJbnRyby4KKyAgICAjCisgICAgc3ViIGludHJvIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnSW50cm9kdWN0aW9uJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgNjApOworICAgIAorICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgICAgICRmb3JtYXQtPnNldF9zaXplKDE0KTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgICAgICRmb3JtYXQtPnNldF9hbGlnbignY2VudGVyJyk7CisgICAgCisgICAgICAgIG15ICRmb3JtYXQyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgICRmb3JtYXQyLT5zZXRfYm9sZCgpOworICAgICAgICAkZm9ybWF0Mi0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDAsICdUaGlzIHdvcmtib29rIGRlbW9uc3RyYXRlcyBzb21lIG9mJywgICRmb3JtYXQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAwLCAndGhlIGZvcm1hdHRpbmcgb3B0aW9ucyBwcm92aWRlZCBieScsICAkZm9ybWF0KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgMCwgJ3RoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuJywgJGZvcm1hdCk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNycsICAnU2VjdGlvbnM6JywgJGZvcm1hdDIpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTgnLCAgImludGVybmFsOkZvbnRzIUExIiwgICAgICAgICAgICAgJ0ZvbnRzJyAgICAgICAgICApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTknLCAgImludGVybmFsOidOYW1lZCBjb2xvcnMnIUExIiwgICAgJ05hbWVkIGNvbG9ycycgICApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEwJywgImludGVybmFsOidTdGFuZGFyZCBjb2xvcnMnIUExIiwgJ1N0YW5kYXJkIGNvbG9ycycpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTExJywgImludGVybmFsOidOdW1lcmljIGZvcm1hdHMnIUExIiwgJ051bWVyaWMgZm9ybWF0cycpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEyJywgImludGVybmFsOkJvcmRlcnMhQTEiLCAgICAgICAgICAgJ0JvcmRlcnMnICAgICAgICApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEzJywgImludGVybmFsOlBhdHRlcm5zIUExIiwgICAgICAgICAgJ1BhdHRlcm5zJyAgICAgICApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTE0JywgImludGVybmFsOkFsaWdubWVudCFBMSIsICAgICAgICAgJ0FsaWdubWVudCcgICAgICApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTE1JywgImludGVybmFsOk1pc2NlbGxhbmVvdXMhQTEiLCAgICAgJ01pc2NlbGxhbmVvdXMnICApOworICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIG5hbWVkIGNvbG9ycy4KKyAgICAjCisgICAgc3ViIG5hbWVkX2NvbG9ycyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ05hbWVkIGNvbG9ycycpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsIDMsIDE1KTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDIsICJOYW1lIiwgICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMywgIkNvbG9yIiwgJGhlYWRpbmcpOworICAgIAorICAgICAgICBteSAkaSA9IDE7CisgICAgCisgICAgICAgIHdoaWxlIChteSgkaW5kZXgsICRjb2xvcikgPSBlYWNoICVjb2xvcnMpIHsKKyAgICAgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ19jb2xvciA9PiAkY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgPT4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpKzEsIDAsICRpbmRleCwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGkrMSwgMSwgc3ByaW50ZigiMHglMDJYIiwgJGluZGV4KSwgJGNlbnRlcik7CisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkaSsxLCAyLCAkY29sb3IsICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpKzEsIDMsICcnLCAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQpOworICAgICAgICAgICAgJGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIHN0YW5kYXJkIEV4Y2VsIGNvbG9ycyBpbiB0aGUgcmFuZ2UgOC4uNjMuCisgICAgIworICAgIHN1YiBzdGFuZGFyZF9jb2xvcnMgeworICAgIAorICAgICAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdTdGFuZGFyZCBjb2xvcnMnKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAzLCAxNSk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICJJbmRleCIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMSwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAyLCAiQ29sb3IiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICJOYW1lIiwgICRoZWFkaW5nKTsKKyAgICAKKyAgICAgICAgZm9yIG15ICRpICg4Li42MykgeworICAgICAgICAgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnX2NvbG9yID0+ICRpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgID0+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoJGkgLTcpLCAwLCAkaSwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKCRpIC03KSwgMSwgc3ByaW50ZigiMHglMDJYIiwgJGkpLCAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCgkaSAtNyksIDIsICcnLCAgICAgICAgICAgICAgICAgICAgJGZvcm1hdCk7CisgICAgCisgICAgICAgICAgICAjIEFkZCB0aGUgIGNvbG9yIG5hbWVzCisgICAgICAgICAgICBpZiAoZXhpc3RzICRjb2xvcnN7JGl9KSB7CisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKCRpIC03KSwgMywgJGNvbG9yc3skaX0sICRjZW50ZXIpOworICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBEZW1vbnN0cmF0ZSB0aGUgc3RhbmRhcmQgbnVtZXJpYyBmb3JtYXRzLgorICAgICMKKyAgICBzdWIgbnVtZXJpY19mb3JtYXRzIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnTnVtZXJpYyBmb3JtYXRzJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgNCwgMTUpOworICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDUsIDUsIDQ1KTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkluZGV4IiwgICAgICAgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAiSW5kZXgiLCAgICAgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDIsICJVbmZvcm1hdHRlZCIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMywgIkZvcm1hdHRlZCIsICAgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA0LCAiTmVnYXRpdmUiLCAgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDUsICJGb3JtYXQiLCAgICAgICRoZWFkaW5nKTsKKyAgICAKKyAgICAgICAgbXkgQGZvcm1hdHM7CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwMCwgMTIzNC41NjcsICAgMCwgICAgICAgICAnR2VuZXJhbCcgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDAxLCAxMjM0LjU2NywgICAwLCAgICAgICAgICcwJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MDIsIDEyMzQuNTY3LCAgIDAsICAgICAgICAgJzAuMDAnIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwMywgMTIzNC41NjcsICAgMCwgICAgICAgICAnIywjIzAnIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwNCwgMTIzNC41NjcsICAgMCwgICAgICAgICAnIywjIzAuMDAnIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwNSwgMTIzNC41NjcsICAgLTEyMzQuNTY3LCAnKCQjLCMjMF8pOygkIywjIzApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MDYsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJygkIywjIzBfKTtbUmVkXSgkIywjIzApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MDcsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJygkIywjIzAuMDBfKTsoJCMsIyMwLjAwKScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDA4LCAxMjM0LjU2NywgICAtMTIzNC41NjcsICcoJCMsIyMwLjAwXyk7W1JlZF0oJCMsIyMwLjAwKScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDA5LCAwLjU2NywgICAgICAwLCAgICAgICAgICcwJScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDBhLCAwLjU2NywgICAgICAwLCAgICAgICAgICcwLjAwJScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDBiLCAxMjM0LjU2NywgICAwLCAgICAgICAgICcwLjAwRSswMCcgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDBjLCAwLjc1LCAgICAgICAwLCAgICAgICAgICcjID8vPycgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDBkLCAwLjMxMjUsICAgICAwLCAgICAgICAgICcjID8/Lz8/JyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MGUsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ20vZC95eScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDBmLCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdkLW1tbS15eScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDEwLCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdkLW1tbScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDExLCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdtbW0teXknIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgxMiwgMzY4OTIuNTIxLCAgMCwgICAgICAgICAnaDptbSBBTS9QTScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDEzLCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdoOm1tOnNzIEFNL1BNJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MTQsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ2g6bW0nIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgxNSwgMzY4OTIuNTIxLCAgMCwgICAgICAgICAnaDptbTpzcycgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDE2LCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdtL2QveXkgaDptbScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDI1LCAxMjM0LjU2NywgICAtMTIzNC41NjcsICcoIywjIzBfKTsoIywjIzApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MjYsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJygjLCMjMF8pO1tSZWRdKCMsIyMwKScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDI3LCAxMjM0LjU2NywgICAtMTIzNC41NjcsICcoIywjIzAuMDBfKTsoIywjIzAuMDApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MjgsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJygjLCMjMC4wMF8pO1tSZWRdKCMsIyMwLjAwKScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDI5LCAxMjM0LjU2NywgICAtMTIzNC41NjcsICdfKCogIywjIzBfKTtfKCogKCMsIyMwKTtfKCogIi0iXyk7XyhAXyknIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgyYSwgMTIzNC41NjcsICAgLTEyMzQuNTY3LCAnXygkKiAjLCMjMF8pO18oJCogKCMsIyMwKTtfKCQqICItIl8pO18oQF8pJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MmIsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJ18oKiAjLCMjMC4wMF8pO18oKiAoIywjIzAuMDApO18oKiAiLSI/P18pO18oQF8pJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MmMsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJ18oJCogIywjIzAuMDBfKTtfKCQqICgjLCMjMC4wMCk7XygkKiAiLSI/P18pO18oQF8pJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MmQsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ21tOnNzJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MmUsIDMuMDE1MywgICAgIDAsICAgICAgICAgJ1toXTptbTpzcycgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDJmLCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdtbTpzcy4wJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MzAsIDEyMzQuNTY3LCAgIDAsICAgICAgICAgJyMjMC4wRSswJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MzEsIDEyMzQuNTY3LCAgIDAsICAgICAgICAgJ0AnIF07CisgICAgCisgICAgICAgIG15ICRpOworICAgICAgICBmb3JlYWNoIG15ICRmb3JtYXQgKEBmb3JtYXRzKXsKKyAgICAgICAgICAgIG15ICRzdHlsZSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICAgICAgJHN0eWxlLT5zZXRfbnVtX2Zvcm1hdCgkZm9ybWF0LT5bMF0pOworICAgIAorICAgICAgICAgICAgJGkrKzsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAwLCAkZm9ybWF0LT5bMF0sICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAxLCBzcHJpbnRmKCIweCUwMlgiLCAkZm9ybWF0LT5bMF0pLCAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAyLCAkZm9ybWF0LT5bMV0sICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAzLCAkZm9ybWF0LT5bMV0sICAgICAgICAgICAgICAgICAgICAkc3R5bGUpOworICAgIAorICAgICAgICAgICAgaWYgKCRmb3JtYXQtPlsyXSkgeworICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCA0LCAkZm9ybWF0LT5bMl0sICRzdHlsZSk7CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJGksIDUsICRmb3JtYXQtPlszXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIERlbW9uc3RyYXRlIHRoZSBmb250IG9wdGlvbnMuCisgICAgIworICAgIHN1YiBmb250cyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0ZvbnRzJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgMzApOworICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDEsIDEsIDEwKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkZvbnQgbmFtZSIsICAgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAiRm9udCBzaXplIiwgICAkaGVhZGluZyk7CisgICAgCisgICAgICAgIG15IEBmb250czsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTAsICdBcmlhbCcgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdBcmlhbCcgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTQsICdBcmlhbCcgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdBcmlhbCBCbGFjaycgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdBcmlhbCBOYXJyb3cnIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnQ2VudHVyeSBTY2hvb2xib29rJyBdOworICAgICAgICBwdXNoIEBmb250cywgWyAxMiwgJ0NvdXJpZXInIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnQ291cmllciBOZXcnIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnR2FyYW1vbmQnIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnSW1wYWN0JyBdOworICAgICAgICBwdXNoIEBmb250cywgWyAxMiwgJ0x1Y2lkYSBIYW5kd3JpdGluZyddIDsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdUaW1lcyBOZXcgUm9tYW4nIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnU3ltYm9sJyBdOworICAgICAgICBwdXNoIEBmb250cywgWyAxMiwgJ1dpbmdkaW5ncycgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdBIGZvbnQgdGhhdCBkb2VzblwndCBleGlzdCcgXTsKKyAgICAKKyAgICAgICAgbXkgJGk7CisgICAgICAgIGZvcmVhY2ggbXkgJGZvbnQgKEBmb250cyl7CisgICAgICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgCisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfc2l6ZSgkZm9udC0+WzBdKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9mb250KCRmb250LT5bMV0pOworICAgIAorICAgICAgICAgICAgJGkrKzsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAwLCAkZm9udC0+WzFdLCAkZm9ybWF0KTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAxLCAkZm9udC0+WzBdLCAkZm9ybWF0KTsKKyAgICAgICAgfQorICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIHN0YW5kYXJkIEV4Y2VsIGJvcmRlciBzdHlsZXMuCisgICAgIworICAgIHN1YiBib3JkZXJzIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnQm9yZGVycycpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsIDQsIDEwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbig1LCA1LCA0MCk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICJJbmRleCIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMSwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAzLCAiU3R5bGUiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDUsICJUaGUgc3R5bGUgaXMgaGlnaGxpZ2h0ZWQgaW4gcmVkIGZvciAiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDUsICJlbXBoYXNpcywgdGhlIGRlZmF1bHQgY29sb3IgaXMgYmxhY2suIiwgJGhlYWRpbmcpOworICAgIAorICAgICAgICBmb3IgbXkgJGkgKDAuLjEzKXsKKyAgICAgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9ib3JkZXIoJGkpOworICAgICAgICAgICAgJGZvcm1hdC0+c2V0X2JvcmRlcl9jb2xvcigncmVkJyk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfYWxpZ24oJ2NlbnRlcicpOworICAgIAorICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzEpKSwgMCwgJGksICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCgyKigkaSsxKSksIDEsIHNwcmludGYoIjB4JTAyWCIsICRpKSwgJGNlbnRlcik7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoMiooJGkrMSkpLCAzLCAiQm9yZGVyIiwgJGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMzAsIDAsICJEaWFnIHR5cGUiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMwLCAxLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMwLCAzLCAiU3R5bGUiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMwLCA1LCAiRGlhZ29uYWwgQm9kZXIgc3R5bGVzIiwgJGhlYWRpbmcpOworICAgIAorICAgICAgICBmb3IgbXkgJGkgKDEuLjMpeworICAgICAgICAgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICAgICAgJGZvcm1hdC0+c2V0X2RpYWdfdHlwZSgkaSk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfZGlhZ19ib3JkZXIoMSk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfZGlhZ19jb2xvcigncmVkJyk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfYWxpZ24oJ2NlbnRlcicpOworICAgIAorICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzE1KSksIDAsICRpLCAgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzE1KSksIDEsIHNwcmludGYoIjB4JTAyWCIsICRpKSwgICRjZW50ZXIpOworICAgIAorICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzE1KSksIDMsICJCb3JkZXIiLCAkZm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIHN0YW5kYXJkIEV4Y2VsIGNlbGwgcGF0dGVybnMuCisgICAgIworICAgIHN1YiBwYXR0ZXJucyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1BhdHRlcm5zJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgNCwgMTApOworICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDUsIDUsIDUwKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICJQYXR0ZXJuIiwgJGhlYWRpbmcpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA1LCAiVGhlIGJhY2tncm91bmQgY29sb3VyIGhhcyBiZWVuIHNldCB0byBzaWx2ZXIuIiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA1LCAiVGhlIGZvcmVncm91bmQgY29sb3VyIGhhcyBiZWVuIHNldCB0byBncmVlbi4iLCAgJGhlYWRpbmcpOworICAgIAorICAgICAgICBmb3IgbXkgJGkgKDAuLjE4KXsKKyAgICAgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9wYXR0ZXJuKCRpKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9iZ19jb2xvcignc2lsdmVyJyk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfZmdfY29sb3IoJ2dyZWVuJyk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfYWxpZ24oJ2NlbnRlcicpOworICAgIAorICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzEpKSwgMCwgJGksICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCgyKigkaSsxKSksIDEsIHNwcmludGYoIjB4JTAyWCIsICRpKSwgJGNlbnRlcik7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoMiooJGkrMSkpLCAzLCAiUGF0dGVybiIsICRmb3JtYXQpOworICAgIAorICAgICAgICAgICAgaWYgKCRpID09IDEpIHsKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoMiooJGkrMSkpLCA1LCAiVGhpcyBpcyBzb2xpZCBjb2xvdXIsIHRoZSBtb3N0IHVzZWZ1bCBwYXR0ZXJuLiIsICRoZWFkaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIHN0YW5kYXJkIEV4Y2VsIGNlbGwgYWxpZ25tZW50cy4KKyAgICAjCisgICAgc3ViIGFsaWdubWVudCB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0FsaWdubWVudCcpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsIDcsIDEyKTsKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X3JvdygwLCA0MCk7CisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9zZWxlY3Rpb24oNywgMCk7CisgICAgCisgICAgICAgIG15ICRmb3JtYXQwMSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDAzID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwNCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDUgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDA2ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwNyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDggPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDA5ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQxMCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MTEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDEyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQxMyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MTQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDE1ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQxNiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MTcgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAKKyAgICAgICAgJGZvcm1hdDAyLT5zZXRfYWxpZ24oJ3RvcCcpOworICAgICAgICAkZm9ybWF0MDMtPnNldF9hbGlnbignYm90dG9tJyk7CisgICAgICAgICRmb3JtYXQwNC0+c2V0X2FsaWduKCd2Y2VudGVyJyk7CisgICAgICAgICRmb3JtYXQwNS0+c2V0X2FsaWduKCd2anVzdGlmeScpOworICAgICAgICAkZm9ybWF0MDYtPnNldF90ZXh0X3dyYXAoKTsKKyAgICAKKyAgICAgICAgJGZvcm1hdDA3LT5zZXRfYWxpZ24oJ2xlZnQnKTsKKyAgICAgICAgJGZvcm1hdDA4LT5zZXRfYWxpZ24oJ3JpZ2h0Jyk7CisgICAgICAgICRmb3JtYXQwOS0+c2V0X2FsaWduKCdjZW50ZXInKTsKKyAgICAgICAgJGZvcm1hdDEwLT5zZXRfYWxpZ24oJ2ZpbGwnKTsKKyAgICAgICAgJGZvcm1hdDExLT5zZXRfYWxpZ24oJ2p1c3RpZnknKTsKKyAgICAgICAgJGZvcm1hdDEyLT5zZXRfbWVyZ2UoKTsKKyAgICAKKyAgICAgICAgJGZvcm1hdDEzLT5zZXRfcm90YXRpb24oNDUpOworICAgICAgICAkZm9ybWF0MTQtPnNldF9yb3RhdGlvbigtNDUpOworICAgICAgICAkZm9ybWF0MTUtPnNldF9yb3RhdGlvbigyNzApOworICAgIAorICAgICAgICAkZm9ybWF0MTYtPnNldF9zaHJpbmsoKTsKKyAgICAgICAgJGZvcm1hdDE3LT5zZXRfaW5kZW50KDEpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnVmVydGljYWwnLCAgICAgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAndG9wJywgICAgICAgICAgJGZvcm1hdDAyKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgJ2JvdHRvbScsICAgICAgICRmb3JtYXQwMyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICd2Y2VudGVyJywgICAgICAkZm9ybWF0MDQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA0LCAndmp1c3RpZnknLCAgICAgJGZvcm1hdDA1KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgNSwgInRleHRcbndyYXAiLCAgICRmb3JtYXQwNik7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDAsICdIb3Jpem9udGFsJywgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDEsICdsZWZ0JywgICAgICAgICAkZm9ybWF0MDcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAyLCAncmlnaHQnLCAgICAgICAgJGZvcm1hdDA4KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMywgJ2NlbnRlcicsICAgICAgICRmb3JtYXQwOSk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDQsICdmaWxsJywgICAgICAgICAkZm9ybWF0MTApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgyLCA1LCAnanVzdGlmeScsICAgICAgJGZvcm1hdDExKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMSwgJ21lcmdlJywgICAgICAgICRmb3JtYXQxMik7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDIsICcnLCAgICAgICAgICAgICAkZm9ybWF0MTIpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAzLCAnU2hyaW5rICcgeCAzLCAgJGZvcm1hdDE2KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgNCwgJ0luZGVudCcsICAgICAgICRmb3JtYXQxNyk7CisgICAgCisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsIDAsICdSb3RhdGlvbicsICAgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsIDEsICdSb3RhdGUgNDUnLCAgICAkZm9ybWF0MTMpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSg2LCAxLCAnUm90YXRlIC00NScsICAgJGZvcm1hdDE0KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNywgMSwgJ1JvdGF0ZSAyNzAnLCAgICRmb3JtYXQxNSk7CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBEZW1vbnN0cmF0ZSBvdGhlciBtaXNjZWxsYW5lb3VzIGZlYXR1cmVzLgorICAgICMKKyAgICBzdWIgbWlzYyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ01pc2NlbGxhbmVvdXMnKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigyLCAyLCAyNSk7CisgICAgCisgICAgICAgIG15ICRmb3JtYXQwMSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDAzID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwNCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDUgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDA2ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwNyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgIAorICAgICAgICAkZm9ybWF0MDEtPnNldF91bmRlcmxpbmUoMHgwMSk7CisgICAgICAgICRmb3JtYXQwMi0+c2V0X3VuZGVybGluZSgweDAyKTsKKyAgICAgICAgJGZvcm1hdDAzLT5zZXRfdW5kZXJsaW5lKDB4MjEpOworICAgICAgICAkZm9ybWF0MDQtPnNldF91bmRlcmxpbmUoMHgyMik7CisgICAgICAgICRmb3JtYXQwNS0+c2V0X2ZvbnRfc3RyaWtlb3V0KCk7CisgICAgICAgICRmb3JtYXQwNi0+c2V0X2ZvbnRfb3V0bGluZSgpOworICAgICAgICAkZm9ybWF0MDctPnNldF9mb250X3NoYWRvdygpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAgMiwgJ1VuZGVybGluZSAgMHgwMScsICAgICAgICAgICRmb3JtYXQwMSk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsICAyLCAnVW5kZXJsaW5lICAweDAyJywgICAgICAgICAgJGZvcm1hdDAyKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgIDIsICdVbmRlcmxpbmUgIDB4MjEnLCAgICAgICAgICAkZm9ybWF0MDMpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSg3LCAgMiwgJ1VuZGVybGluZSAgMHgyMicsICAgICAgICAgICRmb3JtYXQwNCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDksICAyLCAnU3RyaWtlb3V0JywgICAgICAgICAgICAgICAgJGZvcm1hdDA1KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMTEsIDIsICdPdXRsaW5lIChNYWNpbnRvc2ggb25seSknLCAkZm9ybWF0MDYpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgxMywgMiwgJ1NoYWRvdyAoTWFjaW50b3NoIG9ubHkpJywgICRmb3JtYXQwNyk7CisgICAgfQorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZm9ybWF0cy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGJ1Z19yZXBvcnQucGwKKworCisKK0EgdGVtcGxhdGUgZm9yIHN1Ym1pdHRpbmcgYSBidWcgcmVwb3J0LgorCitSdW4gdGhpcyBwcm9ncmFtIGFuZCByZWFkIHRoZSBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHRlbXBsYXRlIGZvciBzdWJtaXR0aW5nIGEgYnVnIHJlcG9ydC4KKyAgICAjCisgICAgIyBSdW4gdGhpcyBwcm9ncmFtIGFuZCByZWFkIHRoZSBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgCisgICAgcHJpbnQgPDwgJ0hJTlRTXzEnOworICAgIAorICAgIFJFUE9SVElORyBBIEJVRyBPUiBBU0tJTkcgQSBRVUVTVElPTgorICAgIAorICAgICAgICBGZWVsIGZyZWUgdG8gcmVwb3J0IGJ1Z3Mgb3IgYXNrIHF1ZXN0aW9ucy4gSG93ZXZlciwgdG8gc2F2ZSB0aW1lCisgICAgICAgIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc3RlcHMgZmlyc3Q6CisgICAgCisgICAgICAgIFJlYWQgdGhlIGRvY3VtZW50YXRpb246CisgICAgCisgICAgICAgICAgICBUaGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiByZWZpbmVkIGluCisgICAgICAgICAgICByZXNwb25zZSB0byB1c2VyIHF1ZXN0aW9ucy4gVGhlcmVmb3JlLCBpZiB5b3UgaGF2ZSBhIHF1ZXN0aW9uIGl0IGlzCisgICAgICAgICAgICBwb3NzaWJsZSB0aGF0IHNvbWVvbmUgZWxzZSBoYXMgYXNrZWQgaXQgYmVmb3JlIHlvdSBhbmQgdGhhdCBpdCBpcworICAgICAgICAgICAgYWxyZWFkeSBhZGRyZXNzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFNpbmNlIHRoZXJlIGlzIGEgbG90IG9mCisgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHRvIGdldCB0aHJvdWdoIHlvdSBzaG91bGQgYXQgbGVhc3QgcmVhZCB0aGUgdGFibGUgb2YKKyAgICAgICAgICAgIGNvbnRlbnRzIGFuZCBzZWFyY2ggZm9yIGtleXdvcmRzIHRoYXQgeW91IGFyZSBpbnRlcmVzdGVkIGluLgorICAgIAorICAgICAgICBMb29rIGF0IHRoZSBleGFtcGxlIHByb2dyYW1zOgorICAgIAorICAgICAgICAgICAgVGhlcmUgYXJlIG92ZXIgNzAgZXhhbXBsZSBwcm9ncmFtcyBzaGlwcGVkIHdpdGggdGhlIHN0YW5kYXJkCisgICAgICAgICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkaXN0cmlidXRpb24uIE1hbnkgb2YgdGhlc2Ugd2VyZSBjcmVhdGVkIGluCisgICAgICAgICAgICByZXNwb25zZSB0byB1c2VyIHF1ZXN0aW9ucy4gVHJ5IHRvIGlkZW50aWZ5IGFuIGV4YW1wbGUgcHJvZ3JhbSB0aGF0CisgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB5b3VyIHF1ZXJ5IGFuZCBhZGFwdCBpdCB0byB5b3VyIG5lZWRzLgorICAgIAorICAgIEhJTlRTXzEKKyAgICBwcmludCAiUHJlc3MgZW50ZXIgLi4uIjsgPFNURElOPjsKKyAgICAKKyAgICBwcmludCA8PCAnSElOVFNfMic7CisgICAgCisgICAgICAgIElmIHlvdSBzdWJtaXQgYSBidWcgcmVwb3J0IGhlcmUgYXJlIHNvbWUgcG9pbnRlcnMuCisgICAgCisgICAgICAgIDEuICBQdXQgIldyaXRlRXhjZWw6IiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdWJqZWN0IGxpbmUuIFRoaXMgaGVscHMKKyAgICAgICAgICAgIHRvIGZpbHRlciBnZW51aW5lIG1lc3NhZ2VzIGZyb20gc3BhbS4KKyAgICAKKyAgICAgICAgMi4gIERlc2NyaWJlIHRoZSBwcm9ibGVtcyBhcyBjbGVhcmx5IGFuZCBhcyBjb25jaXNlbHkgYXMgcG9zc2libGUuCisgICAgCisgICAgICAgIDMuICBTZW5kIGEgc2FtcGxlIHByb2dyYW0uIEl0IGlzIG9mdGVuIGVhc2llciB0byBkZXNjcmliZSBhIHByb2JsZW0gaW4KKyAgICAgICAgICAgIGNvZGUgdGhhbiBpbiB3cml0dGVuIHByb3NlLgorICAgIAorICAgICAgICA0LiAgVGhlIHNhbXBsZSBwcm9ncmFtIHNob3VsZCBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZSB0byBkZW1vbnN0cmF0ZSB0aGUKKyAgICAgICAgICAgIHByb2JsZW0uIERvbid0IGNvcHkgYW5kIHBhc3QgbGFyZ2Ugc2VjdGlvbnMgb2YgeW91ciBwcm9ncmFtLiBUaGUKKyAgICAgICAgICAgIHByb2dyYW0gc2hvdWxkIGFsc28gYmUgc2VsZiBjb250YWluZWQgYW5kIHdvcmtpbmcuCisgICAgCisgICAgICAgIEEgc2FtcGxlIGJ1ZyByZXBvcnQgaXMgZ2VuZXJhdGVkIGJlbG93LiBJZiB5b3UgdXNlIHRoaXMgZm9ybWF0IHRoZW4gaXQKKyAgICAgICAgd2lsbCBoZWxwIHRvIGFuYWx5c2UgeW91ciBxdWVzdGlvbiBhbmQgcmVzcG9uZCB0byBpdCBtb3JlIHF1aWNrbHkuCisgICAgCisgICAgICAgIFBsZWFzZSBkb24ndCBzZW5kIHBhdGNoZXMgd2l0aG91dCBjb250YWN0aW5nIHRoZSBhdXRob3IgZmlyc3QuCisgICAgCisgICAgCisgICAgSElOVFNfMgorICAgIHByaW50ICJQcmVzcyBlbnRlciAuLi4iOyA8U1RESU4+OworICAgIAorICAgIAorICAgIHByaW50IDw8ICdFTUFJTCc7CisgICAgCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAKKyAgICBUbzogICAgICBKb2huIE1jTmFtYXJhIDxqbWNuYW1hcmFAY3Bhbi5vcmc+CisgICAgU3ViamVjdDogV3JpdGVFeGNlbDogUHJvYmxlbSB3aXRoIHNvbWV0aGluZy4KKyAgICAKKyAgICBIaSBKb2huLAorICAgIAorICAgIEkgYW0gdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIEkgaGF2ZSBlbmNvdW50ZXJlZCBhIHByb2JsZW0uIEkKKyAgICB3YW50IGl0IHRvIGRvIFNPTUVUSElORyBidXQgdGhlIG1vZHVsZSBhcHBlYXJzIHRvIGRvIFNPTUVUSElOR19FTFNFLgorICAgIAorICAgIEhlcmUgaXMgc29tZSBjb2RlIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBwcm9ibGVtLgorICAgIAorICAgICAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAgICAgdXNlIHN0cmljdDsKKyAgICAgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygicmVsb2FkLnhscyIpOworICAgICAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICJIaSBFeGNlbCEiKTsKKyAgICAKKyAgICAgICAgX19FTkRfXworICAgIAorICAgIAorICAgIEkgdGVzdGVkIHVzaW5nIEV4Y2VsIFhYIChvciBHbnVtZXJpYyBvciBPcGVuT2ZmaWNlLm9yZykuCisgICAgCisgICAgTXkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgc3lzdGVtIGRldGFpbHMgYXJlIGFzIGZvbGxvd3M6CisgICAgRU1BSUwKKyAgICAKKyAgICAKKyAgICBwcmludCAiXG4gICAgUGVybCB2ZXJzaW9uICAgOiAkXSI7CisgICAgcHJpbnQgIlxuICAgIE9TIG5hbWUgICAgICAgIDogJF5PIjsKKyAgICBwcmludCAiXG4gICAgTW9kdWxlIHZlcnNpb25zOiAobm90IGFsbCBhcmUgcmVxdWlyZWQpXG4iOworICAgIAorICAgIAorICAgIG15IEBtb2R1bGVzID0gcXcoCisgICAgICAgICAgICAgICAgICAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyAgICAgICAgICAgICAgICAgICAgICBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbAorICAgICAgICAgICAgICAgICAgICAgIE9MRTo6U3RvcmFnZV9MaXRlCisgICAgICAgICAgICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQKKyAgICAgICAgICAgICAgICAgICAgICBGaWxlOjpUZW1wCisgICAgICAgICAgICAgICAgICAgICAgRGlnZXN0OjpNRDQKKyAgICAgICAgICAgICAgICAgICAgICBEaWdlc3Q6OlBlcmw6Ok1ENAorICAgICAgICAgICAgICAgICAgICAgIERpZ2VzdDo6TUQ1CisgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgZm9yIG15ICRtb2R1bGUgKEBtb2R1bGVzKSB7CisgICAgICAgIG15ICR2ZXJzaW9uOworICAgICAgICBldmFsICJyZXF1aXJlICRtb2R1bGUiOworICAgIAorICAgICAgICBpZiAobm90ICRAKSB7CisgICAgICAgICAgICAkdmVyc2lvbiA9ICRtb2R1bGUtPlZFUlNJT047CisgICAgICAgICAgICAkdmVyc2lvbiA9ICcodW5rbm93biknIGlmIG5vdCBkZWZpbmVkICR2ZXJzaW9uOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJHZlcnNpb24gPSAnKG5vdCBpbnN0YWxsZWQpJzsKKyAgICAgICAgfQorICAgIAorICAgICAgICBwcmludGYgIiUyMXMlLTI0c1x0JXNcbiIsICIiLCAkbW9kdWxlLCAkdmVyc2lvbjsKKyAgICB9CisgICAgCisgICAgCisgICAgcHJpbnQgPDwgIkJZRSI7CisgICAgWW91cnMgZXRjLiwKKyAgICAKKyAgICBBLiBQZXJzb24KKyAgICAtLQorICAgIAorICAgIEJZRQorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvYnVnX3JlcG9ydC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGF1dG9maWx0ZXIucGwKKworCisKK0FuIGV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBhdXRvZmlsdGVycyB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCitBbiBhdXRvZmlsdGVyIGlzIGEgd2F5IG9mIGFkZGluZyBkcm9wIGRvd24gbGlzdHMgdG8gdGhlIGhlYWRlcnMgb2YgYSAyRCByYW5nZQorb2Ygd29ya3NoZWV0IGRhdGEuIFRoaXMgaXMgdHVybiBhbGxvdyB1c2VycyB0byBmaWx0ZXIgdGhlIGRhdGEgYmFzZWQgb24KK3NpbXBsZSBjcml0ZXJpYSBzbyB0aGF0IHNvbWUgZGF0YSBpcyBzaG93biBhbmQgc29tZSBpcyBoaWRkZW4uCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2F1dG9maWx0ZXIuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBhdXRvZmlsdGVyLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQW4gZXhhbXBsZSBvZiBob3cgdG8gY3JlYXRlIGF1dG9maWx0ZXJzIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgQW4gYXV0b2ZpbHRlciBpcyBhIHdheSBvZiBhZGRpbmcgZHJvcCBkb3duIGxpc3RzIHRvIHRoZSBoZWFkZXJzIG9mIGEgMkQgcmFuZ2UKKyAgICAjIG9mIHdvcmtzaGVldCBkYXRhLiBUaGlzIGlzIHR1cm4gYWxsb3cgdXNlcnMgdG8gZmlsdGVyIHRoZSBkYXRhIGJhc2VkIG9uCisgICAgIyBzaW1wbGUgY3JpdGVyaWEgc28gdGhhdCBzb21lIGRhdGEgaXMgc2hvd24gYW5kIHNvbWUgaXMgaGlkZGVuLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDcsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ2F1dG9maWx0ZXIueGxzJyk7CisgICAgCisgICAgZGllICJDb3VsZG4ndCBjcmVhdGUgbmV3IEV4Y2VsIGZpbGU6ICQhLlxuIiB1bmxlc3MgZGVmaW5lZCAkd29ya2Jvb2s7CisgICAgCisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0NSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQ2ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgbXkgJGJvbGQgICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoYm9sZCA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAjIEV4dHJhY3QgdGhlIGRhdGEgZW1iZWRkZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgICAgbXkgQGhlYWRpbmdzID0gc3BsaXQgJyAnLCA8REFUQT47CisgICAgbXkgQGRhdGE7CisgICAgcHVzaCBAZGF0YSwgW3NwbGl0XSB3aGlsZSA8REFUQT47CisgICAgCisgICAgCisgICAgIyBTZXQgdXAgc2V2ZXJhbCBzaGVldHMgd2l0aCB0aGUgc2FtZSBkYXRhLgorICAgIGZvciBteSAkd29ya3NoZWV0ICgkd29ya2Jvb2stPnNoZWV0cygpKSB7CisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6RCcsIDEyKTsKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X3JvdygwLCAyMCwgJGJvbGQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCBcQGhlYWRpbmdzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gQXV0b2ZpbHRlciB3aXRob3V0IGNvbmRpdGlvbnMuCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQxLT5hdXRvZmlsdGVyKCdBMTpENTEnKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0EyJywgW1tAZGF0YV1dKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMKKyAgICAjIEV4YW1wbGUgMi4gQXV0b2ZpbHRlciB3aXRoIGEgZmlsdGVyIGNvbmRpdGlvbiBpbiB0aGUgZmlyc3QgY29sdW1uLgorICAgICMKKyAgICAKKyAgICAjIFRoZSByYW5nZSBpbiB0aGlzIGV4YW1wbGUgaXMgdGhlIHNhbWUgYXMgYWJvdmUgYnV0IGluIHJvdy1jb2x1bW4gbm90YXRpb24uCisgICAgJHdvcmtzaGVldDItPmF1dG9maWx0ZXIoMCwgMCwgNTAsIDMpOworICAgIAorICAgICMgVGhlIHBsYWNlaG9sZGVyICJSZWdpb24iIGluIHRoZSBmaWx0ZXIgaXMgaWdub3JlZCBhbmQgY2FuIGJlIGFueSBzdHJpbmcKKyAgICAjIHRoYXQgYWRkcyBjbGFyaXR5IHRvIHRoZSBleHByZXNzaW9uLgorICAgICMKKyAgICAkd29ya3NoZWV0Mi0+ZmlsdGVyX2NvbHVtbigwLCAnUmVnaW9uIGVxIEVhc3QnKTsKKyAgICAKKyAgICAjCisgICAgIyBIaWRlIHRoZSByb3dzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGZpbHRlciBjcml0ZXJpYS4KKyAgICAjCisgICAgbXkgJHJvdyA9IDE7CisgICAgCisgICAgZm9yIG15ICRyb3dfZGF0YSAoQGRhdGEpIHsKKyAgICAgICAgbXkgJHJlZ2lvbiA9ICRyb3dfZGF0YS0+WzBdOworICAgIAorICAgICAgICBpZiAoJHJlZ2lvbiBlcSAnRWFzdCcpIHsKKyAgICAgICAgICAgICMgUm93IGlzIHZpc2libGUuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIEhpZGUgcm93LgorICAgICAgICAgICAgJHdvcmtzaGVldDItPnNldF9yb3coJHJvdywgdW5kZWYsIHVuZGVmLCAxKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJHJvdysrLCAwLCAkcm93X2RhdGEpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMKKyAgICAjIEV4YW1wbGUgMy4gQXV0b2ZpbHRlciB3aXRoIGEgZHVhbCBmaWx0ZXIgY29uZGl0aW9uIGluIG9uZSBvZiB0aGUgY29sdW1ucy4KKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDMtPmF1dG9maWx0ZXIoJ0ExOkQ1MScpOworICAgIAorICAgICR3b3Jrc2hlZXQzLT5maWx0ZXJfY29sdW1uKCdBJywgJ3ggZXEgRWFzdCBvciB4IGVxIFNvdXRoJyk7CisgICAgCisgICAgIworICAgICMgSGlkZSB0aGUgcm93cyB0aGF0IGRvbid0IG1hdGNoIHRoZSBmaWx0ZXIgY3JpdGVyaWEuCisgICAgIworICAgICRyb3cgPSAxOworICAgIAorICAgIGZvciBteSAkcm93X2RhdGEgKEBkYXRhKSB7CisgICAgICAgIG15ICRyZWdpb24gPSAkcm93X2RhdGEtPlswXTsKKyAgICAKKyAgICAgICAgaWYgKCRyZWdpb24gZXEgJ0Vhc3QnIG9yICRyZWdpb24gZXEgJ1NvdXRoJykgeworICAgICAgICAgICAgIyBSb3cgaXMgdmlzaWJsZS4KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgSGlkZSByb3cuCisgICAgICAgICAgICAkd29ya3NoZWV0My0+c2V0X3Jvdygkcm93LCB1bmRlZiwgdW5kZWYsIDEpOworICAgICAgICB9CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQzLT53cml0ZSgkcm93KyssIDAsICRyb3dfZGF0YSk7CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIworICAgICMgRXhhbXBsZSA0LiBBdXRvZmlsdGVyIHdpdGggZmlsdGVyIGNvbmRpdGlvbnMgaW4gdHdvIGNvbHVtbnMuCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQ0LT5hdXRvZmlsdGVyKCdBMTpENTEnKTsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+ZmlsdGVyX2NvbHVtbignQScsICd4IGVxIEVhc3QnKTsKKyAgICAkd29ya3NoZWV0NC0+ZmlsdGVyX2NvbHVtbignQycsICd4ID4gMzAwMCBhbmQgeCA8IDgwMDAnICk7CisgICAgCisgICAgIworICAgICMgSGlkZSB0aGUgcm93cyB0aGF0IGRvbid0IG1hdGNoIHRoZSBmaWx0ZXIgY3JpdGVyaWEuCisgICAgIworICAgICRyb3cgPSAxOworICAgIAorICAgIGZvciBteSAkcm93X2RhdGEgKEBkYXRhKSB7CisgICAgICAgIG15ICRyZWdpb24gPSAkcm93X2RhdGEtPlswXTsKKyAgICAgICAgbXkgJHZvbHVtZSA9ICRyb3dfZGF0YS0+WzJdOworICAgIAorICAgICAgICBpZiAoJHJlZ2lvbiBlcSAnRWFzdCcgYW5kCisgICAgICAgICAgICAkdm9sdW1lID4gIDMwMDAgICBhbmQgJHZvbHVtZSA8IDgwMDAKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICAjIFJvdyBpcyB2aXNpYmxlLgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBIaWRlIHJvdy4KKyAgICAgICAgICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KCRyb3csIHVuZGVmLCB1bmRlZiwgMSk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDQtPndyaXRlKCRyb3crKywgMCwgJHJvd19kYXRhKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjCisgICAgIyBFeGFtcGxlIDUuIEF1dG9maWx0ZXIgd2l0aCBmaWx0ZXIgZm9yIGJsYW5rcy4KKyAgICAjCisgICAgCisgICAgIyBDcmVhdGUgYSBibGFuayBjZWxsIGluIG91ciB0ZXN0IGRhdGEuCisgICAgJGRhdGFbNV0tPlswXSA9ICcnOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQ1LT5hdXRvZmlsdGVyKCdBMTpENTEnKTsKKyAgICAkd29ya3NoZWV0NS0+ZmlsdGVyX2NvbHVtbignQScsICd4ID09IEJsYW5rcycpOworICAgIAorICAgICMKKyAgICAjIEhpZGUgdGhlIHJvd3MgdGhhdCBkb24ndCBtYXRjaCB0aGUgZmlsdGVyIGNyaXRlcmlhLgorICAgICMKKyAgICAkcm93ID0gMTsKKyAgICAKKyAgICBmb3IgbXkgJHJvd19kYXRhIChAZGF0YSkgeworICAgICAgICBteSAkcmVnaW9uID0gJHJvd19kYXRhLT5bMF07CisgICAgCisgICAgICAgIGlmICgkcmVnaW9uIGVxICcnKQorICAgICAgICB7CisgICAgICAgICAgICAjIFJvdyBpcyB2aXNpYmxlLgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBIaWRlIHJvdy4KKyAgICAgICAgICAgICR3b3Jrc2hlZXQ1LT5zZXRfcm93KCRyb3csIHVuZGVmLCB1bmRlZiwgMSk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDUtPndyaXRlKCRyb3crKywgMCwgJHJvd19kYXRhKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjCisgICAgIyBFeGFtcGxlIDYuIEF1dG9maWx0ZXIgd2l0aCBmaWx0ZXIgZm9yIG5vbi1ibGFua3MuCisgICAgIworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQ2LT5hdXRvZmlsdGVyKCdBMTpENTEnKTsKKyAgICAkd29ya3NoZWV0Ni0+ZmlsdGVyX2NvbHVtbignQScsICd4ID09IE5vbkJsYW5rcycpOworICAgIAorICAgICMKKyAgICAjIEhpZGUgdGhlIHJvd3MgdGhhdCBkb24ndCBtYXRjaCB0aGUgZmlsdGVyIGNyaXRlcmlhLgorICAgICMKKyAgICAkcm93ID0gMTsKKyAgICAKKyAgICBmb3IgbXkgJHJvd19kYXRhIChAZGF0YSkgeworICAgICAgICBteSAkcmVnaW9uID0gJHJvd19kYXRhLT5bMF07CisgICAgCisgICAgICAgIGlmICgkcmVnaW9uIG5lICcnKQorICAgICAgICB7CisgICAgICAgICAgICAjIFJvdyBpcyB2aXNpYmxlLgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBIaWRlIHJvdy4KKyAgICAgICAgICAgICR3b3Jrc2hlZXQ2LT5zZXRfcm93KCRyb3csIHVuZGVmLCB1bmRlZiwgMSk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDYtPndyaXRlKCRyb3crKywgMCwgJHJvd19kYXRhKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgX19EQVRBX18KKyAgICBSZWdpb24gICAgSXRlbSAgICAgIFZvbHVtZSAgICBNb250aAorICAgIEVhc3QgICAgICBBcHBsZSAgICAgOTAwMCAgICAgIEp1bHkKKyAgICBFYXN0ICAgICAgQXBwbGUgICAgIDUwMDAgICAgICBKdWx5CisgICAgU291dGggICAgIE9yYW5nZSAgICA5MDAwICAgICAgU2VwdGVtYmVyCisgICAgTm9ydGggICAgIEFwcGxlICAgICAyMDAwICAgICAgTm92ZW1iZXIKKyAgICBXZXN0ICAgICAgQXBwbGUgICAgIDkwMDAgICAgICBOb3ZlbWJlcgorICAgIFNvdXRoICAgICBQZWFyICAgICAgNzAwMCAgICAgIE9jdG9iZXIKKyAgICBOb3J0aCAgICAgUGVhciAgICAgIDkwMDAgICAgICBBdWd1c3QKKyAgICBXZXN0ICAgICAgT3JhbmdlICAgIDEwMDAgICAgICBEZWNlbWJlcgorICAgIFdlc3QgICAgICBHcmFwZSAgICAgMTAwMCAgICAgIE5vdmVtYmVyCisgICAgU291dGggICAgIFBlYXIgICAgICAxMDAwMCAgICAgQXByaWwKKyAgICBXZXN0ICAgICAgR3JhcGUgICAgIDYwMDAgICAgICBKYW51YXJ5CisgICAgU291dGggICAgIE9yYW5nZSAgICAzMDAwICAgICAgTWF5CisgICAgTm9ydGggICAgIEFwcGxlICAgICAzMDAwICAgICAgRGVjZW1iZXIKKyAgICBTb3V0aCAgICAgQXBwbGUgICAgIDcwMDAgICAgICBGZWJydWFyeQorICAgIFdlc3QgICAgICBHcmFwZSAgICAgMTAwMCAgICAgIERlY2VtYmVyCisgICAgRWFzdCAgICAgIEdyYXBlICAgICA4MDAwICAgICAgRmVicnVhcnkKKyAgICBTb3V0aCAgICAgR3JhcGUgICAgIDEwMDAwICAgICBKdW5lCisgICAgV2VzdCAgICAgIFBlYXIgICAgICA3MDAwICAgICAgRGVjZW1iZXIKKyAgICBTb3V0aCAgICAgQXBwbGUgICAgIDIwMDAgICAgICBPY3RvYmVyCisgICAgRWFzdCAgICAgIEdyYXBlICAgICA3MDAwICAgICAgRGVjZW1iZXIKKyAgICBOb3J0aCAgICAgR3JhcGUgICAgIDYwMDAgICAgICBBcHJpbAorICAgIEVhc3QgICAgICBQZWFyICAgICAgODAwMCAgICAgIEZlYnJ1YXJ5CisgICAgTm9ydGggICAgIEFwcGxlICAgICA3MDAwICAgICAgQXVndXN0CisgICAgTm9ydGggICAgIE9yYW5nZSAgICA3MDAwICAgICAgSnVseQorICAgIE5vcnRoICAgICBBcHBsZSAgICAgNjAwMCAgICAgIEp1bmUKKyAgICBTb3V0aCAgICAgR3JhcGUgICAgIDgwMDAgICAgICBTZXB0ZW1iZXIKKyAgICBXZXN0ICAgICAgQXBwbGUgICAgIDMwMDAgICAgICBPY3RvYmVyCisgICAgU291dGggICAgIE9yYW5nZSAgICAxMDAwMCAgICAgTm92ZW1iZXIKKyAgICBXZXN0ICAgICAgR3JhcGUgICAgIDQwMDAgICAgICBKdWx5CisgICAgTm9ydGggICAgIE9yYW5nZSAgICA1MDAwICAgICAgQXVndXN0CisgICAgRWFzdCAgICAgIE9yYW5nZSAgICAxMDAwICAgICAgTm92ZW1iZXIKKyAgICBFYXN0ICAgICAgT3JhbmdlICAgIDQwMDAgICAgICBPY3RvYmVyCisgICAgTm9ydGggICAgIEdyYXBlICAgICA1MDAwICAgICAgQXVndXN0CisgICAgRWFzdCAgICAgIEFwcGxlICAgICAxMDAwICAgICAgRGVjZW1iZXIKKyAgICBTb3V0aCAgICAgQXBwbGUgICAgIDEwMDAwICAgICBNYXJjaAorICAgIEVhc3QgICAgICBHcmFwZSAgICAgNzAwMCAgICAgIE9jdG9iZXIKKyAgICBXZXN0ICAgICAgR3JhcGUgICAgIDEwMDAgICAgICBTZXB0ZW1iZXIKKyAgICBFYXN0ICAgICAgR3JhcGUgICAgIDEwMDAwICAgICBPY3RvYmVyCisgICAgU291dGggICAgIE9yYW5nZSAgICA4MDAwICAgICAgTWFyY2gKKyAgICBOb3J0aCAgICAgQXBwbGUgICAgIDQwMDAgICAgICBKdWx5CisgICAgU291dGggICAgIE9yYW5nZSAgICA1MDAwICAgICAgSnVseQorICAgIFdlc3QgICAgICBBcHBsZSAgICAgNDAwMCAgICAgIEp1bmUKKyAgICBFYXN0ICAgICAgQXBwbGUgICAgIDUwMDAgICAgICBBcHJpbAorICAgIE5vcnRoICAgICBQZWFyICAgICAgMzAwMCAgICAgIEF1Z3VzdAorICAgIEVhc3QgICAgICBHcmFwZSAgICAgOTAwMCAgICAgIE5vdmVtYmVyCisgICAgTm9ydGggICAgIE9yYW5nZSAgICA4MDAwICAgICAgT2N0b2JlcgorICAgIEVhc3QgICAgICBBcHBsZSAgICAgMTAwMDAgICAgIEp1bmUKKyAgICBTb3V0aCAgICAgUGVhciAgICAgIDEwMDAgICAgICBEZWNlbWJlcgorICAgIE5vcnRoICAgICBHcmFwZSAgICAgMTAwMDAgICAgIEp1bHkKKyAgICBFYXN0ICAgICAgR3JhcGUgICAgIDYwMDAgICAgICBGZWJydWFyeQorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9hdXRvZmlsdGVyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogYXV0b2ZpdC5wbAorCisKKworU2ltdWxhdGUgRXhjZWwncyBhdXRvZml0IGZvciBjb2x1bW4gd2lkdGhzLgorCitFeGNlbCBwcm92aWRlcyBhIGZ1bmN0aW9uIGNhbGxlZCBBdXRvZml0IChGb3JtYXQtPkNvbHVtbnMtPkF1dG9maXQpIHRoYXQKK2FkanVzdHMgY29sdW1uIHdpZHRocyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IHN0cmluZyBpbiBhIGNvbHVtbi4KK0V4Y2VsIGNhbGN1bGF0ZXMgdGhlc2Ugd2lkdGhzIGF0IHJ1biB0aW1lIHdoZW4gaXQgaGFzIGFjY2VzcyB0byBpbmZvcm1hdGlvbgorYWJvdXQgc3RyaW5nIGxlbmd0aHMgYW5kIGZvbnQgaW5mb3JtYXRpb24uIFRoaXMgZnVuY3Rpb24gaXMgKm5vdCogYSBmZWF0dXJlCitvZiB0aGUgZmlsZSBmb3JtYXQgYW5kIHRodXMgY2Fubm90IGJlIGltcGxlbWVudGVkIGJ5IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCitIb3dldmVyLCB3ZSBjYW4gbWFrZSBhbiBhdHRlbXB0IHRvIHNpbXVsYXRlIGl0IGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlCitsb25nZXN0IHN0cmluZyB3cml0dGVuIHRvIGVhY2ggY29sdW1uIGFuZCB0aGVuIGFkanVzdGluZyB0aGUgY29sdW1uIHdpZHRocworcHJpb3IgdG8gY2xvc2luZyB0aGUgZmlsZS4KKworV2Uga2VlcCB0cmFjayBvZiB0aGUgbG9uZ2VzdCBzdHJpbmdzIGJ5IGFkZGluZyBhIGhhbmRsZXIgdG8gdGhlIHdyaXRlKCkKK2Z1bmN0aW9uLiBTZWUgYWRkX2hhbmRsZXIoKSBpbiB0aGUgUzo6V0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworVGhlIG1haW4gcHJvYmxlbSB3aXRoIHRyeWluZyB0byBzaW11bGF0ZSBBdXRvZml0IGxpZXMgaW4gZGVmaW5pbmcgYQorcmVsYXRpb25zaGlwIGJldHdlZW4gYSBzdHJpbmcgbGVuZ3RoIGFuZCBpdHMgd2lkdGggaW4gYSBhcmJpdHJhcnkgZm9udCBhbmQKK3NpemUuIFdlIHVzZSB0d28gYXBwcm9hY2hlcyBiZWxvdy4gVGhlIGZpcnN0IGlzIGEgc2ltcGxlIGRpcmVjdCByZWxhdGlvbnNoaXAKK29idGFpbmVkIGJ5IHRyaWFsIGFuZCBlcnJvci4gVGhlIHNlY29uZCBpcyBhIHNsaWdodGx5IG1vcmUgc29waGlzdGljYXRlZAorbWV0aG9kIHVzaW5nIGFuIGV4dGVybmFsIG1vZHVsZS4gRm9yIG1vcmUgY29tcGxpY2F0ZWQgYXBwbGljYXRpb25zIHlvdSB3aWxsCitwcm9iYWJseSBoYXZlIHRvIHdvcmsgb3V0IHlvdXIgb3duIG1ldGhvZHMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2F1dG9maXQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBhdXRvZml0LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTaW11bGF0ZSBFeGNlbCdzIGF1dG9maXQgZm9yIGNvbHVtbiB3aWR0aHMuCisgICAgIworICAgICMgRXhjZWwgcHJvdmlkZXMgYSBmdW5jdGlvbiBjYWxsZWQgQXV0b2ZpdCAoRm9ybWF0LT5Db2x1bW5zLT5BdXRvZml0KSB0aGF0CisgICAgIyBhZGp1c3RzIGNvbHVtbiB3aWR0aHMgdG8gbWF0Y2ggdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBzdHJpbmcgaW4gYSBjb2x1bW4uCisgICAgIyBFeGNlbCBjYWxjdWxhdGVzIHRoZXNlIHdpZHRocyBhdCBydW4gdGltZSB3aGVuIGl0IGhhcyBhY2Nlc3MgdG8gaW5mb3JtYXRpb24KKyAgICAjIGFib3V0IHN0cmluZyBsZW5ndGhzIGFuZCBmb250IGluZm9ybWF0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzICpub3QqIGEgZmVhdHVyZQorICAgICMgb2YgdGhlIGZpbGUgZm9ybWF0IGFuZCB0aHVzIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCBieSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyBIb3dldmVyLCB3ZSBjYW4gbWFrZSBhbiBhdHRlbXB0IHRvIHNpbXVsYXRlIGl0IGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlCisgICAgIyBsb25nZXN0IHN0cmluZyB3cml0dGVuIHRvIGVhY2ggY29sdW1uIGFuZCB0aGVuIGFkanVzdGluZyB0aGUgY29sdW1uIHdpZHRocworICAgICMgcHJpb3IgdG8gY2xvc2luZyB0aGUgZmlsZS4KKyAgICAjCisgICAgIyBXZSBrZWVwIHRyYWNrIG9mIHRoZSBsb25nZXN0IHN0cmluZ3MgYnkgYWRkaW5nIGEgaGFuZGxlciB0byB0aGUgd3JpdGUoKQorICAgICMgZnVuY3Rpb24uIFNlZSBhZGRfaGFuZGxlcigpIGluIHRoZSBTOjpXRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICMKKyAgICAjIFRoZSBtYWluIHByb2JsZW0gd2l0aCB0cnlpbmcgdG8gc2ltdWxhdGUgQXV0b2ZpdCBsaWVzIGluIGRlZmluaW5nIGEKKyAgICAjIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgc3RyaW5nIGxlbmd0aCBhbmQgaXRzIHdpZHRoIGluIGEgYXJiaXRyYXJ5IGZvbnQgYW5kCisgICAgIyBzaXplLiBXZSB1c2UgdHdvIGFwcHJvYWNoZXMgYmVsb3cuIFRoZSBmaXJzdCBpcyBhIHNpbXBsZSBkaXJlY3QgcmVsYXRpb25zaGlwCisgICAgIyBvYnRhaW5lZCBieSB0cmlhbCBhbmQgZXJyb3IuIFRoZSBzZWNvbmQgaXMgYSBzbGlnaHRseSBtb3JlIHNvcGhpc3RpY2F0ZWQKKyAgICAjIG1ldGhvZCB1c2luZyBhbiBleHRlcm5hbCBtb2R1bGUuIEZvciBtb3JlIGNvbXBsaWNhdGVkIGFwcGxpY2F0aW9ucyB5b3Ugd2lsbAorICAgICMgcHJvYmFibHkgaGF2ZSB0byB3b3JrIG91dCB5b3VyIG93biBtZXRob2RzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDYsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdhdXRvZml0LnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBZGQgYSBoYW5kbGVyIHRvIHN0b3JlIHRoZSB3aWR0aCBvZiB0aGUgbG9uZ2VzdCBzdHJpbmcgd3JpdHRlbiB0byBhIGNvbHVtbi4KKyAgICAjIFdlIHVzZSB0aGUgc3RvcmVkIHdpZHRoIHRvIHNpbXVsYXRlIGFuIGF1dG9maXQgb2YgdGhlIGNvbHVtbiB3aWR0aHMuCisgICAgIworICAgICMgWW91IHNob3VsZCBkbyB0aGlzIGZvciBldmVyeSB3b3Jrc2hlZXQgeW91IHdhbnQgdG8gYXV0b2ZpdC4KKyAgICAjCisgICAgJHdvcmtzaGVldC0+YWRkX3dyaXRlX2hhbmRsZXIocXJbXHddLCBcJnN0b3JlX3N0cmluZ193aWR0aHMpOworICAgIAorICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICdIZWxsbycpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMScsICdIZWxsbyBXb3JsZCcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEMScsICdIZWxsbycpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdGMScsICdUaGlzIGlzIGEgbG9uZyBzdHJpbmcgYXMgYW4gZXhhbXBsZS4nKTsKKyAgICAKKyAgICAjIFJ1biB0aGUgYXV0b2ZpdCBhZnRlciB5b3UgaGF2ZSBmaW5pc2hlZCB3cml0aW5nIHN0cmluZ3MgdG8gdGhlIHdvcmtib29rLgorICAgIGF1dG9maXRfY29sdW1ucygkd29ya3NoZWV0KTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRnVuY3Rpb25zIHVzZWQgZm9yIEF1dG9maXQuCisgICAgIworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQWRqdXN0IHRoZSBjb2x1bW4gd2lkdGhzIHRvIGZpdCB0aGUgbG9uZ2VzdCBzdHJpbmcgaW4gdGhlIGNvbHVtbi4KKyAgICAjCisgICAgc3ViIGF1dG9maXRfY29sdW1ucyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgbXkgJGNvbCAgICAgICA9IDA7CisgICAgCisgICAgICAgIGZvciBteSAkd2lkdGggKEB7JHdvcmtzaGVldC0+e19fY29sX3dpZHRoc319KSB7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCRjb2wsICRjb2wsICR3aWR0aCkgaWYgJHdpZHRoOworICAgICAgICAgICAgJGNvbCsrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIGEgY2FsbGJhY2sgdGhhdCB3YXMgYWRkZWQgdmlhIGFkZF93cml0ZV9oYW5kbGVyKCkKKyAgICAjIGFib3ZlLiBJdCBtb2RpZmllcyB0aGUgd3JpdGUoKSBmdW5jdGlvbiBzbyB0aGF0IGl0IHN0b3JlcyB0aGUgbWF4aW11bQorICAgICMgdW53cmFwcGVkIHdpZHRoIG9mIGEgc3RyaW5nIGluIGEgY29sdW1uLgorICAgICMKKyAgICBzdWIgc3RvcmVfc3RyaW5nX3dpZHRocyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgbXkgJGNvbCAgICAgICA9ICRfWzFdOworICAgICAgICBteSAkdG9rZW4gICAgID0gJF9bMl07CisgICAgCisgICAgICAgICMgSWdub3JlIHNvbWUgdG9rZW5zIHRoYXQgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4uCisgICAgICAgIHJldHVybiBpZiBub3QgZGVmaW5lZCAkdG9rZW47ICAgICAgICMgSWdub3JlIHVuZGVmcy4KKyAgICAgICAgcmV0dXJuIGlmICR0b2tlbiBlcSAnJzsgICAgICAgICAgICAgIyBJZ25vcmUgYmxhbmsgY2VsbHMuCisgICAgICAgIHJldHVybiBpZiByZWYgJHRva2VuIGVxICdBUlJBWSc7ICAgICMgSWdub3JlIGFycmF5IHJlZnMuCisgICAgICAgIHJldHVybiBpZiAkdG9rZW4gPX4gL149LzsgICAgICAgICAgICMgSWdub3JlIGZvcm11bGEKKyAgICAKKyAgICAgICAgIyBJZ25vcmUgbnVtYmVycworICAgICAgICByZXR1cm4gaWYgJHRva2VuID1+IC9eKFsrLV0/KSg/PVxkfFwuXGQpXGQqKFwuXGQqKT8oW0VlXShbKy1dP1xkKykpPyQvOworICAgIAorICAgICAgICAjIElnbm9yZSB2YXJpb3VzIGludGVybmFsIGFuZCBleHRlcm5hbCBoeXBlcmxpbmtzLiBJbiBhIHJlYWwgc2NlbmFyaW8KKyAgICAgICAgIyB5b3UgbWF5IHdpc2ggdG8gdHJhY2sgdGhlIGxlbmd0aCBvZiB0aGUgb3B0aW9uYWwgc3RyaW5ncyB1c2VkIHdpdGgKKyAgICAgICAgIyB1cmxzLgorICAgICAgICByZXR1cm4gaWYgJHRva2VuID1+IG17XltmaF10dD9wcz86Ly99OworICAgICAgICByZXR1cm4gaWYgJHRva2VuID1+IG17Xm1haWx0bzp9OworICAgICAgICByZXR1cm4gaWYgJHRva2VuID1+IG17Xig/OmlufGV4KXRlcm5hbDp9OworICAgIAorICAgIAorICAgICAgICAjIFdlIHN0b3JlIHRoZSBzdHJpbmcgd2lkdGggYXMgZGF0YSBpbiB0aGUgV29ya3NoZWV0IG9iamVjdC4gV2UgdXNlCisgICAgICAgICMgYSBkb3VibGUgdW5kZXJzY29yZSBrZXkgbmFtZSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBmdXR1cmUgbmFtZXMuCisgICAgICAgICMKKyAgICAgICAgbXkgJG9sZF93aWR0aCAgICA9ICR3b3Jrc2hlZXQtPntfX2NvbF93aWR0aHN9LT5bJGNvbF07CisgICAgICAgIG15ICRzdHJpbmdfd2lkdGggPSBzdHJpbmdfd2lkdGgoJHRva2VuKTsKKyAgICAKKyAgICAgICAgaWYgKG5vdCBkZWZpbmVkICRvbGRfd2lkdGggb3IgJHN0cmluZ193aWR0aCA+ICRvbGRfd2lkdGgpIHsKKyAgICAgICAgICAgICMgWW91IG1heSB3aXNoIHRvIHNldCBhIG1pbmltdW0gY29sdW1uIHdpZHRoIGFzIGZvbGxvd3MuCisgICAgICAgICAgICAjcmV0dXJuIHVuZGVmIGlmICRzdHJpbmdfd2lkdGggPCAxMDsKKyAgICAKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfX2NvbF93aWR0aHN9LT5bJGNvbF0gPSAkc3RyaW5nX3dpZHRoOworICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgICMgUmV0dXJuIGNvbnRyb2wgdG8gd3JpdGUoKTsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVmVyeSBzaW1wbGUgY29udmVyc2lvbiBiZXR3ZWVuIHN0cmluZyBsZW5ndGggYW5kIHN0cmluZyB3aWR0aCBmb3IgQXJpYWwgMTAuCisgICAgIyBTZWUgYmVsb3cgZm9yIGEgbW9yZSBzb3BoaXN0aWNhdGVkIG1ldGhvZC4KKyAgICAjCisgICAgc3ViIHN0cmluZ193aWR0aCB7CisgICAgCisgICAgICAgIHJldHVybiAwLjkgKiBsZW5ndGggJF9bMF07CisgICAgfQorICAgIAorICAgIF9fRU5EX18KKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiB1c2VzIGFuIGV4dGVybmFsIG1vZHVsZSB0byBnZXQgYSBtb3JlIGFjY3VyYXRlIHdpZHRoIGZvciBhCisgICAgIyBzdHJpbmcuIE5vdGUgdGhhdCBpbiBhIHJlYWwgcHJvZ3JhbSB5b3UgY291bGQgInVzZSIgdGhlIG1vZHVsZSBpbnN0ZWFkIG9mCisgICAgIyAicmVxdWlyZSItaW5nIGl0IGFuZCB5b3UgY291bGQgbWFrZSB0aGUgRm9udCBvYmplY3QgZ2xvYmFsIHRvIGF2b2lkIHJlcGVhdGVkCisgICAgIyBpbml0aWFsaXNhdGlvbi4KKyAgICAjCisgICAgIyBOb3RlIGFsc28gdGhhdCB0aGUgJHBpeGVsX3dpZHRoIHRvICRjZWxsX3dpZHRoIGlzIHNwZWNpZmljIHRvIEFyaWFsLiBGb3IKKyAgICAjIG90aGVyIGZvbnRzIHlvdSBzaG91bGQgY2FsY3VsYXRlIGFwcHJvcHJpYXRlIHJlbGF0aW9uc2hpcHMuIEEgZnV0dXJlIHZlcnNpb24KKyAgICAjIG9mIFM6OldFIHdpbGwgcHJvdmlkZSBhIHdheSBvZiBzcGVjaWZ5aW5nIGNvbHVtbiB3aWR0aHMgaW4gcGl4ZWxzIGluc3RlYWQgb2YKKyAgICAjIGNlbGwgdW5pdHMgaW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhpcyBjb252ZXJzaW9uLgorICAgICMKKyAgICBzdWIgc3RyaW5nX3dpZHRoIHsKKyAgICAKKyAgICAgICAgcmVxdWlyZSBGb250OjpUVEZNZXRyaWNzOworICAgIAorICAgICAgICBteSAkYXJpYWwgICAgICAgID0gRm9udDo6VFRGTWV0cmljcy0+bmV3KCdjOlx3aW5kb3dzXGZvbnRzXGFyaWFsLnR0ZicpOworICAgIAorICAgICAgICBteSAkZm9udF9zaXplICAgID0gMTA7CisgICAgICAgIG15ICRkcGkgICAgICAgICAgPSA5NjsKKyAgICAgICAgbXkgJHVuaXRzX3Blcl9lbSA9ICRhcmlhbC0+Z2V0X3VuaXRzX3Blcl9lbSgpOworICAgICAgICBteSAkZm9udF93aWR0aCAgID0gJGFyaWFsLT5zdHJpbmdfd2lkdGgoJF9bMF0pOworICAgIAorICAgICAgICAjIENvbnZlcnQgdG8gcGl4ZWxzIGFzIHBlciBUVEZNZXRyaWNzIGRvY3MuCisgICAgICAgIG15ICRwaXhlbF93aWR0aCAgPSA2ICsgJGZvbnRfd2lkdGggKiRmb250X3NpemUgKiRkcGkgLyg3MiAqJHVuaXRzX3Blcl9lbSk7CisgICAgCisgICAgICAgICMgQWRkIGV4dHJhIHBpeGVscyBmb3IgYm9yZGVyIGFyb3VuZCB0ZXh0LgorICAgICAgICAkcGl4ZWxfd2lkdGggICs9IDY7CisgICAgCisgICAgICAgICMgQ29udmVydCB0byBjZWxsIHdpZHRoIChmb3IgQXJpYWwpIGFuZCBmb3IgY2VsbCB3aWR0aHMgPiAxLgorICAgICAgICBteSAkY2VsbF93aWR0aCAgID0gKCRwaXhlbF93aWR0aCAtNSkgLzc7CisgICAgCisgICAgICAgIHJldHVybiAkY2VsbF93aWR0aDsKKyAgICAKKyAgICB9CisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9hdXRvZml0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogYmlnZmlsZS5wbAorCisKKworRXhhbXBsZSBvZiBjcmVhdGluZyBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlCitkZWZhdWx0IDdNQiBsaW1pdC4KKworVGhpcyBpcyBleGFjdGx5IHRoYXQgc2FtZSBhcyBhbnkgb3RoZXIgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgcHJvZ3JhbSBleGNlcHQKK3RoYXQgaXMgcmVxdWlyZXMgdGhhdCB0aGUgT0xFOjpTdG9yYWdlIG1vZHVsZSBpcyBpbnN0YWxsZWQuCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9iaWdmaWxlLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gYmlnZmlsZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgY3JlYXRpbmcgYSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0aGF0IGlzIGxhcmdlciB0aGFuIHRoZQorICAgICMgZGVmYXVsdCA3TUIgbGltaXQuCisgICAgIworICAgICMgVGhpcyBpcyBleGFjdGx5IHRoYXQgc2FtZSBhcyBhbnkgb3RoZXIgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgcHJvZ3JhbSBleGNlcHQKKyAgICAjIHRoYXQgaXMgcmVxdWlyZXMgdGhhdCB0aGUgT0xFOjpTdG9yYWdlIG1vZHVsZSBpcyBpbnN0YWxsZWQuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBKYW4gMjAwNywgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ2JpZ2ZpbGUueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgNTAsIDE4KTsKKyAgICAKKyAgICBmb3IgbXkgJGNvbCAoMCAuLiA1MCkgeworICAgICAgICBmb3IgbXkgJHJvdyAoMCAuLiA2MDAwKSB7CisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAkY29sLCAiUm93OiAkcm93IENvbDogJGNvbCIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvYmlnZmlsZS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNnaS5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8gc2VuZCBhbiBFeGNlbAorZmlsZSB0byBhIGJyb3dzZXIgaW4gYSBDR0kgcHJvZ3JhbS4KKworT24gV2luZG93cyB0aGUgaGFzaC1iYW5nIGxpbmUgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlOgorCisgICAgIyFDOlxQZXJsXGJpblxwZXJsLmV4ZQorCitUaGUgIkNvbnRlbnQtRGlzcG9zaXRpb24iIGxpbmUgd2lsbCBjYXVzZSBhIHByb21wdCB0byBiZSBnZW5lcmF0ZWQgdG8gc2F2ZQordGhlIGZpbGUuIElmIHlvdSB3YW50IHRvIHN0cmVhbSB0aGUgZmlsZSB0byB0aGUgYnJvd3NlciBpbnN0ZWFkLCBjb21tZW50IG91dAordGhhdCBsaW5lIGFzIHNob3duIGJlbG93LgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSB0byBzZW5kIGFuIEV4Y2VsCisgICAgIyBmaWxlIHRvIGEgYnJvd3NlciBpbiBhIENHSSBwcm9ncmFtLgorICAgICMKKyAgICAjIE9uIFdpbmRvd3MgdGhlIGhhc2gtYmFuZyBsaW5lIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZToKKyAgICAjCisgICAgIyAgICAgIyFDOlxQZXJsXGJpblxwZXJsLmV4ZQorICAgICMKKyAgICAjIFRoZSAiQ29udGVudC1EaXNwb3NpdGlvbiIgbGluZSB3aWxsIGNhdXNlIGEgcHJvbXB0IHRvIGJlIGdlbmVyYXRlZCB0byBzYXZlCisgICAgIyB0aGUgZmlsZS4gSWYgeW91IHdhbnQgdG8gc3RyZWFtIHRoZSBmaWxlIHRvIHRoZSBicm93c2VyIGluc3RlYWQsIGNvbW1lbnQgb3V0CisgICAgIyB0aGF0IGxpbmUgYXMgc2hvd24gYmVsb3cuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBTZXQgdGhlIGZpbGVuYW1lIGFuZCBzZW5kIHRoZSBjb250ZW50IHR5cGUKKyAgICBteSAkZmlsZW5hbWUgPSJjZ2l0ZXN0LnhscyI7CisgICAgCisgICAgcHJpbnQgIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXG4iOworICAgICMgVGhlIENvbnRlbnQtRGlzcG9zaXRpb24gd2lsbCBnZW5lcmF0ZSBhIHByb21wdCB0byBzYXZlIHRoZSBmaWxlLiBJZiB5b3Ugd2FudAorICAgICMgdG8gc3RyZWFtIHRoZSBmaWxlIHRvIHRoZSBicm93c2VyLCBjb21tZW50IG91dCB0aGUgZm9sbG93aW5nIGxpbmUuCisgICAgcHJpbnQgIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSRmaWxlbmFtZVxuIjsKKyAgICBwcmludCAiXG4iOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQuIFRoZSBzcGVjaWFsIFBlcmwgZmlsZWhhbmRsZSAtIHdpbGwKKyAgICAjIHJlZGlyZWN0IHRoZSBvdXRwdXQgdG8gU1RET1VUCisgICAgIworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCItIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbiAxCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAwLCAyMCk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtYXQKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2JvbGQoKTsKKyAgICAkZm9ybWF0LT5zZXRfc2l6ZSgxNSk7CisgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSB0byB0aGUgd29ya2Jvb2sKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAiSGkgRXhjZWwhIiwgJGZvcm1hdCk7CisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jZ2kucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjaGFydF9hcmVhLnBsCisKKworCitBIHNpbXBsZSBkZW1vIG9mIEFyZWEgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jaGFydF9hcmVhLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY2hhcnRfYXJlYS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGRlbW8gb2YgQXJlYSBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBEZWNlbWJlciAyMDA5LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9hcmVhLnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggYm9sZCA9PiAxICk7CisgICAgCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ0NhdGVnb3J5JywgJ1ZhbHVlcyAxJywgJ1ZhbHVlcyAyJyBdOworICAgIG15ICRkYXRhID0gWworICAgICAgICBbIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgICAgIFsgMywgNiwgNywgNSwgNCwgMyBdLAorICAgIF07CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBBIG1pbmltYWwgY2hhcnQuCisgICAgIworICAgIG15ICRjaGFydDEgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYXJlYScgKTsKKyAgICAKKyAgICAjIEFkZCB2YWx1ZXMgb25seS4gVXNlIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMuCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcyggdmFsdWVzID0+ICc9U2hlZXQxISRCJDI6JEIkNycgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBBIG1pbmltYWwgY2hhcnQgd2l0aCB1c2VyIHNwZWNpZmllZCBjYXRlZ29yaWVzIChYIGF4aXMpCisgICAgIyAgICAgICAgICAgIGFuZCBhIHNlcmllcyBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQyID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2FyZWEnICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQyLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDMuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYWRkZWQgdGl0bGUgYW5kIGF4ZXMgbGFiZWxzLgorICAgICMKKyAgICBteSAkY2hhcnQzID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2FyZWEnICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQzLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDMtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0My0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQzLT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNC4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCBidXQgd2l0aCBhbiBhZGRlZCBzZXJpZXMgYW5kIHdpdGggYQorICAgICMgICAgICAgICAgICB1c2VyIHNwZWNpZmllZCBjaGFydCBzaGVldCBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIG5hbWUgPT4gJ1Jlc3VsdHMgQ2hhcnQnLCB0eXBlID0+ICdhcmVhJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhbm90aGVyIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAyJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDQtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gU2FtZSBhcyBFeGFtcGxlIDMgYnV0IGFzIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQ1ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2FyZWEnLCBlbWJlZGRlZCA9PiAxICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQ1LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDUtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NS0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIG1haW4gd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0UyJywgJGNoYXJ0NSApOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hhcnRfYXJlYS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNoYXJ0X2Jhci5wbAorCisKKworQSBzaW1wbGUgZGVtbyBvZiBCYXIgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jaGFydF9iYXIuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjaGFydF9iYXIucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBkZW1vIG9mIEJhciBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBEZWNlbWJlciAyMDA5LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9iYXIueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKyAgICAKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uCisgICAgbXkgJGhlYWRpbmdzID0gWyAnQ2F0ZWdvcnknLCAnVmFsdWVzIDEnLCAnVmFsdWVzIDInIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICAgICAgWyAzLCA2LCA3LCA1LCA0LCAzIF0sCisgICAgXTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGhlYWRpbmdzLCAkYm9sZCApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTInLCAkZGF0YSApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDEuIEEgbWluaW1hbCBjaGFydC4KKyAgICAjCisgICAgbXkgJGNoYXJ0MSA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdiYXInICk7CisgICAgCisgICAgIyBBZGQgdmFsdWVzIG9ubHkuIFVzZSB0aGUgZGVmYXVsdCBjYXRlZ29yaWVzLgorICAgICRjaGFydDEtPmFkZF9zZXJpZXMoIHZhbHVlcyA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMi4gQSBtaW5pbWFsIGNoYXJ0IHdpdGggdXNlciBzcGVjaWZpZWQgY2F0ZWdvcmllcyAoWCBheGlzKQorICAgICMgICAgICAgICAgICBhbmQgYSBzZXJpZXMgbmFtZS4KKyAgICAjCisgICAgbXkgJGNoYXJ0MiA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdiYXInICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQyLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDMuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYWRkZWQgdGl0bGUgYW5kIGF4ZXMgbGFiZWxzLgorICAgICMKKyAgICBteSAkY2hhcnQzID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2JhcicgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDMtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0My0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQzLT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDMtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0LiBTYW1lIGFzIHByZXZpb3VzIGNoYXJ0IGJ1dCB3aXRoIGFuIGFkZGVkIHNlcmllcyBhbmQgd2l0aCBhCisgICAgIyAgICAgICAgICAgIHVzZXIgc3BlY2lmaWVkIGNoYXJ0IHNoZWV0IG5hbWUuCisgICAgIworICAgIG15ICRjaGFydDQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggbmFtZSA9PiAnUmVzdWx0cyBDaGFydCcsIHR5cGUgPT4gJ2JhcicgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgYW5vdGhlciBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMicsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQ0LT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0NC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDUuIFNhbWUgYXMgRXhhbXBsZSAzIGJ1dCBhcyBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICAjCisgICAgbXkgJGNoYXJ0NSA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdiYXInLCBlbWJlZGRlZCA9PiAxICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQ1LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDUtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NS0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIG1haW4gd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0UyJywgJGNoYXJ0NSApOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hhcnRfYmFyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY2hhcnRfY29sdW1uLnBsCisKKworCitBIHNpbXBsZSBkZW1vIG9mIENvbHVtbiBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NoYXJ0X2NvbHVtbi5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGNoYXJ0X2NvbHVtbi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGRlbW8gb2YgQ29sdW1uIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIERlY2VtYmVyIDIwMDksIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X2NvbHVtbi54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworICAgIAorICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdDYXRlZ29yeScsICdWYWx1ZXMgMScsICdWYWx1ZXMgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gQSBtaW5pbWFsIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQxID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicgKTsKKyAgICAKKyAgICAjIEFkZCB2YWx1ZXMgb25seS4gVXNlIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMuCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcyggdmFsdWVzID0+ICc9U2hlZXQxISRCJDI6JEIkNycgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBBIG1pbmltYWwgY2hhcnQgd2l0aCB1c2VyIHNwZWNpZmllZCBjYXRlZ29yaWVzIChYIGF4aXMpCisgICAgIyAgICAgICAgICAgIGFuZCBhIHNlcmllcyBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQyID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDItPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMy4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCBidXQgd2l0aCBhZGRlZCB0aXRsZSBhbmQgYXhlcyBsYWJlbHMuCisgICAgIworICAgIG15ICRjaGFydDMgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnY29sdW1uJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0My0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQzLT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDMtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0My0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDQuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYW4gYWRkZWQgc2VyaWVzIGFuZCB3aXRoIGEKKyAgICAjICAgICAgICAgICAgdXNlciBzcGVjaWZpZWQgY2hhcnQgc2hlZXQgbmFtZS4KKyAgICAjCisgICAgbXkgJGNoYXJ0NCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCBuYW1lID0+ICdSZXN1bHRzIENoYXJ0JywgdHlwZSA9PiAnY29sdW1uJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhbm90aGVyIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAyJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDQtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gU2FtZSBhcyBFeGFtcGxlIDMgYnV0IGFzIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQ1ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicsIGVtYmVkZGVkID0+IDEgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDUtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0NS0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDUtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgbWFpbiB3b3Jrc2hlZXQuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRTInLCAkY2hhcnQ1ICk7CisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jaGFydF9jb2x1bW4ucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjaGFydF9saW5lLnBsCisKKworCitBIHNpbXBsZSBkZW1vIG9mIExpbmUgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jaGFydF9saW5lLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY2hhcnRfbGluZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGRlbW8gb2YgTGluZSBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBEZWNlbWJlciAyMDA5LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9saW5lLnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggYm9sZCA9PiAxICk7CisgICAgCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ0NhdGVnb3J5JywgJ1ZhbHVlcyAxJywgJ1ZhbHVlcyAyJyBdOworICAgIG15ICRkYXRhID0gWworICAgICAgICBbIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgICAgIFsgMywgNiwgNywgNSwgNCwgMyBdLAorICAgIF07CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBBIG1pbmltYWwgY2hhcnQuCisgICAgIworICAgIG15ICRjaGFydDEgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScgKTsKKyAgICAKKyAgICAjIEFkZCB2YWx1ZXMgb25seS4gVXNlIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMuCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcyggdmFsdWVzID0+ICc9U2hlZXQxISRCJDI6JEIkNycgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBBIG1pbmltYWwgY2hhcnQgd2l0aCB1c2VyIHNwZWNpZmllZCBjYXRlZ29yaWVzIChYIGF4aXMpCisgICAgIyAgICAgICAgICAgIGFuZCBhIHNlcmllcyBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQyID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2xpbmUnICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQyLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDMuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYWRkZWQgdGl0bGUgYW5kIGF4ZXMgbGFiZWxzLgorICAgICMKKyAgICBteSAkY2hhcnQzID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2xpbmUnICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQzLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDMtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0My0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQzLT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNC4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCBidXQgd2l0aCBhbiBhZGRlZCBzZXJpZXMgYW5kIHdpdGggYQorICAgICMgICAgICAgICAgICB1c2VyIHNwZWNpZmllZCBjaGFydCBzaGVldCBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIG5hbWUgPT4gJ1Jlc3VsdHMgQ2hhcnQnLCB0eXBlID0+ICdsaW5lJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhbm90aGVyIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAyJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDQtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gU2FtZSBhcyBFeGFtcGxlIDMgYnV0IGFzIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQ1ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2xpbmUnLCBlbWJlZGRlZCA9PiAxICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQ1LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDUtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NS0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIG1haW4gd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0UyJywgJGNoYXJ0NSApOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hhcnRfbGluZS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNoYXJ0X3BpZS5wbAorCisKKworQSBzaW1wbGUgZGVtbyBvZiBQaWUgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jaGFydF9waWUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjaGFydF9waWUucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBkZW1vIG9mIFBpZSBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBEZWNlbWJlciAyMDA5LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9waWUueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKyAgICAKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uCisgICAgbXkgJGhlYWRpbmdzID0gWyAnQ2F0ZWdvcnknLCAnVmFsdWVzJyBdOworICAgIG15ICRkYXRhID0gWworICAgICAgICBbICdBcHBsZScsICdDaGVycnknLCAnUGVjYW4nIF0sCisgICAgICAgIFsgNjAsICAgICAgIDMwLCAgICAgICAxMCAgICAgXSwKKyAgICBdOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gQSBtaW5pbWFsIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQxID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScgKTsKKyAgICAKKyAgICAjIEFkZCB2YWx1ZXMgb25seS4gVXNlIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMuCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcyggdmFsdWVzID0+ICc9U2hlZXQxISRCJDI6JEIkNCcgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBBIG1pbmltYWwgY2hhcnQgd2l0aCB1c2VyIHNwZWNpZmllZCBjYXRlZ29yaWVzIGFuZCBhIHNlcmllcyBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQyID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDItPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ0JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDQnLAorICAgICAgICBuYW1lICAgICAgID0+ICdQaWUgc2FsZXMgZGF0YScsCisgICAgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzLiBTYW1lIGFzIHByZXZpb3VzIGNoYXJ0IGJ1dCB3aXRoIGFuIGFkZGVkIHRpdGxlLgorICAgICMKKyAgICBteSAkY2hhcnQzID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDMtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ0JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDQnLAorICAgICAgICBuYW1lICAgICAgID0+ICdQaWUgc2FsZXMgZGF0YScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhIHRpdGxlLgorICAgICRjaGFydDMtPnNldF90aXRsZSggbmFtZSA9PiAnUG9wdWxhciBQaWUgVHlwZXMnICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNC4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCB3aXRoIGEgdXNlciBzcGVjaWZpZWQgY2hhcnQgc2hlZXQgbmFtZS4KKyAgICAjCisgICAgbXkgJGNoYXJ0NCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCBuYW1lID0+ICdSZXN1bHRzIENoYXJ0JywgdHlwZSA9PiAncGllJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDQnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1BpZSBzYWxlcyBkYXRhJywKKyAgICApOworICAgIAorICAgICMgVGhlIG90aGVyIGNoYXJ0XyoucGwgZXhhbXBsZXMgYWRkIGEgc2Vjb25kIHNlcmllcyBpbiBleGFtcGxlIDQgYnV0IGFkZGl0aW9uYWwKKyAgICAjIHNlcmllcyBhcmVuJ3QgcGxvdHRlZCBpbiBhIHBpZSBjaGFydC4KKyAgICAKKyAgICAjIEFkZCBhIHRpdGxlLgorICAgICRjaGFydDQtPnNldF90aXRsZSggbmFtZSA9PiAnUG9wdWxhciBQaWUgVHlwZXMnICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gU2FtZSBhcyBFeGFtcGxlIDMgYnV0IGFzIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQ1ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScsIGVtYmVkZGVkID0+IDEgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDUtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ0JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDQnLAorICAgICAgICBuYW1lICAgICAgID0+ICdQaWUgc2FsZXMgZGF0YScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhIHRpdGxlLgorICAgICRjaGFydDUtPnNldF90aXRsZSggbmFtZSA9PiAnUG9wdWxhciBQaWUgVHlwZXMnICk7CisgICAgCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIG1haW4gd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0QyJywgJGNoYXJ0NSApOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hhcnRfcGllLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY2hhcnRfc2NhdHRlci5wbAorCisKKworQSBzaW1wbGUgZGVtbyBvZiBTY2F0dGVyIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvY2hhcnRfc2NhdHRlci5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGNoYXJ0X3NjYXR0ZXIucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBkZW1vIG9mIFNjYXR0ZXIgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgRGVjZW1iZXIgMjAwOSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnRfc2NhdHRlci54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworICAgIAorICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdDYXRlZ29yeScsICdWYWx1ZXMgMScsICdWYWx1ZXMgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gQSBtaW5pbWFsIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQxID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3NjYXR0ZXInICk7CisgICAgCisgICAgIyBBZGQgdmFsdWVzIG9ubHkuIFVzZSB0aGUgZGVmYXVsdCBjYXRlZ29yaWVzLgorICAgICRjaGFydDEtPmFkZF9zZXJpZXMoIHZhbHVlcyA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMi4gQSBtaW5pbWFsIGNoYXJ0IHdpdGggdXNlciBzcGVjaWZpZWQgY2F0ZWdvcmllcyAoWCBheGlzKQorICAgICMgICAgICAgICAgICBhbmQgYSBzZXJpZXMgbmFtZS4KKyAgICAjCisgICAgbXkgJGNoYXJ0MiA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdzY2F0dGVyJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0Mi0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzLiBTYW1lIGFzIHByZXZpb3VzIGNoYXJ0IGJ1dCB3aXRoIGFkZGVkIHRpdGxlIGFuZCBheGVzIGxhYmVscy4KKyAgICAjCisgICAgbXkgJGNoYXJ0MyA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdzY2F0dGVyJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0My0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQzLT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDMtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0My0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDQuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYW4gYWRkZWQgc2VyaWVzIGFuZCB3aXRoIGEKKyAgICAjICAgICAgICAgICAgdXNlciBzcGVjaWZpZWQgY2hhcnQgc2hlZXQgbmFtZS4KKyAgICAjCisgICAgbXkgJGNoYXJ0NCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCBuYW1lID0+ICdSZXN1bHRzIENoYXJ0JywgdHlwZSA9PiAnc2NhdHRlcicgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgYW5vdGhlciBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMicsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQ0LT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0NC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDUuIFNhbWUgYXMgRXhhbXBsZSAzIGJ1dCBhcyBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICAjCisgICAgbXkgJGNoYXJ0NSA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdzY2F0dGVyJywgZW1iZWRkZWQgPT4gMSApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NS0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQ1LT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDUtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0NS0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgICMgSW5zZXJ0IHRoZSBjaGFydCBpbnRvIHRoZSBtYWluIHdvcmtzaGVldC4KKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfY2hhcnQoICdFMicsICRjaGFydDUgKTsKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NoYXJ0X3NjYXR0ZXIucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjaGFydF9zdG9jay5wbAorCisKKworQSBzaW1wbGUgZGVtbyBvZiBTdG9jayBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NoYXJ0X3N0b2NrLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY2hhcnRfc3RvY2sucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBkZW1vIG9mIFN0b2NrIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCfCqScpLCBKYW51YXJ5IDIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X3N0b2NrLnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNldCB1cCB0aGUgZGF0YSB3b3Jrc2hlZXQgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uIFdlIHJlYWQgdGhlIGV4YW1wbGUKKyAgICAjIGRhdGEgZnJvbSB0aGUgX19EQVRBX18gc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBUaGlzIHNpbXVsYXRlcworICAgICMgcmVhZGluZyB0aGUgZGF0YSBmcm9tIGEgZGF0YWJhc2Ugb3Igb3RoZXIgc291cmNlLgorICAgICMKKyAgICAjIFRoZSBkZWZhdWx0IEV4Y2VsIFN0b2NrIGNoYXJ0IGlzIGFuIE9wZW4tSGlnaC1Mb3ctQ2xvc2UgY2hhcnQuIFRoZXJlZm9yZQorICAgICMgd2Ugd2lsbCBuZWVkIGRhdGEgZm9yIGVhY2ggb2YgdGhvc2Ugc2VyaWVzLgorICAgICMKKyAgICAjIFRoZSBsYXlvdXQgb2YgdGhlIF9fREFUQV9fIHNlY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgbGF5b3V0IG9mIHRoZSB3b3Jrc2hlZXQuCisgICAgIworICAgIAorICAgICMgQWRkIHNvbWUgZm9ybWF0cy4KKyAgICBteSAkYm9sZCAgICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgICAgICAgPT4gMSApOworICAgIG15ICRkYXRlX2Zvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggbnVtX2Zvcm1hdCA9PiAnZGQvbW0veXl5eScgKTsKKyAgICAKKyAgICAjIEluY3JlYXNlIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIHVzZWQgZm9yIGRhdGUgdG8gbWFrZSBpdCBjbGVhcmVyLgorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oICdBOkEnLCAxMiApOworICAgIAorICAgICMgUmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBfX0RBVEFfXyBzZWN0aW9uIGF0IHRoZSBlbmQuIEluIGEgcmVhbCBleGFtcGxlIHRoaXMKKyAgICAjIHdvdWxkIHByb2JhYmx5IGJlIGEgZGF0YWJhc2UgcXVlcnkuCisgICAgbXkgQHN0b2NrX2RhdGE7CisgICAgCisgICAgd2hpbGUgKCA8REFUQT4gKSB7CisgICAgICAgIG5leHQgdW5sZXNzIC9cUy87ICAgICMgU2tpcCBibGFuayBsaW5lcy4KKyAgICAgICAgbmV4dCBpZiAvXiMvOyAgICAgICAgIyBTa2lwIGNvbW1lbnRzLgorICAgIAorICAgICAgICBwdXNoIEBzdG9ja19kYXRhLCBbc3BsaXRdOworICAgIH0KKyAgICAKKyAgICAjIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSB3b3Jrc2hlZXQuCisgICAgbXkgJHJvdyA9IDA7CisgICAgbXkgJGNvbCA9IDA7CisgICAgCisgICAgbXkgJGhlYWRlcnMgPSBzaGlmdCBAc3RvY2tfZGF0YTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJHJvdysrLCAkY29sLCAkaGVhZGVycywgJGJvbGQgKTsKKyAgICAKKyAgICBmb3IgbXkgJHN0b2NrX2RhdGEgKCBAc3RvY2tfZGF0YSApIHsKKyAgICAKKyAgICAgICAgbXkgQGRhdGEgPSBAJHN0b2NrX2RhdGE7CisgICAgICAgIG15ICRkYXRlID0gc2hpZnQgQGRhdGE7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCAkY29sLCAkZGF0ZSwgJGRhdGVfZm9ybWF0ICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCAkY29sICsgMSwgXEBkYXRhICk7CisgICAgCisgICAgICAgICRyb3crKzsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gQSBkZWZhdWx0IE9wZW4tSGlnaC1Mb3ctQ2xvc2UgY2hhcnQgd2l0aCBzZXJpZXMgbmFtZXMsIGF4ZXMgbGFiZWxzCisgICAgIyAgICAgICAgICAgIGFuZCBhIHRpdGxlLgorICAgICMKKyAgICAKKyAgICBteSAkY2hhcnQxID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3N0b2NrJyApOworICAgIAorICAgICMgQWRkIGEgc2VyaWVzIGZvciBlYWNoIG9mIHRoZSBPcGVuLUhpZ2gtTG93LUNsb3NlIGNvbHVtbnMuIFRoZSBjYXRlZ29yaWVzIGFyZQorICAgICMgdGhlIGRhdGVzIGluIHRoZSBmaXJzdCBjb2x1bW4uCisgICAgCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDEwJywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnT3BlbicsCisgICAgKTsKKyAgICAKKyAgICAkY2hhcnQxLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkMTAnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkMTAnLAorICAgICAgICBuYW1lICAgICAgID0+ICdIaWdoJywKKyAgICApOworICAgIAorICAgICRjaGFydDEtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQxMCcsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEQkMjokRCQxMCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ0xvdycsCisgICAgKTsKKyAgICAKKyAgICAkY2hhcnQxLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkMTAnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRFJDI6JEUkMTAnLAorICAgICAgICBuYW1lICAgICAgID0+ICdDbG9zZScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhIGNoYXJ0IHRpdGxlIGFuZCBheGVzIGxhYmVscy4KKyAgICAkY2hhcnQxLT5zZXRfdGl0bGUoIG5hbWUgPT4gJ09wZW4tSGlnaC1Mb3ctQ2xvc2UnLCApOworICAgICRjaGFydDEtPnNldF94X2F4aXMoIG5hbWUgPT4gJ0RhdGUnLCApOworICAgICRjaGFydDEtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NoYXJlIHByaWNlJywgKTsKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBTYW1lIGFzIHRoZSBwcmV2aW91cyBhcyBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICAjCisgICAgCisgICAgbXkgJGNoYXJ0MiA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdzdG9jaycsIGVtYmVkZGVkID0+IDEgKTsKKyAgICAKKyAgICAjIEFkZCBhIHNlcmllcyBmb3IgZWFjaCBvZiB0aGUgT3Blbi1IaWdoLUxvdy1DbG9zZSBjb2x1bW5zLiBUaGUgY2F0ZWdvcmllcyBhcmUKKyAgICAjIHRoZSBkYXRlcyBpbiB0aGUgZmlyc3QgY29sdW1uLgorICAgIAorICAgICRjaGFydDItPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQxMCcsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQxMCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ09wZW4nLAorICAgICk7CisgICAgCisgICAgJGNoYXJ0Mi0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDEwJywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnSGlnaCcsCisgICAgKTsKKyAgICAKKyAgICAkY2hhcnQyLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkMTAnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISREJDI6JEQkMTAnLAorICAgICAgICBuYW1lICAgICAgID0+ICdMb3cnLAorICAgICk7CisgICAgCisgICAgJGNoYXJ0Mi0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkRSQyOiRFJDEwJywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnQ2xvc2UnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgYSBjaGFydCB0aXRsZSBhbmQgYXhlcyBsYWJlbHMuCisgICAgJGNoYXJ0Mi0+c2V0X3RpdGxlKCBuYW1lID0+ICdPcGVuLUhpZ2gtTG93LUNsb3NlJywgKTsKKyAgICAkY2hhcnQyLT5zZXRfeF9heGlzKCBuYW1lID0+ICdEYXRlJywgKTsKKyAgICAkY2hhcnQyLT5zZXRfeV9heGlzKCBuYW1lID0+ICdTaGFyZSBwcmljZScsICk7CisgICAgCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIG1haW4gd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0cyJywgJGNoYXJ0MiApOworICAgIAorICAgIAorICAgIF9fREFUQV9fCisgICAgIyBTb21lIHNhbXBsZSBzdG9jayBkYXRhIHVzZWQgZm9yIGNoYXJ0aW5nLgorICAgIERhdGUgICAgICAgIE9wZW4gICAgSGlnaCAgICBMb3cgICAgIENsb3NlCisgICAgMjAwOS0wOC0xOSAgMTAwLjAwICAxMDQuMDYgIDk1Ljk2ICAgMTAwLjM0CisgICAgMjAwOS0wOC0yMCAgMTAxLjAxICAxMDkuMDggIDEwMC41MCAgMTA4LjMxCisgICAgMjAwOS0wOC0yMyAgMTEwLjc1ICAxMTMuNDggIDEwOS4wNSAgMTA5LjQwCisgICAgMjAwOS0wOC0yNCAgMTExLjI0ICAxMTEuNjAgIDEwMy41NyAgMTA0Ljg3CisgICAgMjAwOS0wOC0yNSAgMTA0Ljk2ICAxMDguMDAgIDEwMy44OCAgMTA2LjAwCisgICAgMjAwOS0wOC0yNiAgMTA0Ljk1ICAxMDcuOTUgIDEwNC42NiAgMTA3LjkxCisgICAgMjAwOS0wOC0yNyAgMTA4LjEwICAxMDguNjIgIDEwNS42OSAgMTA2LjE1CisgICAgMjAwOS0wOC0zMCAgMTA1LjI4ICAxMDUuNDkgIDEwMi4wMSAgMTAyLjAxCisgICAgMjAwOS0wOC0zMSAgMTAyLjMwICAxMDMuNzEgIDEwMi4xNiAgMTAyLjM3CisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NoYXJ0X3N0b2NrLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY2hlc3MucGwKKworCisKK0V4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHZpYQorcHJvcGVydHkgaGFzaGVzLgorCitTZXR0aW5nIGZvcm1hdCBwcm9wZXJ0aWVzIHZpYSBoYXNoZXMgb2YgdmFsdWVzIGlzIHVzZWZ1bCB3aGVuIHlvdSBoYXZlCit0byBkZWFsIHdpdGggYSBsYXJnZSBudW1iZXIgb2Ygc2ltaWxhciBmb3JtYXRzLiBDb25zaWRlciBmb3IgZXhhbXBsZSBhCitjaGVzcyBib2FyZCBwYXR0ZXJuIHdpdGggYmxhY2sgc3F1YXJlcywgd2hpdGUgdW5mb3JtYXR0ZWQgc3F1YXJlcyBhbmQKK2EgYm9yZGVyLgorCitUaGlzIHJlbGF0aXZlbHkgc2ltcGxlIGV4YW1wbGUgcmVxdWlyZXMgMTQgc2VwYXJhdGUgRm9ybWF0CitvYmplY3RzIGFsdGhvdWdoIHRoZXJlIGFyZSBvbmx5IDUgZGlmZmVyZW50IHByb3BlcnRpZXM6IGJsYWNrCitiYWNrZ3JvdW5kLCB0b3AgYm9yZGVyLCBib3R0b20gYm9yZGVyLCBsZWZ0IGJvcmRlciBhbmQgcmlnaHQgYm9yZGVyLgorCitVc2luZyBwcm9wZXJ0eSBoYXNoZXMgaXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIHRoZXNlIDUgc2V0cyBvZgorcHJvcGVydGllcyBhbmQgdGhlbiBhZGQgdGhlbSB0b2dldGhlciB0byBjcmVhdGUgdGhlIDE0IEZvcm1hdAorY29uZmlndXJhdGlvbnMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NoZXNzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY2hlc3MucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHZpYQorICAgICMgcHJvcGVydHkgaGFzaGVzLgorICAgICMKKyAgICAjIFNldHRpbmcgZm9ybWF0IHByb3BlcnRpZXMgdmlhIGhhc2hlcyBvZiB2YWx1ZXMgaXMgdXNlZnVsIHdoZW4geW91IGhhdmUKKyAgICAjIHRvIGRlYWwgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBzaW1pbGFyIGZvcm1hdHMuIENvbnNpZGVyIGZvciBleGFtcGxlIGEKKyAgICAjIGNoZXNzIGJvYXJkIHBhdHRlcm4gd2l0aCBibGFjayBzcXVhcmVzLCB3aGl0ZSB1bmZvcm1hdHRlZCBzcXVhcmVzIGFuZAorICAgICMgYSBib3JkZXIuCisgICAgIworICAgICMgVGhpcyByZWxhdGl2ZWx5IHNpbXBsZSBleGFtcGxlIHJlcXVpcmVzIDE0IHNlcGFyYXRlIEZvcm1hdAorICAgICMgb2JqZWN0cyBhbHRob3VnaCB0aGVyZSBhcmUgb25seSA1IGRpZmZlcmVudCBwcm9wZXJ0aWVzOiBibGFjaworICAgICMgYmFja2dyb3VuZCwgdG9wIGJvcmRlciwgYm90dG9tIGJvcmRlciwgbGVmdCBib3JkZXIgYW5kIHJpZ2h0IGJvcmRlci4KKyAgICAjCisgICAgIyBVc2luZyBwcm9wZXJ0eSBoYXNoZXMgaXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIHRoZXNlIDUgc2V0cyBvZgorICAgICMgcHJvcGVydGllcyBhbmQgdGhlbiBhZGQgdGhlbSB0b2dldGhlciB0byBjcmVhdGUgdGhlIDE0IEZvcm1hdAorICAgICMgY29uZmlndXJhdGlvbnMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBKdWx5IDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiY2hlc3MueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgU29tZSByb3cgYW5kIGNvbHVtbiBmb3JtYXR0aW5nCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQjpJJywgMTApOworICAgIAorICAgIGZvciBteSAkaSAoMS4uOCkgeworICAgICAgICAkd29ya3NoZWV0LT5zZXRfcm93KCRpLCA1MCk7CisgICAgfQorICAgIAorICAgIAorICAgICMgRGVmaW5lIHRoZSBwcm9wZXJ0eSBoYXNoZXMKKyAgICAjCisgICAgbXkgJWJsYWNrID0gKAorICAgICAgICAgICAgICAgICAgICAnZmdfY29sb3InICA9PiAnYmxhY2snLAorICAgICAgICAgICAgICAgICAgICAncGF0dGVybicgICA9PiAxLAorICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgbXkgJXRvcCAgICAgPSAoICd0b3AnICAgID0+IDYgKTsKKyAgICBteSAlYm90dG9tICA9ICggJ2JvdHRvbScgPT4gNiApOworICAgIG15ICVsZWZ0ICAgID0gKCAnbGVmdCcgICA9PiA2ICk7CisgICAgbXkgJXJpZ2h0ICAgPSAoICdyaWdodCcgID0+IDYgKTsKKyAgICAKKyAgICAKKyAgICAjIERlZmluZSB0aGUgZm9ybWF0cworICAgICMKKyAgICBteSAkZm9ybWF0MDEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXRvcCwgICAgJWxlZnQgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXRvcCwgICAgJWJsYWNrICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDMgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXRvcCwgICAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXRvcCwgICAgJXJpZ2h0LCAlYmxhY2sgKTsKKyAgICAKKyAgICBteSAkZm9ybWF0MDUgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWxlZnQgICAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDYgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWJsYWNrICAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDcgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDggPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXJpZ2h0LCAgJWJsYWNrICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDkgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXJpZ2h0ICAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MTAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWxlZnQsICAgJWJsYWNrICAgICAgICAgKTsKKyAgICAKKyAgICBteSAkZm9ybWF0MTEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWJvdHRvbSwgJWxlZnQsICAlYmxhY2sgKTsKKyAgICBteSAkZm9ybWF0MTIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWJvdHRvbSAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MTMgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWJvdHRvbSwgJWJsYWNrICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MTQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWJvdHRvbSwgJXJpZ2h0ICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAjIERyYXcgdGhlIHBhdHRlcm4KKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjInLCAnJywgJGZvcm1hdDAxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzInLCAnJywgJGZvcm1hdDAyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDInLCAnJywgJGZvcm1hdDAzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTInLCAnJywgJGZvcm1hdDAyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjInLCAnJywgJGZvcm1hdDAzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzInLCAnJywgJGZvcm1hdDAyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDInLCAnJywgJGZvcm1hdDAzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTInLCAnJywgJGZvcm1hdDA0KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjMnLCAnJywgJGZvcm1hdDEwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzMnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDMnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTMnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjMnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzMnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDMnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTMnLCAnJywgJGZvcm1hdDA5KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjQnLCAnJywgJGZvcm1hdDA1KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzQnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDQnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTQnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjQnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzQnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDQnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTQnLCAnJywgJGZvcm1hdDA4KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjUnLCAnJywgJGZvcm1hdDEwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzUnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDUnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTUnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjUnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzUnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDUnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTUnLCAnJywgJGZvcm1hdDA5KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjYnLCAnJywgJGZvcm1hdDA1KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzYnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDYnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTYnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjYnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzYnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDYnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTYnLCAnJywgJGZvcm1hdDA4KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjcnLCAnJywgJGZvcm1hdDEwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzcnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDcnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTcnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjcnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzcnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDcnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTcnLCAnJywgJGZvcm1hdDA5KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjgnLCAnJywgJGZvcm1hdDA1KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzgnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDgnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTgnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjgnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzgnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDgnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTgnLCAnJywgJGZvcm1hdDA4KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjknLCAnJywgJGZvcm1hdDExKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzknLCAnJywgJGZvcm1hdDEyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDknLCAnJywgJGZvcm1hdDEzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTknLCAnJywgJGZvcm1hdDEyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjknLCAnJywgJGZvcm1hdDEzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzknLCAnJywgJGZvcm1hdDEyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDknLCAnJywgJGZvcm1hdDEzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTknLCAnJywgJGZvcm1hdDE0KTsKKyAgICAKKyAgICAKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hlc3MucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjb2xvcnMucGwKKworCisKK0RlbW9uc3RyYXRlcyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCdzIG5hbWVkIGNvbG9ycyBhbmQgdGhlIEV4Y2VsIGNvbG9yCitwYWxldHRlLgorCitUaGUgc2V0X2N1c3RvbV9jb2xvcigpIFdvcmtzaGVldCBtZXRob2QgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgb25lIG9mIHRoZQorYnVpbHQtaW4gcGFsZXR0ZSB2YWx1ZXMgd2l0aCBhIG1vcmUgc3VpdGFibGUgY29sb3VyLiBTZWUgdGhlIG1haW4gZG9jcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvY29sb3JzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY29sb3JzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIERlbW9uc3RyYXRlcyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCdzIG5hbWVkIGNvbG9ycyBhbmQgdGhlIEV4Y2VsIGNvbG9yCisgICAgIyBwYWxldHRlLgorICAgICMKKyAgICAjIFRoZSBzZXRfY3VzdG9tX2NvbG9yKCkgV29ya3NoZWV0IG1ldGhvZCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBvbmUgb2YgdGhlCisgICAgIyBidWlsdC1pbiBwYWxldHRlIHZhbHVlcyB3aXRoIGEgbW9yZSBzdWl0YWJsZSBjb2xvdXIuIFNlZSB0aGUgbWFpbiBkb2NzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImNvbG9ycy54bHMiKTsKKyAgICAKKyAgICAjIFNvbWUgY29tbW9uIGZvcm1hdHMKKyAgICBteSAkY2VudGVyICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChhbGlnbiA9PiAnY2VudGVyJyk7CisgICAgbXkgJGhlYWRpbmcgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoYWxpZ24gPT4gJ2NlbnRlcicsIGJvbGQgPT4gMSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIERlbW9uc3RyYXRlIHRoZSBuYW1lZCBjb2xvcnMuCisgICAgIworICAgIAorICAgIG15ICVjb2xvcnMgPSAoCisgICAgICAgICAgICAgICAgICAgIDB4MDgsICdibGFjaycsCisgICAgICAgICAgICAgICAgICAgIDB4MEMsICdibHVlJywKKyAgICAgICAgICAgICAgICAgICAgMHgxMCwgJ2Jyb3duJywKKyAgICAgICAgICAgICAgICAgICAgMHgwRiwgJ2N5YW4nLAorICAgICAgICAgICAgICAgICAgICAweDE3LCAnZ3JheScsCisgICAgICAgICAgICAgICAgICAgIDB4MTEsICdncmVlbicsCisgICAgICAgICAgICAgICAgICAgIDB4MEIsICdsaW1lJywKKyAgICAgICAgICAgICAgICAgICAgMHgwRSwgJ21hZ2VudGEnLAorICAgICAgICAgICAgICAgICAgICAweDEyLCAnbmF2eScsCisgICAgICAgICAgICAgICAgICAgIDB4MzUsICdvcmFuZ2UnLAorICAgICAgICAgICAgICAgICAgICAweDIxLCAncGluaycsCisgICAgICAgICAgICAgICAgICAgIDB4MTQsICdwdXJwbGUnLAorICAgICAgICAgICAgICAgICAgICAweDBBLCAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgMHgxNiwgJ3NpbHZlcicsCisgICAgICAgICAgICAgICAgICAgIDB4MDksICd3aGl0ZScsCisgICAgICAgICAgICAgICAgICAgIDB4MEQsICd5ZWxsb3cnLAorICAgICAgICAgICAgICAgICApOworICAgIAorICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdOYW1lZCBjb2xvcnMnKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+c2V0X2NvbHVtbigwLCAzLCAxNSk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsIDAsICJJbmRleCIsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoMCwgMSwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgwLCAyLCAiTmFtZSIsICAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsIDMsICJDb2xvciIsICRoZWFkaW5nKTsKKyAgICAKKyAgICBteSAkaSA9IDE7CisgICAgCisgICAgd2hpbGUgKG15KCRpbmRleCwgJGNvbG9yKSA9IGVhY2ggJWNvbG9ycykgeworICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZ19jb2xvciA9PiAkY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgID0+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDEtPndyaXRlKCRpKzEsIDAsICRpbmRleCwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAkd29ya3NoZWV0MS0+d3JpdGUoJGkrMSwgMSwgc3ByaW50ZigiMHglMDJYIiwgJGluZGV4KSwgJGNlbnRlcik7CisgICAgICAgICR3b3Jrc2hlZXQxLT53cml0ZSgkaSsxLCAyLCAkY29sb3IsICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgJHdvcmtzaGVldDEtPndyaXRlKCRpKzEsIDMsICcnLCAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQpOworICAgICAgICAkaSsrOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIHN0YW5kYXJkIEV4Y2VsIGNvbG9ycyBpbiB0aGUgcmFuZ2UgOC4uNjMuCisgICAgIworICAgIAorICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdTdGFuZGFyZCBjb2xvcnMnKTsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2NvbHVtbigwLCAzLCAxNSk7CisgICAgCisgICAgJHdvcmtzaGVldDItPndyaXRlKDAsIDAsICJJbmRleCIsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoMCwgMSwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgwLCAyLCAiQ29sb3IiLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKDAsIDMsICJOYW1lIiwgICRoZWFkaW5nKTsKKyAgICAKKyAgICBmb3IgbXkgJGkgKDguLjYzKSB7CisgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnX2NvbG9yID0+ICRpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICA9PiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQyLT53cml0ZSgoJGkgLTcpLCAwLCAkaSwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAkd29ya3NoZWV0Mi0+d3JpdGUoKCRpIC03KSwgMSwgc3ByaW50ZigiMHglMDJYIiwgJGkpLCAkY2VudGVyKTsKKyAgICAgICAgJHdvcmtzaGVldDItPndyaXRlKCgkaSAtNyksIDIsICcnLCAgICAgICAgICAgICAgICAgICAgJGZvcm1hdCk7CisgICAgCisgICAgICAgICMgQWRkIHRoZSAgY29sb3IgbmFtZXMKKyAgICAgICAgaWYgKGV4aXN0cyAkY29sb3JzeyRpfSkgeworICAgICAgICAgICAgJHdvcmtzaGVldDItPndyaXRlKCgkaSAtNyksIDMsICRjb2xvcnN7JGl9LCAkY2VudGVyKTsKKyAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NvbG9ycy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNvbW1lbnRzMS5wbAorCisKKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB3cml0aW5nIGNlbGwgY29tbWVudHMuCisKK0EgY2VsbCBjb21tZW50IGlzIGluZGljYXRlZCBpbiBFeGNlbCBieSBhIHNtYWxsIHJlZCB0cmlhbmdsZSBpbiB0aGUgdXBwZXIKK3JpZ2h0LWhhbmQgY29ybmVyIG9mIHRoZSBjZWxsLgorCitGb3IgbW9yZSBhZHZhbmNlZCBjb21tZW50IG9wdGlvbnMgc2VlIGNvbW1lbnRzMi5wbC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvY29tbWVudHMxLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY29tbWVudHMxLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB3cml0aW5nIGNlbGwgY29tbWVudHMuCisgICAgIworICAgICMgQSBjZWxsIGNvbW1lbnQgaXMgaW5kaWNhdGVkIGluIEV4Y2VsIGJ5IGEgc21hbGwgcmVkIHRyaWFuZ2xlIGluIHRoZSB1cHBlcgorICAgICMgcmlnaHQtaGFuZCBjb3JuZXIgb2YgdGhlIGNlbGwuCisgICAgIworICAgICMgRm9yIG1vcmUgYWR2YW5jZWQgY29tbWVudCBvcHRpb25zIHNlZSBjb21tZW50czIucGwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBOb3ZlbWJlciAyMDA1LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImNvbW1lbnRzMS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUgICAgICAgICgnQTEnLCAnSGVsbG8nICAgICAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdBMScsICdUaGlzIGlzIGEgY29tbWVudCcpOworICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY29tbWVudHMxLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY29tbWVudHMyLnBsCisKKworCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHdyaXRpbmcgY2VsbCBjb21tZW50cy4KKworQSBjZWxsIGNvbW1lbnQgaXMgaW5kaWNhdGVkIGluIEV4Y2VsIGJ5IGEgc21hbGwgcmVkIHRyaWFuZ2xlIGluIHRoZSB1cHBlcgorcmlnaHQtaGFuZCBjb3JuZXIgb2YgdGhlIGNlbGwuCisKK0VhY2ggb2YgdGhlIHdvcmtzaGVldHMgZGVtb25zdHJhdGVzIGRpZmZlcmVudCBmZWF0dXJlcyBvZiBjZWxsIGNvbW1lbnRzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jb21tZW50czIuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjb21tZW50czIucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHdyaXRpbmcgY2VsbCBjb21tZW50cy4KKyAgICAjCisgICAgIyBBIGNlbGwgY29tbWVudCBpcyBpbmRpY2F0ZWQgaW4gRXhjZWwgYnkgYSBzbWFsbCByZWQgdHJpYW5nbGUgaW4gdGhlIHVwcGVyCisgICAgIyByaWdodC1oYW5kIGNvcm5lciBvZiB0aGUgY2VsbC4KKyAgICAjCisgICAgIyBFYWNoIG9mIHRoZSB3b3Jrc2hlZXRzIGRlbW9uc3RyYXRlcyBkaWZmZXJlbnQgZmVhdHVyZXMgb2YgY2VsbCBjb21tZW50cy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE5vdmVtYmVyIDIwMDUsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImNvbW1lbnRzMi54bHMiKTsKKyAgICBteSAkdGV4dF93cmFwICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCh0ZXh0X3dyYXAgPT4gMSwgdmFsaWduID0+ICd0b3AnKTsKKyAgICBteSAkd29ya3NoZWV0MSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDMgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0NCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQ1ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDYgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0NyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQ4ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBWYXJpYWJsZXMgdGhhdCB3ZSB3aWxsIHVzZSBpbiBlYWNoIGV4YW1wbGUuCisgICAgbXkgJGNlbGxfdGV4dCA9ICcnOworICAgIG15ICRjb21tZW50ICAgPSAnJzsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBEZW1vbnN0cmF0ZXMgYSBzaW1wbGUgY2VsbCBjb21tZW50IHdpdGhvdXQgZm9ybWF0dGluZyBhbmQgVW5pY29kZQorICAgICMgICAgICAgICAgICBjb21tZW50cyBlbmNvZGVkIGFzIFVURi0xNiBhbmQgYXMgVVRGLTguCisgICAgIworICAgIAorICAgICMgU2V0IHVwIHNvbWUgZm9ybWF0dGluZy4KKyAgICAkd29ya3NoZWV0MS0+c2V0X2NvbHVtbignQzpDJywgMjUpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDIsIDUwKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg1LCA1MCk7CisgICAgCisgICAgCisgICAgIyBTaW1wbGUgYXNjaWkgc3RyaW5nLgorICAgICRjZWxsX3RleHQgPSAnSG9sZCB0aGUgbW91c2Ugb3ZlciB0aGlzIGNlbGwgdG8gc2VlIHRoZSBjb21tZW50Lic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdUaGlzIGlzIGEgY29tbWVudC4nOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSAgICAgICAgKCdDMycsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQxLT53cml0ZV9jb21tZW50KCdDMycsICRjb21tZW50KTsKKyAgICAKKyAgICAKKyAgICAjIFVURi0xNiBzdHJpbmcuCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGlzIGEgVVRGLTE2IGNvbW1lbnQuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gcGFjayAibiIsIDB4MjYzYTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUgICAgICAgICgnQzYnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGVfY29tbWVudCgnQzYnLCAkY29tbWVudCwgZW5jb2RpbmcgPT4gMSk7CisgICAgCisgICAgCisgICAgIyBVVEYtOCBzdHJpbmcgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDgsIDUwKTsKKyAgICAgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGlzIGEgVVRGLTggc3RyaW5nLic7CisgICAgICAgICRjb21tZW50ICAgPSBjaHIgMHgyNjNhOworICAgIAorICAgICAgICAkd29ya3NoZWV0MS0+d3JpdGUgICAgICAgICgnQzknLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAgICAgJHdvcmtzaGVldDEtPndyaXRlX2NvbW1lbnQoJ0M5JywgJGNvbW1lbnQpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBEZW1vbnN0cmF0ZXMgdmlzaWJsZSBhbmQgaGlkZGVuIGNvbW1lbnRzLgorICAgICMKKyAgICAKKyAgICAjIFNldCB1cCBzb21lIGZvcm1hdHRpbmcuCisgICAgJHdvcmtzaGVldDItPnNldF9jb2x1bW4oJ0M6QycsIDI1KTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygyLCA1MCk7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNSwgNTApOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaXMgdmlzaWJsZS4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUgICAgICAgICgnQzMnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGVfY29tbWVudCgnQzMnLCAkY29tbWVudCwgdmlzaWJsZSA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gIlRoaXMgY2VsbCBjb21tZW50IGlzbid0IHZpc2libGUgKHRoZSBkZWZhdWx0KS4iOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUgICAgICAgICgnQzYnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGVfY29tbWVudCgnQzYnLCAkY29tbWVudCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMy4gRGVtb25zdHJhdGVzIHZpc2libGUgYW5kIGhpZGRlbiBjb21tZW50cyBzZXQgYXQgdGhlIHdvcmtzaGVldAorICAgICMgICAgICAgICAgICBsZXZlbC4KKyAgICAjCisgICAgCisgICAgIyBTZXQgdXAgc29tZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdDOkMnLCAyNSk7CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coMiwgNTApOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDUsIDUwKTsKKyAgICAkd29ya3NoZWV0My0+c2V0X3Jvdyg4LCA1MCk7CisgICAgCisgICAgIyBNYWtlIGFsbCBjb21tZW50cyBvbiB0aGUgd29ya3NoZWV0IHZpc2libGUuCisgICAgJHdvcmtzaGVldDMtPnNob3dfY29tbWVudHMoKTsKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGlzIHZpc2libGUsIGV4cGxpY2l0bHkuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDMtPndyaXRlICAgICAgICAoJ0MzJywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQsIHZpc2libGUgPT4gMSk7CisgICAgCisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBpcyBhbHNvIHZpc2libGUgYmVjYXVzZSAnLgorICAgICAgICAgICAgICAgICAnd2UgdXNlZCBzaG93X2NvbW1lbnRzKCkuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDMtPndyaXRlICAgICAgICAoJ0M2JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlX2NvbW1lbnQoJ0M2JywgJGNvbW1lbnQpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnSG93ZXZlciwgd2UgY2FuIHN0aWxsIG92ZXJyaWRlIGl0IGxvY2FsbHkuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDMtPndyaXRlICAgICAgICAoJ0M5JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlX2NvbW1lbnQoJ0M5JywgJGNvbW1lbnQsIHZpc2libGUgPT4gMCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNC4gRGVtb25zdHJhdGVzIGNoYW5nZXMgdG8gdGhlIGNvbW1lbnQgYm94IGRpbWVuc2lvbnMuCisgICAgIworICAgIAorICAgICMgU2V0IHVwIHNvbWUgZm9ybWF0dGluZy4KKyAgICAkd29ya3NoZWV0NC0+c2V0X2NvbHVtbignQzpDJywgMjUpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDIsICA1MCk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coNSwgIDUwKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3Jvdyg4LCAgNTApOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDE1LCA1MCk7CisgICAgCisgICAgJHdvcmtzaGVldDQtPnNob3dfY29tbWVudHMoKTsKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGlzIGRlZmF1bHQgc2l6ZS4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+d3JpdGUgICAgICAgICgnQzMnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0NC0+d3JpdGVfY29tbWVudCgnQzMnLCAkY29tbWVudCk7CisgICAgCisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBpcyB0d2ljZSBhcyB3aWRlLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT53cml0ZSAgICAgICAgKCdDNicsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ0LT53cml0ZV9jb21tZW50KCdDNicsICRjb21tZW50LCB4X3NjYWxlID0+IDIpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaXMgdHdpY2UgYXMgaGlnaC4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+d3JpdGUgICAgICAgICgnQzknLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0NC0+d3JpdGVfY29tbWVudCgnQzknLCAkY29tbWVudCwgeV9zY2FsZSA9PiAyKTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGlzIHNjYWxlZCBpbiBib3RoIGRpcmVjdGlvbnMuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDQtPndyaXRlICAgICAgICAoJ0MxNicsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ0LT53cml0ZV9jb21tZW50KCdDMTYnLCAkY29tbWVudCwgeF9zY2FsZSA9PiAxLjIsIHlfc2NhbGUgPT4gMC44KTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGhhcyB3aWR0aCBhbmQgaGVpZ2h0IHNwZWNpZmllZCBpbiBwaXhlbHMuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDQtPndyaXRlICAgICAgICAoJ0MxOScsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ0LT53cml0ZV9jb21tZW50KCdDMTknLCAkY29tbWVudCwgd2lkdGggPT4gMjAwLCBoZWlnaHQgPT4gMjApOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDUuIERlbW9uc3RyYXRlcyBjaGFuZ2VzIHRvIHRoZSBjZWxsIGNvbW1lbnQgcG9zaXRpb24uCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQ1LT5zZXRfY29sdW1uKCdDOkMnLCAyNSk7CisgICAgJHdvcmtzaGVldDUtPnNldF9yb3coMiwgNTApOworICAgICR3b3Jrc2hlZXQ1LT5zZXRfcm93KDUsIDUwKTsKKyAgICAkd29ya3NoZWV0NS0+c2V0X3Jvdyg4LCA1MCk7CisgICAgJHdvcmtzaGVldDUtPnNldF9yb3coMTEsIDUwKTsKKyAgICAKKyAgICAkd29ya3NoZWV0NS0+c2hvd19jb21tZW50cygpOworICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaXMgaW4gdGhlIGRlZmF1bHQgcG9zaXRpb24uJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDUtPndyaXRlICAgICAgICAoJ0MzJywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDUtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaGFzIGJlZW4gbW92ZWQgdG8gYW5vdGhlciBjZWxsLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ1LT53cml0ZSAgICAgICAgKCdDNicsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ1LT53cml0ZV9jb21tZW50KCdDNicsICRjb21tZW50LCBzdGFydF9jZWxsID0+ICdFNCcpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaGFzIGJlZW4gbW92ZWQgdG8gYW5vdGhlciBjZWxsLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ1LT53cml0ZSAgICAgICAgKCdDOScsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ1LT53cml0ZV9jb21tZW50KCdDOScsICRjb21tZW50LCBzdGFydF9yb3cgPT4gOCwgc3RhcnRfY29sID0+IDQpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaGFzIGJlZW4gc2hpZnRlZCB3aXRoaW4gaXRzIGRlZmF1bHQgY2VsbC4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0NS0+d3JpdGUgICAgICAgICgnQzEyJywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDUtPndyaXRlX2NvbW1lbnQoJ0MxMicsICRjb21tZW50LCB4X29mZnNldCA9PiAzMCwgeV9vZmZzZXQgPT4gMTIpOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDYuIERlbW9uc3RyYXRlcyBjaGFuZ2VzIHRvIHRoZSBjb21tZW50IGJhY2tncm91bmQgY29sb3VyLgorICAgICMKKyAgICAKKyAgICAkd29ya3NoZWV0Ni0+c2V0X2NvbHVtbignQzpDJywgMjUpOworICAgICR3b3Jrc2hlZXQ2LT5zZXRfcm93KDIsIDUwKTsKKyAgICAkd29ya3NoZWV0Ni0+c2V0X3Jvdyg1LCA1MCk7CisgICAgJHdvcmtzaGVldDYtPnNldF9yb3coOCwgNTApOworICAgIAorICAgICR3b3Jrc2hlZXQ2LT5zaG93X2NvbW1lbnRzKCk7CisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBoYXMgYSBkaWZmZXJlbnQgY29sb3VyLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ2LT53cml0ZSAgICAgICAgKCdDMycsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ2LT53cml0ZV9jb21tZW50KCdDMycsICRjb21tZW50LCBjb2xvciA9PiAnZ3JlZW4nKTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGhhcyB0aGUgZGVmYXVsdCBjb2xvdXIuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDYtPndyaXRlICAgICAgICAoJ0M2JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDYtPndyaXRlX2NvbW1lbnQoJ0M2JywgJGNvbW1lbnQpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaGFzIGEgZGlmZmVyZW50IGNvbG91ci4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0Ni0+d3JpdGUgICAgICAgICgnQzknLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0Ni0+d3JpdGVfY29tbWVudCgnQzknLCAkY29tbWVudCwgY29sb3IgPT4gMHgzNSk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNy4gRGVtb25zdHJhdGVzIGhvdyB0byBzZXQgdGhlIGNlbGwgY29tbWVudCBhdXRob3IuCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQ3LT5zZXRfY29sdW1uKCdDOkMnLCAzMCk7CisgICAgJHdvcmtzaGVldDctPnNldF9yb3coMiwgIDUwKTsKKyAgICAkd29ya3NoZWV0Ny0+c2V0X3Jvdyg1LCAgNTApOworICAgICR3b3Jrc2hlZXQ3LT5zZXRfcm93KDgsICA1MCk7CisgICAgJHdvcmtzaGVldDctPnNldF9yb3coMTEsIDUwKTsKKyAgICAKKyAgICBteSAkYXV0aG9yID0gJyc7CisgICAgbXkgJGNlbGwgICA9ICdDMyc7CisgICAgCisgICAgJGNlbGxfdGV4dCA9ICJNb3ZlIHRoZSBtb3VzZSBvdmVyIHRoaXMgY2VsbCBhbmQgeW91IHdpbGwgc2VlICdDZWxsIGNvbW1lbnRlZCAiLgorICAgICAgICAgICAgICAgICAiYnkgJGF1dGhvcicgKGJsYW5rKSBpbiB0aGUgc3RhdHVzIGJhciBhdCB0aGUgYm90dG9tIjsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDctPndyaXRlICAgICAgICAoJGNlbGwsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ3LT53cml0ZV9jb21tZW50KCRjZWxsLCAkY29tbWVudCk7CisgICAgCisgICAgCisgICAgJGF1dGhvciAgICA9ICdQZXJsJzsKKyAgICAkY2VsbCAgICAgID0gJ0M2JzsKKyAgICAkY2VsbF90ZXh0ID0gIk1vdmUgdGhlIG1vdXNlIG92ZXIgdGhpcyBjZWxsIGFuZCB5b3Ugd2lsbCBzZWUgJ0NlbGwgY29tbWVudGVkICIuCisgICAgICAgICAgICAgICAgICJieSAkYXV0aG9yJyBpbiB0aGUgc3RhdHVzIGJhciBhdCB0aGUgYm90dG9tIjsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDctPndyaXRlICAgICAgICAoJGNlbGwsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ3LT53cml0ZV9jb21tZW50KCRjZWxsLCAkY29tbWVudCwgYXV0aG9yID0+ICRhdXRob3IpOworICAgIAorICAgIAorICAgICRhdXRob3IgICAgPSBwYWNrICJuIiwgMHgyMEFDOyAjIFVURi0xNiBFdXJvCisgICAgJGNlbGwgICAgICA9ICdDOSc7CisgICAgJGNlbGxfdGV4dCA9ICJNb3ZlIHRoZSBtb3VzZSBvdmVyIHRoaXMgY2VsbCBhbmQgeW91IHdpbGwgc2VlICdDZWxsIGNvbW1lbnRlZCAiLgorICAgICAgICAgICAgICAgICAiYnkgRXVybycgaW4gdGhlIHN0YXR1cyBiYXIgYXQgdGhlIGJvdHRvbSI7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ3LT53cml0ZSAgICAgICAgKCRjZWxsLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0Ny0+d3JpdGVfY29tbWVudCgkY2VsbCwgJGNvbW1lbnQsIGF1dGhvciAgICAgICAgICA9PiAkYXV0aG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yX2VuY29kaW5nID0+IDEgICAgICApOworICAgIAorICAgICMgVVRGLTggc3RyaW5nIGluIHBlcmwgNS44LgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICAkYXV0aG9yICAgID0gY2hyIDB4MjBBQzsKKyAgICAgICAgJGNlbGwgICAgICA9ICdDMTInOworICAgICAgICAkY2VsbF90ZXh0ID0gIk1vdmUgdGhlIG1vdXNlIG92ZXIgdGhpcyBjZWxsIGFuZCB5b3Ugd2lsbCBzZWUgJ0NlbGwgY29tbWVudGVkICIuCisgICAgICAgICAgICAgICAgICAgICAiYnkgJGF1dGhvcicgaW4gdGhlIHN0YXR1cyBiYXIgYXQgdGhlIGJvdHRvbSI7CisgICAgICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDctPndyaXRlICAgICAgICAoJGNlbGwsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICAgICAkd29ya3NoZWV0Ny0+d3JpdGVfY29tbWVudCgkY2VsbCwgJGNvbW1lbnQsIGF1dGhvciA9PiAkYXV0aG9yKTsKKyAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgOC4gRGVtb25zdHJhdGVzIHRoZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IHRoZSByb3cgaGVpZ2h0LgorICAgICMKKyAgICAKKyAgICAjIFNldCB1cCBzb21lIGZvcm1hdHRpbmcuCisgICAgJHdvcmtzaGVldDgtPnNldF9jb2x1bW4oJ0M6QycsIDI1KTsKKyAgICAkd29ya3NoZWV0OC0+c2V0X3JvdygyLCA4MCk7CisgICAgCisgICAgJHdvcmtzaGVldDgtPnNob3dfY29tbWVudHMoKTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoZSBoZWlnaHQgb2YgdGhpcyByb3cgaGFzIGJlZW4gYWRqdXN0ZWQgZXhwbGljaXRseSB1c2luZyAnIC4KKyAgICAgICAgICAgICAgICAgJ3NldF9yb3coKS4gVGhlIHNpemUgb2YgdGhlIGNvbW1lbnQgYm94IGlzIGFkanVzdGVkICcgICAgICAgICAuCisgICAgICAgICAgICAgICAgICdhY2NvcmRpbmdseSBieSBXcml0ZUV4Y2VsLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ4LT53cml0ZSAgICAgICAgKCdDMycsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ4LT53cml0ZV9jb21tZW50KCdDMycsICRjb21tZW50KTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoZSBoZWlnaHQgb2YgdGhpcyByb3cgaGFzIGJlZW4gYWRqdXN0ZWQgYnkgRXhjZWwgZHVlIHRvIHRoZSAnICAuCisgICAgICAgICAgICAgICAgICd0ZXh0IHdyYXAgcHJvcGVydHkgYmVpbmcgc2V0LiBVbmZvcnR1bmF0ZWx5IHRoaXMgbWVhbnMgdGhhdCAnICAgLgorICAgICAgICAgICAgICAgICAndGhlIGhlaWdodCBvZiB0aGUgcm93IGlzIHVua25vd24gdG8gV3JpdGVFeGNlbCBhdCBydW4gdGltZSAnICAgIC4KKyAgICAgICAgICAgICAgICAgImFuZCB0aHVzIHRoZSBjb21tZW50IGJveCBpcyBzdHJldGNoZWQgYXMgd2VsbC5cblxuIiAgICAgICAgICAgICAuCisgICAgICAgICAgICAgICAgICdVc2Ugc2V0X3JvdygpIHRvIHNwZWNpZnkgdGhlIHJvdyBoZWlnaHQgZXhwbGljaXRseSB0byBhdm9pZCAnICAgLgorICAgICAgICAgICAgICAgICAndGhpcyBwcm9ibGVtLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ4LT53cml0ZSAgICAgICAgKCdDNicsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ4LT53cml0ZV9jb21tZW50KCdDNicsICRjb21tZW50KTsKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NvbW1lbnRzMi5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNvcHlmb3JtYXQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgZm9ybWF0IGNvcHlpbmcgbWV0aG9kIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK1RoaXMgZmVhdHVyZSBpc24ndCByZXF1aXJlZCB2ZXJ5IG9mdGVuLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jb3B5Zm9ybWF0LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY29weWZvcm1hdC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgZm9ybWF0IGNvcHlpbmcgbWV0aG9kIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgVGhpcyBmZWF0dXJlIGlzbid0IHJlcXVpcmVkIHZlcnkgb2Z0ZW4uCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgd29ya2Jvb2sxCisgICAgbXkgJHdvcmtib29rMSAgICAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIndvcmtib29rMS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0MSAgICAgID0gJHdvcmtib29rMS0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRmb3JtYXQxYSAgICAgICAgPSAkd29ya2Jvb2sxLT5hZGRfZm9ybWF0KCk7CisgICAgbXkgJGZvcm1hdDFiICAgICAgICA9ICR3b3JrYm9vazEtPmFkZF9mb3JtYXQoKTsKKyAgICAKKyAgICAjIENyZWF0ZSB3b3JrYm9vazIKKyAgICBteSAkd29ya2Jvb2syICAgICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygid29ya2Jvb2syLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQyICAgICAgPSAkd29ya2Jvb2syLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGZvcm1hdDJhICAgICAgICA9ICR3b3JrYm9vazItPmFkZF9mb3JtYXQoKTsKKyAgICBteSAkZm9ybWF0MmIgICAgICAgID0gJHdvcmtib29rMi0+YWRkX2Zvcm1hdCgpOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgZ2xvYmFsIGZvcm1hdCBvYmplY3QgdGhhdCBpc24ndCB0aWVkIHRvIGEgd29ya2Jvb2sKKyAgICBteSAkZ2xvYmFsX2Zvcm1hdCAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdC0+bmV3KCk7CisgICAgCisgICAgIyBTZXQgdGhlIGZvcm1hdHRpbmcKKyAgICAkZ2xvYmFsX2Zvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgJGdsb2JhbF9mb3JtYXQtPnNldF9ib2xkKCk7CisgICAgJGdsb2JhbF9mb3JtYXQtPnNldF9pdGFsaWMoKTsKKyAgICAKKyAgICAjIENyZWF0ZSBhbm90aGVyIGV4YW1wbGUgZm9ybWF0CisgICAgJGZvcm1hdDFiLT5zZXRfY29sb3IoJ3JlZCcpOworICAgIAorICAgICMgQ29weSB0aGUgZ2xvYmFsIGZvcm1hdCBwcm9wZXJ0aWVzIHRvIHRoZSB3b3Jrc2hlZXQgZm9ybWF0cworICAgICRmb3JtYXQxYS0+Y29weSgkZ2xvYmFsX2Zvcm1hdCk7CisgICAgJGZvcm1hdDJhLT5jb3B5KCRnbG9iYWxfZm9ybWF0KTsKKyAgICAKKyAgICAjIENvcHkgYSBmb3JtYXQgZnJvbSB3b3Jrc2hlZXQxIHRvIHdvcmtzaGVldDIKKyAgICAkZm9ybWF0MmItPmNvcHkoJGZvcm1hdDFiKTsKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgb3V0cHV0CisgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsIDAsICJDaWFvIiwgJGZvcm1hdDFhKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoMSwgMCwgIkNpYW8iLCAkZm9ybWF0MWIpOworICAgIAorICAgICR3b3Jrc2hlZXQyLT53cml0ZSgwLCAwLCAiSGVsbG8iLCAkZm9ybWF0MmEpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgxLCAwLCAiSGVsbG8iLCAkZm9ybWF0MmIpOworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jb3B5Zm9ybWF0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogZGF0YV92YWxpZGF0ZS5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gYWRkIGRhdGEgdmFsaWRhdGlvbiBhbmQgZHJvcGRvd24gbGlzdHMgdG8gYQorU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZmlsZS4KKworRGF0YSB2YWxpZGF0aW9uIGlzIGEgZmVhdHVyZSBvZiBFeGNlbCB3aGljaCBhbGxvd3MgeW91IHRvIHJlc3RyaWN0IHRoZSBkYXRhCit0aGF0IGEgdXNlcnMgZW50ZXJzIGluIGEgY2VsbCBhbmQgdG8gZGlzcGxheSBoZWxwIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLiBJdAorYWxzbyBhbGxvd3MgeW91IHRvIHJlc3RyaWN0IGlucHV0IHRvIHZhbHVlcyBpbiBhIGRyb3AgZG93biBsaXN0LgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9kYXRhX3ZhbGlkYXRlLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gZGF0YV92YWxpZGF0ZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGFkZCBkYXRhIHZhbGlkYXRpb24gYW5kIGRyb3Bkb3duIGxpc3RzIHRvIGEKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGZpbGUuCisgICAgIworICAgICMgRGF0YSB2YWxpZGF0aW9uIGlzIGEgZmVhdHVyZSBvZiBFeGNlbCB3aGljaCBhbGxvd3MgeW91IHRvIHJlc3RyaWN0IHRoZSBkYXRhCisgICAgIyB0aGF0IGEgdXNlcnMgZW50ZXJzIGluIGEgY2VsbCBhbmQgdG8gZGlzcGxheSBoZWxwIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLiBJdAorICAgICMgYWxzbyBhbGxvd3MgeW91IHRvIHJlc3RyaWN0IGlucHV0IHRvIHZhbHVlcyBpbiBhIGRyb3AgZG93biBsaXN0LgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDgsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZGF0YV92YWxpZGF0ZS54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBBZGQgYSBmb3JtYXQgZm9yIHRoZSBoZWFkZXIgY2VsbHMuCisgICAgbXkgJGhlYWRlcl9mb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdfY29sb3IgICAgPT4gNDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF93cmFwICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgICAgID0+ICd2Y2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgICMgU2V0IHVwIGxheW91dCBvZiB0aGUgd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDY0KTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkInLCAxNSk7CisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignRDpEJywgMTUpOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgMzYpOworICAgICR3b3Jrc2hlZXQtPnNldF9zZWxlY3Rpb24oJ0IzJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSB0aGUgaGVhZGVyIGNlbGxzIGFuZCBzb21lIGRhdGEgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGV4YW1wbGVzLgorICAgIG15ICRyb3cgPSAwOworICAgIG15ICR0eHQ7CisgICAgbXkgJGhlYWRpbmcxID0gJ1NvbWUgZXhhbXBsZXMgb2YgZGF0YSB2YWxpZGF0aW9uIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsJzsKKyAgICBteSAkaGVhZGluZzIgPSAnRW50ZXIgdmFsdWVzIGluIHRoaXMgY29sdW1uJzsKKyAgICBteSAkaGVhZGluZzMgPSAnU2FtcGxlIERhdGEnOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICRoZWFkaW5nMSwgJGhlYWRlcl9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMScsICRoZWFkaW5nMiwgJGhlYWRlcl9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEMScsICRoZWFkaW5nMywgJGhlYWRlcl9mb3JtYXQpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEMycsIFsnSW50ZWdlcnMnLCAgIDEsIDEwXSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0Q0JywgWydMaXN0IGRhdGEnLCAnb3BlbicsICdoaWdoJywgJ2Nsb3NlJ10pOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdENScsIFsnRm9ybXVsYScsICAgJz1BTkQoRjU9NTAsRzU9NjApJywgNTAsIDYwXSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSAxLiBMaW1pdGluZyBpbnB1dCB0byBhbiBpbnRlZ2VyIGluIGEgZml4ZWQgcmFuZ2UuCisgICAgIworICAgICR0eHQgPSAnRW50ZXIgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJ2JldHdlZW4nLAorICAgICAgICAgICAgbWluaW11bSAgICAgICAgID0+IDEsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgICAgPT4gMTAsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgMi4gTGltaXRpbmcgaW5wdXQgdG8gYW4gaW50ZWdlciBvdXRzaWRlIGEgZml4ZWQgcmFuZ2UuCisgICAgIworICAgICR0eHQgPSAnRW50ZXIgYW4gaW50ZWdlciB0aGF0IGlzIG5vdCBiZXR3ZWVuIDEgYW5kIDEwICh1c2luZyBjZWxsIHJlZmVyZW5jZXMpJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJ25vdCBiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgICA9PiAnPUUzJywKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgICA9PiAnPUYzJywKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSAzLiBMaW1pdGluZyBpbnB1dCB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBhIGZpeGVkIHZhbHVlLgorICAgICMKKyAgICAkdHh0ID0gJ0VudGVyIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDAnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdpbnRlZ2VyJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICA9PiAnPicsCisgICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgPT4gMCwKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSA0LiBMaW1pdGluZyBpbnB1dCB0byBhbiBpbnRlZ2VyIGxlc3MgdGhhbiBhIGZpeGVkIHZhbHVlLgorICAgICMKKyAgICAkdHh0ID0gJ0VudGVyIGFuIGludGVnZXIgbGVzcyB0aGFuIDEwJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJzwnLAorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgID0+IDEwLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDUuIExpbWl0aW5nIGlucHV0IHRvIGEgZGVjaW1hbCBpbiBhIGZpeGVkIHJhbmdlLgorICAgICMKKyAgICAkdHh0ID0gJ0VudGVyIGEgZGVjaW1hbCBiZXR3ZWVuIDAuMSBhbmQgMC41JzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnZGVjaW1hbCcsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJ2JldHdlZW4nLAorICAgICAgICAgICAgbWluaW11bSAgICAgICAgID0+IDAuMSwKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgICA9PiAwLjUsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgNi4gTGltaXRpbmcgaW5wdXQgdG8gYSB2YWx1ZSBpbiBhIGRyb3Bkb3duIGxpc3QuCisgICAgIworICAgICR0eHQgPSAnU2VsZWN0IGEgdmFsdWUgZnJvbSBhIGRyb3AgZG93biBsaXN0JzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnbGlzdCcsCisgICAgICAgICAgICBzb3VyY2UgICAgICAgICAgPT4gWydvcGVuJywgJ2hpZ2gnLCAnY2xvc2UnXSwKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSA2LiBMaW1pdGluZyBpbnB1dCB0byBhIHZhbHVlIGluIGEgZHJvcGRvd24gbGlzdC4KKyAgICAjCisgICAgJHR4dCA9ICdTZWxlY3QgYSB2YWx1ZSBmcm9tIGEgZHJvcCBkb3duIGxpc3QgKHVzaW5nIGEgY2VsbCByYW5nZSknOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdsaXN0JywKKyAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICA9PiAnPUU0Okc0JywKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSA3LiBMaW1pdGluZyBpbnB1dCB0byBhIGRhdGUgaW4gYSBmaXhlZCByYW5nZS4KKyAgICAjCisgICAgJHR4dCA9ICdFbnRlciBhIGRhdGUgYmV0d2VlbiAxLzEvMjAwOCBhbmQgMTIvMTIvMjAwOCc7CisgICAgJHJvdyArPSAyOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDAsICR0eHQpOworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbigkcm93LCAxLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2RhdGUnLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICAgID0+ICdiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgICA9PiAnMjAwOC0wMS0wMVQnLAorICAgICAgICAgICAgbWF4aW11bSAgICAgICAgID0+ICcyMDA4LTEyLTEyVCcsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgOC4gTGltaXRpbmcgaW5wdXQgdG8gYSB0aW1lIGluIGEgZml4ZWQgcmFuZ2UuCisgICAgIworICAgICR0eHQgPSAnRW50ZXIgYSB0aW1lIGJldHdlZW4gNjowMCBhbmQgMTI6MDAnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICd0aW1lJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgICAgPT4gJ1QwNjowMCcsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgICAgPT4gJ1QxMjowMCcsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgOS4gTGltaXRpbmcgaW5wdXQgdG8gYSBzdHJpbmcgZ3JlYXRlciB0aGFuIGEgZml4ZWQgbGVuZ3RoLgorICAgICMKKyAgICAkdHh0ID0gJ0VudGVyIGEgc3RyaW5nIGxvbmdlciB0aGFuIDMgY2hhcmFjdGVycyc7CisgICAgJHJvdyArPSAyOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDAsICR0eHQpOworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbigkcm93LCAxLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2xlbmd0aCcsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJz4nLAorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgID0+IDMsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgMTAuIExpbWl0aW5nIGlucHV0IGJhc2VkIG9uIGEgZm9ybXVsYS4KKyAgICAjCisgICAgJHR4dCA9ICdFbnRlciBhIHZhbHVlIGlmIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZSAiPUFORChGNT01MCxHNT02MCkiJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnY3VzdG9tJywKKyAgICAgICAgICAgIHZhbHVlICAgICAgICAgICA9PiAnPUFORChGNT01MCxHNT02MCknLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDExLiBEaXNwbGF5aW5nIGFuZCBtb2RpZnkgZGF0YSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgorICAgICMKKyAgICAkdHh0ID0gJ0Rpc3BsYXlzIGEgbWVzc2FnZSB3aGVuIHlvdSBzZWxlY3QgdGhlIGNlbGwnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgID0+ICdiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgPT4gMSwKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgPT4gMTAwLAorICAgICAgICAgICAgaW5wdXRfdGl0bGUgICA9PiAnRW50ZXIgYW4gaW50ZWdlcjonLAorICAgICAgICAgICAgaW5wdXRfbWVzc2FnZSA9PiAnYmV0d2VlbiAxIGFuZCAxMDAnLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDEyLiBEaXNwbGF5aW5nIGFuZCBtb2RpZnkgZGF0YSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgorICAgICMKKyAgICAkdHh0ID0gJ0Rpc3BsYXkgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSB3aGVuIGludGVnZXIgaXNuXCd0IGJldHdlZW4gMSBhbmQgMTAwJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgID0+IDEsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgID0+IDEwMCwKKyAgICAgICAgICAgIGlucHV0X3RpdGxlICAgPT4gJ0VudGVyIGFuIGludGVnZXI6JywKKyAgICAgICAgICAgIGlucHV0X21lc3NhZ2UgPT4gJ2JldHdlZW4gMSBhbmQgMTAwJywKKyAgICAgICAgICAgIGVycm9yX3RpdGxlICAgPT4gJ0lucHV0IHZhbHVlIGlzIG5vdCB2YWxpZCEnLAorICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9PiAnSXQgc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDEzLiBEaXNwbGF5aW5nIGFuZCBtb2RpZnkgZGF0YSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgorICAgICMKKyAgICAkdHh0ID0gJ0Rpc3BsYXkgYSBjdXN0b20gaW5mb3JtYXRpb24gbWVzc2FnZSB3aGVuIGludGVnZXIgaXNuXCd0IGJldHdlZW4gMSBhbmQgMTAwJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgID0+IDEsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgID0+IDEwMCwKKyAgICAgICAgICAgIGlucHV0X3RpdGxlICAgPT4gJ0VudGVyIGFuIGludGVnZXI6JywKKyAgICAgICAgICAgIGlucHV0X21lc3NhZ2UgPT4gJ2JldHdlZW4gMSBhbmQgMTAwJywKKyAgICAgICAgICAgIGVycm9yX3RpdGxlICAgPT4gJ0lucHV0IHZhbHVlIGlzIG5vdCB2YWxpZCEnLAorICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9PiAnSXQgc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLAorICAgICAgICAgICAgZXJyb3JfdHlwZSAgICA9PiAnaW5mb3JtYXRpb24nLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2RhdGFfdmFsaWRhdGUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBkYXRlX3RpbWUucGwKKworCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGV4YW1wbGUgb2Ygd3JpdGluZyBkYXRlcyBhbmQgdGltZXMgdXNpbmcgdGhlCit3cml0ZV9kYXRlX3RpbWUoKSBXb3Jrc2hlZXQgbWV0aG9kLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9kYXRlX3RpbWUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBkYXRlX3RpbWUucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBleGFtcGxlIG9mIHdyaXRpbmcgZGF0ZXMgYW5kIHRpbWVzIHVzaW5nIHRoZQorICAgICMgd3JpdGVfZGF0ZV90aW1lKCkgV29ya3NoZWV0IG1ldGhvZC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEF1Z3VzdCAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJkYXRlX3RpbWUueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoYm9sZCA9PiAxKTsKKyAgICBteSAkcm93ICAgICAgID0gMDsKKyAgICAKKyAgICAKKyAgICAjIEV4cGFuZCB0aGUgZmlyc3QgY29sdW1uIHNvIHRoYXQgdGhlIGRhdGUgaXMgdmlzaWJsZS4KKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCJBOkIiLCAzMCk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSB0aGUgY29sdW1uIGhlYWRlcnMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnRm9ybWF0dGVkIGRhdGUnLCAkYm9sZCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJ0Zvcm1hdCcsICAgICAgICAgJGJvbGQpOworICAgIAorICAgIAorICAgICMgRXhhbXBsZXMgZGF0ZSBhbmQgdGltZSBmb3JtYXRzLiBJbiB0aGUgb3V0cHV0IGZpbGUgY29tcGFyZSBob3cgY2hhbmdpbmcKKyAgICAjIHRoZSBmb3JtYXQgY29kZXMgY2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBkYXRlLgorICAgICMKKyAgICBteSBAZGF0ZV9mb3JtYXRzID0gKAorICAgICAgICAnZGQvbW0veXknLAorICAgICAgICAnbW0vZGQveXknLAorICAgICAgICAnJywKKyAgICAgICAgJ2QgbW0geXknLAorICAgICAgICAnZGQgbW0geXknLAorICAgICAgICAnJywKKyAgICAgICAgJ2RkIG0geXknLAorICAgICAgICAnZGQgbW0geXknLAorICAgICAgICAnZGQgbW1tIHl5JywKKyAgICAgICAgJ2RkIG1tbW0geXknLAorICAgICAgICAnJywKKyAgICAgICAgJ2RkIG1tIHknLAorICAgICAgICAnZGQgbW0geXl5JywKKyAgICAgICAgJ2RkIG1tIHl5eXknLAorICAgICAgICAnJywKKyAgICAgICAgJ2QgbW1tbSB5eXl5JywKKyAgICAgICAgJycsCisgICAgICAgICdkZC9tbS95eScsCisgICAgICAgICdkZC9tbS95eSBoaDptbScsCisgICAgICAgICdkZC9tbS95eSBoaDptbTpzcycsCisgICAgICAgICdkZC9tbS95eSBoaDptbTpzcy4wMDAnLAorICAgICAgICAnJywKKyAgICAgICAgJ2hoOm1tJywKKyAgICAgICAgJ2hoOm1tOnNzJywKKyAgICAgICAgJ2hoOm1tOnNzLjAwMCcsCisgICAgKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBzYW1lIGRhdGUgYW5kIHRpbWUgdXNpbmcgZWFjaCBvZiB0aGUgYWJvdmUgZm9ybWF0cy4gVGhlIGVtcHR5CisgICAgIyBzdHJpbmcgZm9ybWF0cyBjcmVhdGUgYSBibGFuayBsaW5lIHRvIG1ha2UgdGhlIGV4YW1wbGUgY2xlYXJlci4KKyAgICAjCisgICAgZm9yIG15ICRkYXRlX2Zvcm1hdCAoQGRhdGVfZm9ybWF0cykgeworICAgICAgICAkcm93Kys7CisgICAgICAgIG5leHQgaWYgJGRhdGVfZm9ybWF0IGVxICcnOworICAgIAorICAgICAgICAjIENyZWF0ZSBhIGZvcm1hdCBmb3IgdGhlIGRhdGUgb3IgdGltZS4KKyAgICAgICAgbXkgJGZvcm1hdCA9ICAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mb3JtYXQgPT4gJGRhdGVfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgICAgID0+ICdsZWZ0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgICAgICMgV3JpdGUgdGhlIHNhbWUgZGF0ZSB1c2luZyBkaWZmZXJlbnQgZm9ybWF0cy4KKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGVfZGF0ZV90aW1lKCRyb3csIDAsICcyMDA0LTA4LTAxVDEyOjMwOjQ1LjEyMycsICRmb3JtYXQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSAgICAgICAgICAoJHJvdywgMSwgJGRhdGVfZm9ybWF0KTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gaW52YWxpZCBkYXRlLiBJdCBpcyB3cml0dGVuIGFzIGEgc3RyaW5nCisgICAgIyBpbnN0ZWFkIG9mIGEgbnVtYmVyLiBUaGlzIGlzIGFsc28gRXhjZWwncyBkZWZhdWx0IGJlaGF2aW91ci4KKyAgICAjCisgICAgJHJvdyArPSAyOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2RhdGVfdGltZSgkcm93LCAwLCAnMjAwNC0xMy0wMVQxMjozMDo0NS4xMjMnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSAgICAgICAgICAoJHJvdywgMSwgJ0ludmFsaWQgZGF0ZS4gV3JpdHRlbiBhcyBzdHJpbmcuJywgJGJvbGQpOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZGF0ZV90aW1lLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZGVmaW5lZF9uYW1lLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byBjcmVhdGUgZGVmaW5lZCBuYW1lcyBpbiBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGZpbGUuCisKK1RoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZGVmaW5lZCBhIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYSB2YWx1ZSwKK2Egc2luZ2xlIGNlbGwgb3IgYSByYW5nZSBvZiBjZWxscyBpbiBhIHdvcmtib29rLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9kZWZpbmVkX25hbWUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBkZWZpbmVkX25hbWUucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byBjcmVhdGUgZGVmaW5lZCBuYW1lcyBpbiBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGZpbGUuCisgICAgIworICAgICMgVGhpcyBtZXRob2QgaXMgdXNlZCB0byBkZWZpbmVkIGEgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHZhbHVlLAorICAgICMgYSBzaW5nbGUgY2VsbCBvciBhIHJhbmdlIG9mIGNlbGxzIGluIGEgd29ya2Jvb2suCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwOCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZGVmaW5lZF9uYW1lLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAkd29ya2Jvb2stPmRlZmluZV9uYW1lKCdFeGNoYW5nZV9yYXRlJywgJz0wLjk2Jyk7CisgICAgJHdvcmtib29rLT5kZWZpbmVfbmFtZSgnU2FsZXMnLCAgICAgICAgICc9U2hlZXQxISRHJDE6JEgkMTAnKTsKKyAgICAkd29ya2Jvb2stPmRlZmluZV9uYW1lKCdTaGVldDIhU2FsZXMnLCAgJz1TaGVldDIhJEckMTokRyQxMCcpOworICAgIAorICAgIAorICAgIGZvciBteSAkd29ya3NoZWV0ICgkd29ya2Jvb2stPnNoZWV0cygpKSB7CisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDQ1KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJ1RoaXMgd29ya3NoZWV0IGNvbnRhaW5zIHNvbWUgZGVmaW5lZCBuYW1lcywnKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgJ1NlZSB0aGUgSW5zZXJ0IC0+IE5hbWUgLT4gRGVmaW5lIGRpYWxvZy4nKTsKKyAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBNCcsICc9RXhjaGFuZ2VfcmF0ZScpOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZGVmaW5lZF9uYW1lLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZGlhZ19ib3JkZXIucGwKKworCisKK0Egc2ltcGxlIGZvcm1hdHRpbmcgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gYWRkIGEgZGlhZ29uYWwgY2VsbAorYm9yZGVyIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvZGlhZ19ib3JkZXIuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBkaWFnX2JvcmRlci5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZm9ybWF0dGluZyBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBhZGQgYSBkaWFnb25hbCBjZWxsCisgICAgIyBib3JkZXIgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZGlhZ19ib3JkZXIueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgIG15ICRmb3JtYXQxICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoZGlhZ190eXBlICAgICAgID0+ICcxJyk7CisgICAgCisgICAgbXkgJGZvcm1hdDIgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChkaWFnX3R5cGUgICAgICAgPT4gJzInKTsKKyAgICAKKyAgICBteSAkZm9ybWF0MyAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGRpYWdfdHlwZSAgICAgICA9PiAnMycpOworICAgIAorICAgIG15ICRmb3JtYXQ0ICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnX3R5cGUgICAgICAgPT4gJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ19ib3JkZXIgICAgID0+ICc3JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdfY29sb3IgICAgICA9PiAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjMnLCAgJ1RleHQnLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I2JywgICdUZXh0JywgJGZvcm1hdDIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCOScsICAnVGV4dCcsICRmb3JtYXQzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjEyJywgJ1RleHQnLCAkZm9ybWF0NCk7CisgICAgCisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9kaWFnX2JvcmRlci5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGVhc3Rlcl9lZ2cucGwKKworCisKK1RoaXMgdXNlcyB0aGUgV2luMzI6Ok9MRSBtb2R1bGUgdG8gZXhwb3NlIHRoZSBGbGlnaHQgU2ltdWxhdG9yIGVhc3RlciBlZ2cKK2luIEV4Y2VsIDk3IFNSMi4KKworCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhpcyB1c2VzIHRoZSBXaW4zMjo6T0xFIG1vZHVsZSB0byBleHBvc2UgdGhlIEZsaWdodCBTaW11bGF0b3IgZWFzdGVyIGVnZworICAgICMgaW4gRXhjZWwgOTcgU1IyLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFdpbjMyOjpPTEU7CisgICAgCisgICAgbXkgJGFwcGxpY2F0aW9uID0gV2luMzI6Ok9MRS0+bmV3KCJFeGNlbC5BcHBsaWNhdGlvbiIpOworICAgIG15ICR3b3JrYm9vayAgICA9ICRhcHBsaWNhdGlvbi0+V29ya2Jvb2tzLT5BZGQ7CisgICAgbXkgJHdvcmtzaGVldCAgID0gJHdvcmtib29rLT5Xb3Jrc2hlZXRzKDEpOworICAgIAorICAgICRhcHBsaWNhdGlvbi0+e1Zpc2libGV9ID0gMTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT5SYW5nZSgiTDk3Olg5NyIpLT5TZWxlY3Q7CisgICAgJHdvcmtzaGVldC0+UmFuZ2UoIk05NyIpLT5BY3RpdmF0ZTsKKyAgICAKKyAgICBteSAkbWVzc2FnZSA9ICAiSG9sZCBkb3duIFNoaWZ0IGFuZCBDdHJsIGFuZCBjbGljayB0aGUgIi4KKyAgICAgICAgICAgICAgICAgICAiQ2hhcnQgV2l6YXJkIGljb24gb24gdGhlIHRvb2xiYXIuXG5cbiIuCisgICAgICAgICAgICAgICAgICAgIlVzZSB0aGUgbW91c2UgbW90aW9uIGFuZCBidXR0b25zIHRvIGNvbnRyb2wgIi4KKyAgICAgICAgICAgICAgICAgICAibW92ZW1lbnQuIFRyeSB0byBmaW5kIHRoZSBtb25vbGl0aC4gIi4KKyAgICAgICAgICAgICAgICAgICAiQ2xvc2UgdGhpcyBkaWFsb2cgZmlyc3QuIjsKKyAgICAKKyAgICAkYXBwbGljYXRpb24tPklucHV0Qm94KCRtZXNzYWdlKTsKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZWFzdGVyX2VnZy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGZpbGVoYW5kbGUucGwKKworCisKK0V4YW1wbGUgb2YgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gd3JpdGUgRXhjZWwgZmlsZXMgdG8KK2RpZmZlcmVudCBmaWxlaGFuZGxlcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvZmlsZWhhbmRsZS5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGZpbGVoYW5kbGUucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRvIHdyaXRlIEV4Y2VsIGZpbGVzIHRvCisgICAgIyBkaWZmZXJlbnQgZmlsZWhhbmRsZXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBBcHJpbCAyMDAzLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgdXNlIElPOjpTY2FsYXI7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gVGhpcyBkZW1vbnN0cmF0ZXMgdGhlIHN0YW5kYXJkIHdheSBvZiBjcmVhdGluZyBhbiBFeGNlbCBmaWxlIGJ5CisgICAgIyBzcGVjaWZ5aW5nIGEgZmlsZSBuYW1lLgorICAgICMKKyAgICAKKyAgICBteSAkd29ya2Jvb2sxICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ2ZoXzAxLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rMS0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgwLCAwLCAgIkhpIEV4Y2VsISIpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDIuIFdyaXRlIGFuIEV4Y2VsIGZpbGUgdG8gYW4gZXhpc3RpbmcgZmlsZWhhbmRsZS4KKyAgICAjCisgICAgCisgICAgb3BlbiAgICBURVNULCAiPiBmaF8wMi54bHMiIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiBmaWxlOiAkISI7CisgICAgYmlubW9kZSBURVNUOyAjIEFsd2F5cyBkbyB0aGlzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcGxhdGZvcm0gcmVxdWlyZXMgaXQuCisgICAgCisgICAgbXkgJHdvcmtib29rMiAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KFwqVEVTVCk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2syLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgJHdvcmtzaGVldDItPndyaXRlKDAsIDAsICAiSGkgRXhjZWwhIik7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMy4gV3JpdGUgYW4gRXhjZWwgZmlsZSB0byBhbiBleGlzdGluZyBPTyBzdHlsZSBmaWxlaGFuZGxlLgorICAgICMKKyAgICAKKyAgICBteSAkZmggPSBGaWxlSGFuZGxlLT5uZXcoIj4gZmhfMDMueGxzIikKKyAgICAgICAgICAgICBvciBkaWUgIkNvdWxkbid0IG9wZW4gZmlsZTogJCEiOworICAgIAorICAgIGJpbm1vZGUoJGZoKTsKKyAgICAKKyAgICBteSAkd29ya2Jvb2szICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJGZoKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vazMtPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAkd29ya3NoZWV0My0+d3JpdGUoMCwgMCwgICJIaSBFeGNlbCEiKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0LiBXcml0ZSBhbiBFeGNlbCBmaWxlIHRvIGEgc3RyaW5nIHZpYSBJTzo6U2NhbGFyLiBQbGVhc2UgcmVmZXIgdG8KKyAgICAjIHRoZSBJTzo6U2NhbGFyIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAgICAjCisgICAgCisgICAgbXkgJHhsc19zdHI7CisgICAgCisgICAgdGllICpYTFMsICdJTzo6U2NhbGFyJywgXCR4bHNfc3RyOworICAgIAorICAgIG15ICR3b3JrYm9vazQgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyhcKlhMUyk7CisgICAgbXkgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2s0LT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgJHdvcmtzaGVldDQtPndyaXRlKDAsIDAsICJIaSBFeGNlbCA0Iik7CisgICAgJHdvcmtib29rNC0+Y2xvc2UoKTsgIyBUaGlzIGlzIHJlcXVpcmVkIGJlZm9yZSB3ZSB1c2UgdGhlIHNjYWxhcgorICAgIAorICAgIAorICAgICMgVGhlIEV4Y2VsIGZpbGUgaXMgbm93IGluICR4bHNfc3RyLiBBcyBhIGRlbW9uc3RyYXRpb24sIHByaW50IGl0IHRvIGEgZmlsZS4KKyAgICBvcGVuICAgIFRNUCwgIj4gZmhfMDQueGxzIiBvciBkaWUgIkNvdWxkbid0IG9wZW4gZmlsZTogJCEiOworICAgIGJpbm1vZGUgVE1QOworICAgIHByaW50ICAgVE1QICAkeGxzX3N0cjsKKyAgICBjbG9zZSAgIFRNUDsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA1LiBXcml0ZSBhbiBFeGNlbCBmaWxlIHRvIGEgc3RyaW5nIHZpYSBJTzo6U2NhbGFyJ3MgbmV3ZXIgaW50ZXJmYWNlLgorICAgICMgUGxlYXNlIHJlZmVyIHRvIHRoZSBJTzo6U2NhbGFyIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAgICAjCisgICAgbXkgJHhsc19zdHIyOworICAgIAorICAgIG15ICRmaDUgPSBJTzo6U2NhbGFyLT5uZXcoXCR4bHNfc3RyMik7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rNSAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCRmaDUpOworICAgIG15ICR3b3Jrc2hlZXQ1ID0gJHdvcmtib29rNS0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICR3b3Jrc2hlZXQ1LT53cml0ZSgwLCAwLCAiSGkgRXhjZWwgNSIpOworICAgICR3b3JrYm9vazUtPmNsb3NlKCk7ICMgVGhpcyBpcyByZXF1aXJlZCBiZWZvcmUgd2UgdXNlIHRoZSBzY2FsYXIKKyAgICAKKyAgICAjIFRoZSBFeGNlbCBmaWxlIGlzIG5vdyBpbiAkeGxzX3N0ci4gQXMgYSBkZW1vbnN0cmF0aW9uLCBwcmludCBpdCB0byBhIGZpbGUuCisgICAgb3BlbiAgICBUTVAsICI+IGZoXzA1LnhscyIgb3IgZGllICJDb3VsZG4ndCBvcGVuIGZpbGU6ICQhIjsKKyAgICBiaW5tb2RlIFRNUDsKKyAgICBwcmludCAgIFRNUCAgJHhsc19zdHIyOworICAgIGNsb3NlICAgVE1QOworICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9maWxlaGFuZGxlLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZm9ybXVsYV9yZXN1bHQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHdyaXRlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGZvcm11bGFzIHdpdGggYSB1c2VyCitzcGVjaWZpZWQgcmVzdWx0LgorCitUaGlzIGlzIGdlbmVyYWxseSBvbmx5IHJlcXVpcmVkIHdoZW4gd3JpdGluZyBhIHNwcmVhZHNoZWV0IGZvciBhbgorYXBwbGljYXRpb24gb3RoZXIgdGhhbiBFeGNlbCB3aGVyZSB0aGUgZm9ybXVsYSBpc24ndCBldmFsdWF0ZWQuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2Zvcm11bGFfcmVzdWx0LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gZm9ybXVsYV9yZXN1bHQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gd3JpdGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZm9ybXVsYXMgd2l0aCBhIHVzZXIKKyAgICAjIHNwZWNpZmllZCByZXN1bHQuCisgICAgIworICAgICMgVGhpcyBpcyBnZW5lcmFsbHkgb25seSByZXF1aXJlZCB3aGVuIHdyaXRpbmcgYSBzcHJlYWRzaGVldCBmb3IgYW4KKyAgICAjIGFwcGxpY2F0aW9uIG90aGVyIHRoYW4gRXhjZWwgd2hlcmUgdGhlIGZvcm11bGEgaXNuJ3QgZXZhbHVhdGVkLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDUsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZm9ybXVsYV9yZXN1bHQueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRmb3JtYXQgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoY29sb3IgPT4gJ2JsdWUnKTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnPTErMicpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICc9MSsyJywgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0LCA0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTMnLCAnPSJBQkMiJywgICAgICAgICAgICAgICAgICAgdW5kZWYsICAgJ0RFRicpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNCcsICc9SUYoQTEgPiAxLCBUUlVFLCBGQUxTRSknLCB1bmRlZiwgICAnVFJVRScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNScsICc9MS8wJywgICAgICAgICAgICAgICAgICAgICB1bmRlZiwgICAnI0RJVi8wIScpOworICAgIAorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZm9ybXVsYV9yZXN1bHQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBoZWFkZXJzLnBsCisKKworCitUaGlzIHByb2dyYW0gc2hvd3Mgc2V2ZXJhbCBleGFtcGxlcyBvZiBob3cgdG8gc2V0IHVwIGhlYWRlcnMgYW5kCitmb290ZXJzIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK1RoZSBjb250cm9sIGNoYXJhY3RlcnMgdXNlZCBpbiB0aGUgaGVhZGVyL2Zvb3RlciBzdHJpbmdzIGFyZToKKworICAgIENvbnRyb2wgICAgICAgICAgICAgQ2F0ZWdvcnkgICAgICAgICAgICBEZXNjcmlwdGlvbgorICAgID09PT09PT0gICAgICAgICAgICAgPT09PT09PT0gICAgICAgICAgICA9PT09PT09PT09PQorICAgICZMICAgICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiAgICAgICBMZWZ0CisgICAgJkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbnRlcgorICAgICZSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWdodAorCisgICAgJlAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbiAgICAgICAgIFBhZ2UgbnVtYmVyCisgICAgJk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIG51bWJlciBvZiBwYWdlcworICAgICZEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlCisgICAgJlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUKKyAgICAmRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBuYW1lCisgICAgJkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldCBuYW1lCisKKyAgICAmZm9udHNpemUgICAgICAgICAgIEZvbnQgICAgICAgICAgICAgICAgRm9udCBzaXplCisgICAgJiJmb250LHN0eWxlIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnQgbmFtZSBhbmQgc3R5bGUKKyAgICAmVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlIHVuZGVybGluZQorICAgICZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUgdW5kZXJsaW5lCisgICAgJlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlrZXRocm91Z2gKKyAgICAmWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwZXJzY3JpcHQKKyAgICAmWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic2NyaXB0CisKKyAgICAmJiAgICAgICAgICAgICAgICAgIE1pc2NlbGxhbmVvdXMgICAgICAgTGl0ZXJhbCBhbXBlcnNhbmQgJgorCitTZWUgdGhlIG1haW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvaGVhZGVycy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGhlYWRlcnMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIHByb2dyYW0gc2hvd3Mgc2V2ZXJhbCBleGFtcGxlcyBvZiBob3cgdG8gc2V0IHVwIGhlYWRlcnMgYW5kCisgICAgIyBmb290ZXJzIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgVGhlIGNvbnRyb2wgY2hhcmFjdGVycyB1c2VkIGluIHRoZSBoZWFkZXIvZm9vdGVyIHN0cmluZ3MgYXJlOgorICAgICMKKyAgICAjICAgICBDb250cm9sICAgICAgICAgICAgIENhdGVnb3J5ICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAgICAjICAgICA9PT09PT09ICAgICAgICAgICAgID09PT09PT09ICAgICAgICAgICAgPT09PT09PT09PT0KKyAgICAjICAgICAmTCAgICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICAgICAgTGVmdAorICAgICMgICAgICZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZW50ZXIKKyAgICAjICAgICAmUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQKKyAgICAjCisgICAgIyAgICAgJlAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbiAgICAgICAgIFBhZ2UgbnVtYmVyCisgICAgIyAgICAgJk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIG51bWJlciBvZiBwYWdlcworICAgICMgICAgICZEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlCisgICAgIyAgICAgJlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUKKyAgICAjICAgICAmRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBuYW1lCisgICAgIyAgICAgJkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldCBuYW1lCisgICAgIworICAgICMgICAgICZmb250c2l6ZSAgICAgICAgICAgRm9udCAgICAgICAgICAgICAgICBGb250IHNpemUKKyAgICAjICAgICAmImZvbnQsc3R5bGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9udCBuYW1lIGFuZCBzdHlsZQorICAgICMgICAgICZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGUgdW5kZXJsaW5lCisgICAgIyAgICAgJkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZSB1bmRlcmxpbmUKKyAgICAjICAgICAmUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaWtldGhyb3VnaAorICAgICMgICAgICZYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBlcnNjcmlwdAorICAgICMgICAgICZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJzY3JpcHQKKyAgICAjCisgICAgIyAgICAgJiYgICAgICAgICAgICAgICAgICBNaXNjZWxsYW5lb3VzICAgICAgIExpdGVyYWwgYW1wZXJzYW5kICYKKyAgICAjCisgICAgIyBTZWUgdGhlIG1haW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiaGVhZGVycy54bHMiKTsKKyAgICBteSAkcHJldmlldyAgID0gIlNlbGVjdCBQcmludCBQcmV2aWV3IHRvIHNlZSB0aGUgaGVhZGVyIGFuZCBmb290ZXIiOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIHRvIHN0YXJ0CisgICAgIworICAgIG15ICR3b3Jrc2hlZXQxICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnU2ltcGxlJyk7CisgICAgCisgICAgbXkgJGhlYWRlcjEgICAgID0gJyZDSGVyZSBpcyBzb21lIGNlbnRyZWQgdGV4dC4nOworICAgIAorICAgIG15ICRmb290ZXIxICAgICA9ICcmTEhlcmUgaXMgc29tZSBsZWZ0IGFsaWduZWQgdGV4dC4nOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQxLT5zZXRfaGVhZGVyKCRoZWFkZXIxKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X2Zvb3RlcigkZm9vdGVyMSk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExJywgJHByZXZpZXcpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIGlzIGFuIGV4YW1wbGUgb2Ygc29tZSBvZiB0aGUgaGVhZGVyL2Zvb3RlciB2YXJpYWJsZXMuCisgICAgIworICAgIG15ICR3b3Jrc2hlZXQyICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnVmFyaWFibGVzJyk7CisgICAgCisgICAgbXkgJGhlYWRlcjIgICAgID0gJyZMUGFnZSAmUCBvZiAmTicuCisgICAgICAgICAgICAgICAgICAgICAgJyZDRmlsZW5hbWU6ICZGJyAuCisgICAgICAgICAgICAgICAgICAgICAgJyZSU2hlZXRuYW1lOiAmQSc7CisgICAgCisgICAgbXkgJGZvb3RlcjIgICAgID0gJyZMQ3VycmVudCBkYXRlOiAmRCcuCisgICAgICAgICAgICAgICAgICAgICAgJyZSQ3VycmVudCB0aW1lOiAmVCc7CisgICAgCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldDItPnNldF9oZWFkZXIoJGhlYWRlcjIpOworICAgICR3b3Jrc2hlZXQyLT5zZXRfZm9vdGVyKCRmb290ZXIyKTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTEnLCAkcHJldmlldyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMjEnLCAiTmV4dCBzaGVldCIpOworICAgICR3b3Jrc2hlZXQyLT5zZXRfaF9wYWdlYnJlYWtzKDIwKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgbW9yZSB0aGFuIG9uZSBmb250CisgICAgIworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdNaXhlZCBmb250cycpOworICAgIAorICAgIG15ICRoZWFkZXIzICAgID0gJyZDJyAuCisgICAgICAgICAgICAgICAgICAgICAnJiJDb3VyaWVyIE5ldyxCb2xkIkhlbGxvICcgLgorICAgICAgICAgICAgICAgICAgICAgJyYiQXJpYWwsSXRhbGljIldvcmxkJzsKKyAgICAKKyAgICBteSAkZm9vdGVyMyAgICA9ICcmQycgLgorICAgICAgICAgICAgICAgICAgICAgJyYiU3ltYm9sImUnIC4KKyAgICAgICAgICAgICAgICAgICAgICcmIkFyaWFsIiA9IG1jJlgyJzsKKyAgICAKKyAgICAkd29ya3NoZWV0My0+c2V0X2hlYWRlcigkaGVhZGVyMyk7CisgICAgJHdvcmtzaGVldDMtPnNldF9mb290ZXIoJGZvb3RlcjMpOworICAgIAorICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdBOkEnLCA1MCk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlKCdBMScsICRwcmV2aWV3KTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBsaW5lIHdyYXBwaW5nCisgICAgIworICAgIG15ICR3b3Jrc2hlZXQ0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdXb3JkIHdyYXAnKTsKKyAgICAKKyAgICBteSAkaGVhZGVyNCAgICA9ICImQ0hlYWRpbmcgMVxuSGVhZGluZyAyXG5IZWFkaW5nIDMiOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT5zZXRfaGVhZGVyKCRoZWFkZXI0KTsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgICR3b3Jrc2hlZXQ0LT53cml0ZSgnQTEnLCAkcHJldmlldyk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaW5zZXJ0aW5nIGEgbGl0ZXJhbCBhbXBlcnNhbmQgJgorICAgICMKKyAgICBteSAkd29ya3NoZWV0NSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnQW1wZXJzYW5kJyk7CisgICAgCisgICAgbXkgJGhlYWRlcjUgICAgPSAiJkNDdXJpb3VzZXIgJiYgQ3VyaW91c2VyIC0gQXR0b3JuZXlzIGF0IExhdyI7CisgICAgCisgICAgJHdvcmtzaGVldDUtPnNldF9oZWFkZXIoJGhlYWRlcjUpOworICAgIAorICAgICR3b3Jrc2hlZXQ1LT5zZXRfY29sdW1uKCdBOkEnLCA1MCk7CisgICAgJHdvcmtzaGVldDUtPndyaXRlKCdBMScsICRwcmV2aWV3KTsKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvaGVhZGVycy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGhpZGVfc2hlZXQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIGhpZGUgYSB3b3Jrc2hlZXQgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvaGlkZV9zaGVldC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGhpZGVfc2hlZXQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gaGlkZSBhIHdvcmtzaGVldCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXByaWwgMjAwNSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnaGlkZGVuLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICMgU2hlZXQyIHdvbid0IGJlIHZpc2libGUgdW50aWwgaXQgaXMgdW5oaWRkZW4gaW4gRXhjZWwuCisgICAgJHdvcmtzaGVldDItPmhpZGUoKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoMCwgMCwgJ1NoZWV0MiBpcyBoaWRkZW4nKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoMCwgMCwgJ0hvdyBkaWQgeW91IGZpbmQgbWU/Jyk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlKDAsIDAsICdTaGVldDIgaXMgaGlkZGVuJyk7CisgICAgCisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9oaWRlX3NoZWV0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogaHlwZXJsaW5rMS5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZSB0byB3cml0ZSBoeXBlcmxpbmtzLgorCitTZWUgYWxzbyBoeXBlcmxpbmsyLnBsIGZvciB3b3Jrc2hlZXQgVVJMIGV4YW1wbGVzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9oeXBlcmxpbmsxLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gaHlwZXJsaW5rMS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgV3JpdGVFeGNlbCBtb2R1bGUgdG8gd3JpdGUgaHlwZXJsaW5rcy4KKyAgICAjCisgICAgIyBTZWUgYWxzbyBoeXBlcmxpbmsyLnBsIGZvciB3b3Jrc2hlZXQgVVJMIGV4YW1wbGVzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiaHlwZXJsaW5rLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0h5cGVybGlua3MnKTsKKyAgICAKKyAgICAjIEZvcm1hdCB0aGUgZmlyc3QgY29sdW1uCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgMzApOworICAgICR3b3Jrc2hlZXQtPnNldF9zZWxlY3Rpb24oJ0IxJyk7CisgICAgCisgICAgCisgICAgIyBBZGQgYSBzYW1wbGUgZm9ybWF0CisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9zaXplKDEyKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworICAgICRmb3JtYXQtPnNldF9jb2xvcigncmVkJyk7CisgICAgJGZvcm1hdC0+c2V0X3VuZGVybGluZSgpOworICAgIAorICAgIAorICAgICMgV3JpdGUgc29tZSBoeXBlcmxpbmtzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ2h0dHA6Ly93d3cucGVybC5jb20vJyAgICAgICAgICAgICAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMycsICdodHRwOi8vd3d3LnBlcmwuY29tLycsICdQZXJsIGhvbWUnICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTUnLCAnaHR0cDovL3d3dy5wZXJsLmNvbS8nLCB1bmRlZiwgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E3JywgJ21haWx0bzpqbWNuYW1hcmFAY3Bhbi5vcmcnLCAnTWFpbCBtZScpOworICAgIAorICAgICMgV3JpdGUgYSBVUkwgdGhhdCBpc24ndCBhIGh5cGVybGluaworICAgICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZygnQTknLCAnaHR0cDovL3d3dy5wZXJsLmNvbS8nKTsKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvaHlwZXJsaW5rMS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGh5cGVybGluazIucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgV3JpdGVFeGNlbCBtb2R1bGUgdG8gd3JpdGUgaW50ZXJuYWwgYW5kIGludGVybmFsCitoeXBlcmxpbmtzLgorCitJZiB5b3Ugd2lzaCB0byBydW4gdGhpcyBwcm9ncmFtIGFuZCBmb2xsb3cgdGhlIGh5cGVybGlua3MgeW91IHNob3VsZCBjcmVhdGUKK3RoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZToKKworICAgIEM6XCAtLSBUZW1wIC0tKy0tIEV1cm9wZQorICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgXC0tIEFzaWEKKworCitTZWUgYWxzbyBoeXBlcmxpbmsxLnBsIGZvciB3ZWIgVVJMIGV4YW1wbGVzLgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFdyaXRlRXhjZWwgbW9kdWxlIHRvIHdyaXRlIGludGVybmFsIGFuZCBpbnRlcm5hbAorICAgICMgaHlwZXJsaW5rcy4KKyAgICAjCisgICAgIyBJZiB5b3Ugd2lzaCB0byBydW4gdGhpcyBwcm9ncmFtIGFuZCBmb2xsb3cgdGhlIGh5cGVybGlua3MgeW91IHNob3VsZCBjcmVhdGUKKyAgICAjIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZToKKyAgICAjCisgICAgIyAgICAgQzpcIC0tIFRlbXAgLS0rLS0gRXVyb3BlCisgICAgIyAgICAgICAgICAgICAgICAgICB8CisgICAgIyAgICAgICAgICAgICAgICAgICBcLS0gQXNpYQorICAgICMKKyAgICAjCisgICAgIyBTZWUgYWxzbyBoeXBlcmxpbmsxLnBsIGZvciB3ZWIgVVJMIGV4YW1wbGVzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgRmVicnVhcnkgMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIHRocmVlIHdvcmtib29rczoKKyAgICAjICAgQzpcVGVtcFxFdXJvcGVcSXJlbGFuZC54bHMKKyAgICAjICAgQzpcVGVtcFxFdXJvcGVcSXRhbHkueGxzCisgICAgIyAgIEM6XFRlbXBcQXNpYVxDaGluYS54bHMKKyAgICAjCisgICAgbXkgJGlyZWxhbmQgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ0M6XFRlbXBcRXVyb3BlXElyZWxhbmQueGxzJyk7CisgICAgbXkgJGlyZV9saW5rcyA9ICRpcmVsYW5kLT5hZGRfd29ya3NoZWV0KCdMaW5rcycpOworICAgIG15ICRpcmVfc2FsZXMgPSAkaXJlbGFuZC0+YWRkX3dvcmtzaGVldCgnU2FsZXMnKTsKKyAgICBteSAkaXJlX2RhdGEgID0gJGlyZWxhbmQtPmFkZF93b3Jrc2hlZXQoJ1Byb2R1Y3QgRGF0YScpOworICAgIAorICAgIG15ICRpdGFseSAgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdDOlxUZW1wXEV1cm9wZVxJdGFseS54bHMnKTsKKyAgICBteSAkaXRhX2xpbmtzID0gJGl0YWx5LT5hZGRfd29ya3NoZWV0KCdMaW5rcycpOworICAgIG15ICRpdGFfc2FsZXMgPSAkaXRhbHktPmFkZF93b3Jrc2hlZXQoJ1NhbGVzJyk7CisgICAgbXkgJGl0YV9kYXRhICA9ICRpdGFseS0+YWRkX3dvcmtzaGVldCgnUHJvZHVjdCBEYXRhJyk7CisgICAgCisgICAgbXkgJGNoaW5hICAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ0M6XFRlbXBcQXNpYVxDaGluYS54bHMnKTsKKyAgICBteSAkY2hhX2xpbmtzID0gJGNoaW5hLT5hZGRfd29ya3NoZWV0KCdMaW5rcycpOworICAgIG15ICRjaGFfc2FsZXMgPSAkY2hpbmEtPmFkZF93b3Jrc2hlZXQoJ1NhbGVzJyk7CisgICAgbXkgJGNoYV9kYXRhICA9ICRjaGluYS0+YWRkX3dvcmtzaGVldCgnUHJvZHVjdCBEYXRhJyk7CisgICAgCisgICAgIyBBZGQgYSBmb3JtYXQKKyAgICBteSAkZm9ybWF0ID0gJGlyZWxhbmQtPmFkZF9mb3JtYXQoY29sb3IgPT4gJ2dyZWVuJywgYm9sZCA9PiAxKTsKKyAgICAkaXJlX2xpbmtzLT5zZXRfY29sdW1uKCdBOkInLCAyNSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGVzIG9mIGludGVybmFsIGxpbmtzCisgICAgIworICAgICRpcmVfbGlua3MtPndyaXRlKCdBMScsICdJbnRlcm5hbCBsaW5rcycsICRmb3JtYXQpOworICAgIAorICAgICMgSW50ZXJuYWwgbGluaworICAgICRpcmVfbGlua3MtPndyaXRlKCdBMicsICdpbnRlcm5hbDpTYWxlcyFBMicpOworICAgIAorICAgICMgSW50ZXJuYWwgbGluayB0byBhIHJhbmdlCisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0EzJywgJ2ludGVybmFsOlNhbGVzIUEzOkQzJyk7CisgICAgCisgICAgIyBJbnRlcm5hbCBsaW5rIHdpdGggYW4gYWx0ZXJuYXRpdmUgc3RyaW5nCisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0E0JywgJ2ludGVybmFsOlNhbGVzIUE0JywgJ0xpbmsnKTsKKyAgICAKKyAgICAjIEludGVybmFsIGxpbmsgd2l0aCBhIGZvcm1hdAorICAgICRpcmVfbGlua3MtPndyaXRlKCdBNScsICdpbnRlcm5hbDpTYWxlcyFBNScsICRmb3JtYXQpOworICAgIAorICAgICMgSW50ZXJuYWwgbGluayB3aXRoIGFuIGFsdGVybmF0aXZlIHN0cmluZyBhbmQgZm9ybWF0CisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0E2JywgJ2ludGVybmFsOlNhbGVzIUE2JywgJ0xpbmsnLCAkZm9ybWF0KTsKKyAgICAKKyAgICAjIEludGVybmFsIGxpbmsgKHNwYWNlcyBpbiB3b3Jrc2hlZXQgbmFtZSkKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQTcnLCBxe2ludGVybmFsOidQcm9kdWN0IERhdGEnIUE3fSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGVzIG9mIGV4dGVybmFsIGxpbmtzCisgICAgIworICAgICRpcmVfbGlua3MtPndyaXRlKCdCMScsICdFeHRlcm5hbCBsaW5rcycsICRmb3JtYXQpOworICAgIAorICAgICMgRXh0ZXJuYWwgbGluayB0byBhIGxvY2FsIGZpbGUKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjInLCAnZXh0ZXJuYWw6SXRhbHkueGxzJyk7CisgICAgCisgICAgIyBFeHRlcm5hbCBsaW5rIHRvIGEgbG9jYWwgZmlsZSB3aXRoIHdvcmtzaGVldAorICAgICRpcmVfbGlua3MtPndyaXRlKCdCMycsICdleHRlcm5hbDpJdGFseS54bHMjU2FsZXMhQjMnKTsKKyAgICAKKyAgICAjIEV4dGVybmFsIGxpbmsgdG8gYSBsb2NhbCBmaWxlIHdpdGggd29ya3NoZWV0IGFuZCBhbHRlcm5hdGl2ZSBzdHJpbmcKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjQnLCAnZXh0ZXJuYWw6SXRhbHkueGxzI1NhbGVzIUI0JywgJ0xpbmsnKTsKKyAgICAKKyAgICAjIEV4dGVybmFsIGxpbmsgdG8gYSBsb2NhbCBmaWxlIHdpdGggd29ya3NoZWV0IGFuZCBmb3JtYXQKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjUnLCAnZXh0ZXJuYWw6SXRhbHkueGxzI1NhbGVzIUI1JywgJGZvcm1hdCk7CisgICAgCisgICAgIyBFeHRlcm5hbCBsaW5rIHRvIGEgcmVtb3RlIGZpbGUsIGFic29sdXRlIHBhdGgKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjYnLCAnZXh0ZXJuYWw6YzovVGVtcC9Bc2lhL0NoaW5hLnhscycpOworICAgIAorICAgICMgRXh0ZXJuYWwgbGluayB0byBhIHJlbW90ZSBmaWxlLCByZWxhdGl2ZSBwYXRoCisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0I3JywgJ2V4dGVybmFsOi4uL0FzaWEvQ2hpbmEueGxzJyk7CisgICAgCisgICAgIyBFeHRlcm5hbCBsaW5rIHRvIGEgcmVtb3RlIGZpbGUgd2l0aCB3b3Jrc2hlZXQKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjgnLCAnZXh0ZXJuYWw6YzovVGVtcC9Bc2lhL0NoaW5hLnhscyNTYWxlcyFCOCcpOworICAgIAorICAgICMgRXh0ZXJuYWwgbGluayB0byBhIHJlbW90ZSBmaWxlIHdpdGggd29ya3NoZWV0ICh3aXRoIHNwYWNlcyBpbiB0aGUgbmFtZSkKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjknLCBxe2V4dGVybmFsOmM6L1RlbXAvQXNpYS9DaGluYS54bHMjJ1Byb2R1Y3QgRGF0YSchQjl9KTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU29tZSB1dGlsaXR5IGxpbmtzIHRvIHJldHVybiB0byB0aGUgbWFpbiBzaGVldAorICAgICMKKyAgICAkaXJlX3NhbGVzLT53cml0ZSgnQTInLCAnaW50ZXJuYWw6TGlua3MhQTInLCAnQmFjaycpOworICAgICRpcmVfc2FsZXMtPndyaXRlKCdBMycsICdpbnRlcm5hbDpMaW5rcyFBMycsICdCYWNrJyk7CisgICAgJGlyZV9zYWxlcy0+d3JpdGUoJ0E0JywgJ2ludGVybmFsOkxpbmtzIUE0JywgJ0JhY2snKTsKKyAgICAkaXJlX3NhbGVzLT53cml0ZSgnQTUnLCAnaW50ZXJuYWw6TGlua3MhQTUnLCAnQmFjaycpOworICAgICRpcmVfc2FsZXMtPndyaXRlKCdBNicsICdpbnRlcm5hbDpMaW5rcyFBNicsICdCYWNrJyk7CisgICAgJGlyZV9kYXRhLT4gd3JpdGUoJ0E3JywgJ2ludGVybmFsOkxpbmtzIUE3JywgJ0JhY2snKTsKKyAgICAKKyAgICAkaXRhX2xpbmtzLT53cml0ZSgnQTEnLCAnZXh0ZXJuYWw6SXJlbGFuZC54bHMjTGlua3MhQjInLCAnQmFjaycpOworICAgICRpdGFfc2FsZXMtPndyaXRlKCdCMycsICdleHRlcm5hbDpJcmVsYW5kLnhscyNMaW5rcyFCMycsICdCYWNrJyk7CisgICAgJGl0YV9zYWxlcy0+d3JpdGUoJ0I0JywgJ2V4dGVybmFsOklyZWxhbmQueGxzI0xpbmtzIUI0JywgJ0JhY2snKTsKKyAgICAkaXRhX3NhbGVzLT53cml0ZSgnQjUnLCAnZXh0ZXJuYWw6SXJlbGFuZC54bHMjTGlua3MhQjUnLCAnQmFjaycpOworICAgICRjaGFfbGlua3MtPndyaXRlKCdBMScsICdleHRlcm5hbDouLi9FdXJvcGUvSXJlbGFuZC54bHMjTGlua3MhQjYnLCAnQmFjaycpOworICAgICRjaGFfc2FsZXMtPndyaXRlKCdCOCcsICdleHRlcm5hbDouLi9FdXJvcGUvSXJlbGFuZC54bHMjTGlua3MhQjgnLCAnQmFjaycpOworICAgICRjaGFfZGF0YS0+IHdyaXRlKCdCOScsICdleHRlcm5hbDouLi9FdXJvcGUvSXJlbGFuZC54bHMjTGlua3MhQjknLCAnQmFjaycpOworICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9oeXBlcmxpbmsyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogaW1hZ2VzLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byBpbnNlcnQgaW1hZ2VzIGludG8gYW4gRXhjZWwgd29ya3NoZWV0IHVzaW5nIHRoZQorU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaW5zZXJ0X2ltYWdlKCkgbWV0aG9kLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9pbWFnZXMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBpbWFnZXMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gaW5zZXJ0IGltYWdlcyBpbnRvIGFuIEV4Y2VsIHdvcmtzaGVldCB1c2luZyB0aGUKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGluc2VydF9pbWFnZSgpIG1ldGhvZC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE9jdG9iZXIgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGNhbGxlZCBzaW1wbGUueGxzIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImltYWdlcy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0MSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnSW1hZ2UgMScpOworICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdJbWFnZSAyJyk7CisgICAgbXkgJHdvcmtzaGVldDMgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0ltYWdlIDMnKTsKKyAgICBteSAkd29ya3NoZWV0NCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnSW1hZ2UgNCcpOworICAgIAorICAgICMgSW5zZXJ0IGEgYmFzaWMgaW1hZ2UKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExMCcsICJJbWFnZSBpbnNlcnRlZCBpbnRvIHdvcmtzaGVldC4iKTsKKyAgICAkd29ya3NoZWV0MS0+aW5zZXJ0X2ltYWdlKCdBMScsICdyZXB1YmxpYy5wbmcnKTsKKyAgICAKKyAgICAKKyAgICAjIEluc2VydCBhbiBpbWFnZSB3aXRoIGFuIG9mZnNldAorICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTEwJywgIkltYWdlIGluc2VydGVkIHdpdGggYW4gb2Zmc2V0LiIpOworICAgICR3b3Jrc2hlZXQyLT5pbnNlcnRfaW1hZ2UoJ0ExJywgJ3JlcHVibGljLnBuZycsIDMyLCAxMCk7CisgICAgCisgICAgIyBJbnNlcnQgYSBzY2FsZWQgaW1hZ2UKKyAgICAkd29ya3NoZWV0My0+d3JpdGUoJ0ExMCcsICJJbWFnZSBzY2FsZWQ6IHdpZHRoIHggMiwgaGVpZ2h0IHggMC44LiIpOworICAgICR3b3Jrc2hlZXQzLT5pbnNlcnRfaW1hZ2UoJ0ExJywgJ3JlcHVibGljLnBuZycsIDAsIDAsIDIsIDAuOCk7CisgICAgCisgICAgIyBJbnNlcnQgYW4gaW1hZ2Ugb3ZlciB2YXJpZWQgY29sdW1uIGFuZCByb3cgc2l6ZXMKKyAgICAjIFRoaXMgZG9lcyBub3QgcmVxdWlyZSBhbnkgYWRkaXRpb25hbCB3b3JrCisgICAgCisgICAgIyBTZXQgdGhlIGNvbHMgYW5kIHJvdyBzaXplcworICAgICMgTk9URTogeW91IG11c3QgZG8gdGhpcyBiZWZvcmUgeW91IGNhbGwgaW5zZXJ0X2ltYWdlKCkKKyAgICAkd29ya3NoZWV0NC0+c2V0X2NvbHVtbignQTpBJywgNSk7CisgICAgJHdvcmtzaGVldDQtPnNldF9jb2x1bW4oJ0I6QicsIHVuZGVmLCB1bmRlZiwgMSk7ICMgSGlkZGVuCisgICAgJHdvcmtzaGVldDQtPnNldF9jb2x1bW4oJ0M6RCcsIDEwKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3JvdygwLCAzMCk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMywgNSk7CisgICAgCisgICAgJHdvcmtzaGVldDQtPndyaXRlKCdBMTAnLCAiSW1hZ2UgaW5zZXJ0ZWQgb3ZlciBzY2FsZWQgcm93cyBhbmQgY29sdW1ucy4iKTsKKyAgICAkd29ya3NoZWV0NC0+aW5zZXJ0X2ltYWdlKCdBMScsICdyZXB1YmxpYy5wbmcnKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvaW1hZ2VzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogaW5kZW50LnBsCisKKworCitBIHNpbXBsZSBmb3JtYXR0aW5nIGV4YW1wbGUgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK1RoaXMgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMgdGhlIGluZGVudGF0aW9uIGNlbGwgZm9ybWF0LgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9pbmRlbnQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBpbmRlbnQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGZvcm1hdHRpbmcgZXhhbXBsZSB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyBUaGlzIHByb2dyYW0gZGVtb25zdHJhdGVzIHRoZSBpbmRlbnRhdGlvbiBjZWxsIGZvcm1hdC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1heSAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ2luZGVudC54bHMnKTsKKyAgICAKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGluZGVudDEgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChpbmRlbnQgPT4gMSk7CisgICAgbXkgJGluZGVudDIgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChpbmRlbnQgPT4gMik7CisgICAgCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNDApOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICJUaGlzIHRleHQgaXMgaW5kZW50ZWQgMSBsZXZlbCIsICAkaW5kZW50MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgIlRoaXMgdGV4dCBpcyBpbmRlbnRlZCAyIGxldmVscyIsICRpbmRlbnQyKTsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2luZGVudC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IG1lcmdlMS5wbAorCisKKworU2ltcGxlIGV4YW1wbGUgb2YgbWVyZ2luZyBjZWxscyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgorCitUaGlzIGV4YW1wbGUgbWVyZ2VzIHRocmVlIGNlbGxzIHVzaW5nIHRoZSAiQ2VudHJlIEFjcm9zcyBTZWxlY3Rpb24iCithbGlnbm1lbnQgd2hpY2ggd2FzIHRoZSBFeGNlbCA1IG1ldGhvZCBvZiBhY2hpZXZpbmcgYSBtZXJnZS4gRm9yIGEgbW9yZQorbW9kZXJuIGFwcHJvYWNoIHVzZSB0aGUgbWVyZ2VfcmFuZ2UoKSB3b3Jrc2hlZXQgbWV0aG9kIGluc3RlYWQuCitTZWUgdGhlIG1lcmdlMy5wbCAtIG1lcmdlNi5wbCBwcm9ncmFtcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvbWVyZ2UxLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gbWVyZ2UxLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU2ltcGxlIGV4YW1wbGUgb2YgbWVyZ2luZyBjZWxscyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBtZXJnZXMgdGhyZWUgY2VsbHMgdXNpbmcgdGhlICJDZW50cmUgQWNyb3NzIFNlbGVjdGlvbiIKKyAgICAjIGFsaWdubWVudCB3aGljaCB3YXMgdGhlIEV4Y2VsIDUgbWV0aG9kIG9mIGFjaGlldmluZyBhIG1lcmdlLiBGb3IgYSBtb3JlCisgICAgIyBtb2Rlcm4gYXBwcm9hY2ggdXNlIHRoZSBtZXJnZV9yYW5nZSgpIHdvcmtzaGVldCBtZXRob2QgaW5zdGVhZC4KKyAgICAjIFNlZSB0aGUgbWVyZ2UzLnBsIC0gbWVyZ2U2LnBsIHByb2dyYW1zLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIm1lcmdlMS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBJbmNyZWFzZSB0aGUgY2VsbCBzaXplIG9mIHRoZSBtZXJnZWQgY2VsbHMgdG8gaGlnaGxpZ2h0IHRoZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0I6RCcsIDIwKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDIsIDMwKTsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBhIG1lcmdlIGZvcm1hdAorICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoY2VudGVyX2Fjcm9zcyA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAjIE9ubHkgb25lIGNlbGwgc2hvdWxkIGNvbnRhaW4gdGV4dCwgdGhlIG90aGVycyBzaG91bGQgYmUgYmxhbmsuCisgICAgJHdvcmtzaGVldC0+d3JpdGUgICAgICAoMiwgMSwgIkNlbnRlciBhY3Jvc3Mgc2VsZWN0aW9uIiwgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfYmxhbmsoMiwgMiwgICAgICAgICAgICAgICAgICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2JsYW5rKDIsIDMsICAgICAgICAgICAgICAgICAkZm9ybWF0KTsKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvbWVyZ2UxLnBsPgorCis9aGVhZDIgRXhhbXBsZTogbWVyZ2UyLnBsCisKKworCitTaW1wbGUgZXhhbXBsZSBvZiBtZXJnaW5nIGNlbGxzIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUKKworVGhpcyBleGFtcGxlIG1lcmdlcyB0aHJlZSBjZWxscyB1c2luZyB0aGUgIkNlbnRyZSBBY3Jvc3MgU2VsZWN0aW9uIgorYWxpZ25tZW50IHdoaWNoIHdhcyB0aGUgRXhjZWwgNSBtZXRob2Qgb2YgYWNoaWV2aW5nIGEgbWVyZ2UuIEZvciBhIG1vcmUKK21vZGVybiBhcHByb2FjaCB1c2UgdGhlIG1lcmdlX3JhbmdlKCkgd29ya3NoZWV0IG1ldGhvZCBpbnN0ZWFkLgorU2VlIHRoZSBtZXJnZTMucGwgLSBtZXJnZTYucGwgcHJvZ3JhbXMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL21lcmdlMi5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIG1lcmdlMi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNpbXBsZSBleGFtcGxlIG9mIG1lcmdpbmcgY2VsbHMgdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZQorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBtZXJnZXMgdGhyZWUgY2VsbHMgdXNpbmcgdGhlICJDZW50cmUgQWNyb3NzIFNlbGVjdGlvbiIKKyAgICAjIGFsaWdubWVudCB3aGljaCB3YXMgdGhlIEV4Y2VsIDUgbWV0aG9kIG9mIGFjaGlldmluZyBhIG1lcmdlLiBGb3IgYSBtb3JlCisgICAgIyBtb2Rlcm4gYXBwcm9hY2ggdXNlIHRoZSBtZXJnZV9yYW5nZSgpIHdvcmtzaGVldCBtZXRob2QgaW5zdGVhZC4KKyAgICAjIFNlZSB0aGUgbWVyZ2UzLnBsIC0gbWVyZ2U2LnBsIHByb2dyYW1zLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIm1lcmdlMi54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBJbmNyZWFzZSB0aGUgY2VsbCBzaXplIG9mIHRoZSBtZXJnZWQgY2VsbHMgdG8gaGlnaGxpZ2h0IHRoZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMSwgMiwgMzApOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMiwgNDApOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgbWVyZ2VkIGZvcm1hdAorICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9hY3Jvc3MgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgID0+IDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgICAgICAgID0+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgICAgICAgICA9PiAnd2hpdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZ19jb2xvciAgICAgICAgPT4gJ2dyZWVuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyX2NvbG9yICAgID0+ICd5ZWxsb3cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgICAgICAgICAgPT4gJ3ZjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIAorICAgICMgT25seSBvbmUgY2VsbCBzaG91bGQgY29udGFpbiB0ZXh0LCB0aGUgb3RoZXJzIHNob3VsZCBiZSBibGFuay4KKyAgICAkd29ya3NoZWV0LT53cml0ZSAgICAgICgyLCAxLCAiQ2VudGVyIGFjcm9zcyBzZWxlY3Rpb24iLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9ibGFuaygyLCAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0KTsKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvbWVyZ2UyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogbWVyZ2UzLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gd3JpdGUgYSBoeXBlcmxpbmsgaW4gYQorbWVyZ2VkIGNlbGwuIFRoZXJlIGFyZSB0d28gb3B0aW9ucyB3cml0ZV91cmxfcmFuZ2UoKSB3aXRoIGEgc3RhbmRhcmQgbWVyZ2UKK2Zvcm1hdCBvciBtZXJnZV9yYW5nZSgpLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9tZXJnZTMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBtZXJnZTMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gd3JpdGUgYSBoeXBlcmxpbmsgaW4gYQorICAgICMgbWVyZ2VkIGNlbGwuIFRoZXJlIGFyZSB0d28gb3B0aW9ucyB3cml0ZV91cmxfcmFuZ2UoKSB3aXRoIGEgc3RhbmRhcmQgbWVyZ2UKKyAgICAjIGZvcm1hdCBvciBtZXJnZV9yYW5nZSgpLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ21lcmdlMy54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBJbmNyZWFzZSB0aGUgY2VsbCBzaXplIG9mIHRoZSBtZXJnZWQgY2VsbHMgdG8gaGlnaGxpZ2h0IHRoZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQtPnNldF9yb3coJF8sIDMwKSBmb3IgKDEsIDMsIDYsIDcpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0I6RCcsIDIwKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxOiBNZXJnZSBjZWxscyBjb250YWluaW5nIGEgaHlwZXJsaW5rIHVzaW5nIHdyaXRlX3VybF9yYW5nZSgpCisgICAgIyBhbmQgdGhlIHN0YW5kYXJkIEV4Y2VsIDUrIG1lcmdlIHByb3BlcnR5LgorICAgICMKKyAgICBteSAkZm9ybWF0MSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfYWNyb3NzICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmUgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgICAgICAgICAgPT4gJ2JsdWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgY2VsbHMgdG8gYmUgbWVyZ2VkCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsX3JhbmdlKCdCMjpEMicsICdodHRwOi8vd3d3LnBlcmwuY29tJywgJGZvcm1hdDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2JsYW5rKCdDMicsICRmb3JtYXQxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9ibGFuaygnRDInLCAkZm9ybWF0MSk7CisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMjogTWVyZ2UgY2VsbHMgY29udGFpbmluZyBhIGh5cGVybGluayB1c2luZyBtZXJnZV9yYW5nZSgpLgorICAgICMKKyAgICBteSAkZm9ybWF0MiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZSAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICAgICAgPT4gJ2JsdWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICAgICAgID0+ICdjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgICAgID0+ICd2Y2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAjIE1lcmdlIDMgY2VsbHMKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjQ6RDQnLCAnaHR0cDovL3d3dy5wZXJsLmNvbScsICRmb3JtYXQyKTsKKyAgICAKKyAgICAKKyAgICAjIE1lcmdlIDMgY2VsbHMgb3ZlciB0d28gcm93cworICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdCNzpEOCcsICdodHRwOi8vd3d3LnBlcmwuY29tJywgJGZvcm1hdDIpOworICAgIAorICAgIAorICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tZXJnZTMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBtZXJnZTQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbWVyZ2VfcmFuZ2UoKSB3b3JrYm9vaworbWV0aG9kIHdpdGggY29tcGxleCBmb3JtYXR0aW5nLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9tZXJnZTQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBtZXJnZTQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1lcmdlX3JhbmdlKCkgd29ya2Jvb2sKKyAgICAjIG1ldGhvZCB3aXRoIGNvbXBsZXggZm9ybWF0dGluZy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDAyLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdtZXJnZTQueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgSW5jcmVhc2UgdGhlIGNlbGwgc2l6ZSBvZiB0aGUgbWVyZ2VkIGNlbGxzIHRvIGhpZ2hsaWdodCB0aGUgZm9ybWF0dGluZy4KKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KCRfLCAzMCkgZm9yICgxLi4xMSk7CisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQjpEJywgMjApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDE6IFRleHQgY2VudGVyZWQgdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5CisgICAgIworICAgIG15ICRmb3JtYXQxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICA9PiAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZ24gID0+ICd2Y2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgID0+ICdjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjI6RDMnLCAnVmVydGljYWwgYW5kIGhvcml6b250YWwnLCAkZm9ybWF0MSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMjogVGV4dCBhbGlnbmVkIHRvIHRoZSB0b3AgYW5kIGxlZnQKKyAgICAjCisgICAgbXkgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgPT4gJ3RvcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gICA9PiAnbGVmdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0I1OkQ2JywgJ0FsaWduZWQgdG8gdGhlIHRvcCBhbmQgbGVmdCcsICRmb3JtYXQyKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzOiAgVGV4dCBhbGlnbmVkIHRvIHRoZSBib3R0b20gYW5kIHJpZ2h0CisgICAgIworICAgIG15ICRmb3JtYXQzID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICA9PiAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZ24gID0+ICdib3R0b20nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICAgPT4gJ3JpZ2h0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjg6RDknLCAnQWxpZ25lZCB0byB0aGUgYm90dG9tIGFuZCByaWdodCcsICRmb3JtYXQzKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0OiAgVGV4dCBqdXN0aWZpZWQgKGkuZS4gd3JhcHBlZCkgaW4gdGhlIGNlbGwKKyAgICAjCisgICAgbXkgJGZvcm1hdDQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgPT4gJ3RvcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gICA9PiAnanVzdGlmeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0IxMTpEMTInLCAnSnVzdGlmaWVkOiAnLidzbyBvbiBhbmQgJyB4MTgsICRmb3JtYXQ0KTsKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvbWVyZ2U0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogbWVyZ2U1LnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1lcmdlX2NlbGxzKCkgd29ya2Jvb2sKK21ldGhvZCB3aXRoIGNvbXBsZXggZm9ybWF0dGluZyBhbmQgcm90YXRpb24uCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvbWVyZ2U1LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gbWVyZ2U1LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtZXJnZV9jZWxscygpIHdvcmtib29rCisgICAgIyBtZXRob2Qgd2l0aCBjb21wbGV4IGZvcm1hdHRpbmcgYW5kIHJvdGF0aW9uLgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDAyLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdtZXJnZTUueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgSW5jcmVhc2UgdGhlIGNlbGwgc2l6ZSBvZiB0aGUgbWVyZ2VkIGNlbGxzIHRvIGhpZ2hsaWdodCB0aGUgZm9ybWF0dGluZy4KKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KCRfLCAzNikgICAgICAgICBmb3IgKDMuLjgpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJF8sICRfICwgMTUpIGZvciAoMSwzLDUpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBSb3RhdGlvbiAxLCBsZXR0ZXJzIHJ1biBmcm9tIHRvcCB0byBib3R0b20KKyAgICAjCisgICAgbXkgJGZvcm1hdDEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgICAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgICAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgICAgID0+ICd2Y2VudHJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgICAgICA9PiAnY2VudHJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiAgICA9PiAyNzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0I0OkI5JywgJ1JvdGF0aW9uIDI3MCcsICRmb3JtYXQxKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgUm90YXRpb24gMiwgOTCwIGFudGljbG9ja3dpc2UKKyAgICAjCisgICAgbXkgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgICAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgICAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgICAgID0+ICd2Y2VudHJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgICAgICA9PiAnY2VudHJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiAgICA9PiA5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnRDQ6RDknLCAnUm90YXRpb24gOTCwJywgJGZvcm1hdDIpOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBSb3RhdGlvbiAzLCA5MLAgY2xvY2t3aXNlCisgICAgIworICAgIG15ICRmb3JtYXQzID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgICAgID0+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZCAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgICAgICA9PiAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZ24gICAgICA9PiAndmNlbnRyZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gICAgICAgPT4gJ2NlbnRyZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gICAgPT4gLTkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdGNDpGOScsICdSb3RhdGlvbiAtOTCwJywgJGZvcm1hdDMpOworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tZXJnZTUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBtZXJnZTYucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbWVyZ2VfY2VsbHMoKSB3b3JrYm9vaworbWV0aG9kIHdpdGggVW5pY29kZSBzdHJpbmdzLgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL21lcmdlNi5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIG1lcmdlNi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbWVyZ2VfY2VsbHMoKSB3b3JrYm9vaworICAgICMgbWV0aG9kIHdpdGggVW5pY29kZSBzdHJpbmdzLgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIERlY2VtYmVyIDIwMDUsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ21lcmdlNi54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBJbmNyZWFzZSB0aGUgY2VsbCBzaXplIG9mIHRoZSBtZXJnZWQgY2VsbHMgdG8gaGlnaGxpZ2h0IHRoZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQtPnNldF9yb3coJF8sIDM2KSBmb3IgMi4uOTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkQnLCAyNSk7CisgICAgCisgICAgCisgICAgIyBGb3JtYXQgZm9yIHRoZSBtZXJnZWQgY2VsbHMuCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICAgICAgPT4gJ3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgICAgICAgPT4gMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWduICAgICAgPT4gJ3ZjZW50cmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICAgICAgID0+ICdsZWZ0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBXcml0ZSBhbiBBc2NpaSBzdHJpbmcuCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdCMzpENCcsICdBU0NJSTogQSBzaW1wbGUgc3RyaW5nJywgJGZvcm1hdCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFdyaXRlIGEgVVRGLTE2IFVuaWNvZGUgc3RyaW5nLgorICAgICMKKyAgICAKKyAgICAjIEEgcGhyYXNlIGluIEN5cmlsbGljIGVuY29kZWQgYXMgVVRGLTE2QkUuCisgICAgbXkgJHV0ZjE2X3N0ciA9IHBhY2sgIkgqIiwgJzAwNTUwMDU0MDA0NjAwMmQwMDMxMDAzNjAwM2EwMDIwJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDQyZDA0NDIwNDNlMDAyMDA0NDQwNDQwMDQzMDA0MzcwNDMwMDAyMDA0Jy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnM2QwNDMwMDAyMDA0NDAwNDQzMDQ0MTA0NDEwNDNhMDQzZTA0M2MwMDIxJzsKKyAgICAKKyAgICAjIE5vdGUgdGhlIGV4dHJhIHBhcmFtZXRlciBhdCB0aGUgZW5kIHRvIGluZGljYXRlIFVURi0xNiBlbmNvZGluZy4KKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjY6RDcnLCAkdXRmMTZfc3RyLCAkZm9ybWF0LCAxKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgV3JpdGUgYSBVVEYtOCBVbmljb2RlIHN0cmluZy4KKyAgICAjCisgICAgCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIG15ICRzbWlsZXkgPSBjaHIgMHgyNjNhOworICAgICAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjk6RDEwJywgIlVURi04OiBBIFVuaWNvZGUgc21pbGV5ICRzbWlsZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0I5OkQxMCcsICJVVEYtODogUmVxdWlyZXMgUGVybCA1LjgiLCAkZm9ybWF0KTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tZXJnZTYucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBtb2RfcGVybDEucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHRvIHNlbmQgYW4gRXhjZWwKK2ZpbGUgdG8gYSBicm93c2VyIHVzaW5nIG1vZF9wZXJsIDEgYW5kIEFwYWNoZQorCitUaGlzIG1vZHVsZSB0aWVzICpYTFMgZGlyZWN0bHkgdG8gQXBhY2hlLCBhbmQgd2l0aCB0aGUgY29ycmVjdAorY29udGVudC1kaXNwb3NpdGlvbi90eXBlcyBpdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBzYXZlCit0aGUgZmlsZSwgb3Igb3BlbiBpdCBhdCB0aGlzIGxvY2F0aW9uLgorCitUaGlzIHNjcmlwdCBpcyBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgY2dpLnBsIGV4YW1wbGUuCisKK0NoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgdG8gQ2dpLnBtLgorQ2hhbmdlIHRoZSBwYWNrYWdlIGxvY2F0aW9uIHRvIHdoZXJlIGV2ZXIgeW91IGxvY2F0ZSB0aGlzIHBhY2thZ2UuCitJbiB0aGUgZXhhbXBsZSBiZWxvdyBpdCBpcyBsb2NhdGVkIGluIHRoZSBXcml0ZUV4Y2VsIGRpcmVjdG9yeS4KKworWW91ciBodHRwZC5jb25mIGVudHJ5IGZvciB0aGlzIG1vZHVsZSwgc2hvdWxkIHlvdSBjaG9vc2UgdG8gdXNlIGl0CithcyBhIHN0YW5kIGFsb25lIGFwcCwgc2hvdWxkIGxvb2sgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOgorCisgICAgPExvY2F0aW9uIC9zcHJlYWRzaGVldC10ZXN0PgorICAgICAgU2V0SGFuZGxlciBwZXJsLXNjcmlwdAorICAgICAgUGVybEhhbmRsZXIgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNnaQorICAgICAgUGVybFNlbmRIZWFkZXIgT24KKyAgICA8L0xvY2F0aW9uPgorCitUaGUgUGVybEhhbmRsZXIgbmFtZSBhYm92ZSBhbmQgdGhlIHBhY2thZ2UgbmFtZSBiZWxvdyAqaGF2ZSogdG8gbWF0Y2guCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8gc2VuZCBhbiBFeGNlbAorICAgICMgZmlsZSB0byBhIGJyb3dzZXIgdXNpbmcgbW9kX3BlcmwgMSBhbmQgQXBhY2hlCisgICAgIworICAgICMgVGhpcyBtb2R1bGUgdGllcyAqWExTIGRpcmVjdGx5IHRvIEFwYWNoZSwgYW5kIHdpdGggdGhlIGNvcnJlY3QKKyAgICAjIGNvbnRlbnQtZGlzcG9zaXRpb24vdHlwZXMgaXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gc2F2ZQorICAgICMgdGhlIGZpbGUsIG9yIG9wZW4gaXQgYXQgdGhpcyBsb2NhdGlvbi4KKyAgICAjCisgICAgIyBUaGlzIHNjcmlwdCBpcyBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgY2dpLnBsIGV4YW1wbGUuCisgICAgIworICAgICMgQ2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgZmlsZSB0byBDZ2kucG0uCisgICAgIyBDaGFuZ2UgdGhlIHBhY2thZ2UgbG9jYXRpb24gdG8gd2hlcmUgZXZlciB5b3UgbG9jYXRlIHRoaXMgcGFja2FnZS4KKyAgICAjIEluIHRoZSBleGFtcGxlIGJlbG93IGl0IGlzIGxvY2F0ZWQgaW4gdGhlIFdyaXRlRXhjZWwgZGlyZWN0b3J5LgorICAgICMKKyAgICAjIFlvdXIgaHR0cGQuY29uZiBlbnRyeSBmb3IgdGhpcyBtb2R1bGUsIHNob3VsZCB5b3UgY2hvb3NlIHRvIHVzZSBpdAorICAgICMgYXMgYSBzdGFuZCBhbG9uZSBhcHAsIHNob3VsZCBsb29rIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzoKKyAgICAjCisgICAgIyAgICAgPExvY2F0aW9uIC9zcHJlYWRzaGVldC10ZXN0PgorICAgICMgICAgICAgU2V0SGFuZGxlciBwZXJsLXNjcmlwdAorICAgICMgICAgICAgUGVybEhhbmRsZXIgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNnaQorICAgICMgICAgICAgUGVybFNlbmRIZWFkZXIgT24KKyAgICAjICAgICA8L0xvY2F0aW9uPgorICAgICMKKyAgICAjIFRoZSBQZXJsSGFuZGxlciBuYW1lIGFib3ZlIGFuZCB0aGUgcGFja2FnZSBuYW1lIGJlbG93ICpoYXZlKiB0byBtYXRjaC4KKyAgICAKKyAgICAjIEFwciAyMDAxLCBUaG9tYXMgU3VsbGl2YW4sIHdlYm1hc3RlckA4NjAub3JnCisgICAgIyBGZWIgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgCisgICAgcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2dpOworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgUHJhZ21hIERlZmluaXRpb25zCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgdXNlIHN0cmljdDsKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIFJlcXVpcmVkIE1vZHVsZXMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICB1c2UgQXBhY2hlOjpDb25zdGFudHMgcXcoOmNvbW1vbik7CisgICAgdXNlIEFwYWNoZTo6UmVxdWVzdDsKKyAgICB1c2UgQXBhY2hlOjpVUkk7ICMgVGhpcyBtYXkgbm90IGJlIG5lZWRlZAorICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIE1haW4gQXBwIEJvZHkKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICBzdWIgaGFuZGxlciB7CisgICAgICAgICMgTmV3IGFwYWNoZSBvYmplY3QKKyAgICAgICAgIyBTaG91bGQgeW91IGRlY2lkZSB0byB1c2UgaXQuCisgICAgICAgIG15ICRyID0gQXBhY2hlOjpSZXF1ZXN0LT5uZXcoc2hpZnQpOworICAgIAorICAgICAgICAjIFNldCB0aGUgZmlsZW5hbWUgYW5kIHNlbmQgdGhlIGNvbnRlbnQgdHlwZQorICAgICAgICAjIFRoaXMgd2lsbCBhcHBlYXIgd2hlbiB0aGV5IHNhdmUgdGhlIHNwcmVhZHNoZWV0CisgICAgICAgIG15ICRmaWxlbmFtZSA9ImNnaXRlc3QueGxzIjsKKyAgICAKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIyBTZW5kIHRoZSBjb250ZW50IHR5cGUgaGVhZGVycworICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgIHByaW50ICJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPSRmaWxlbmFtZVxuIjsKKyAgICAgICAgcHJpbnQgIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXG5cbiI7CisgICAgCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyBUaWUgYSBmaWxlaGFuZGxlIHRvIEFwYWNoZSdzIFNURE9VVC4KKyAgICAgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldC4KKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICB0aWUgKlhMUyA9PiAnQXBhY2hlJzsKKyAgICAgICAgYmlubW9kZSgqWExTKTsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoXCpYTFMpOworICAgICAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbiAxCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgMjApOworICAgIAorICAgIAorICAgICAgICAjIENyZWF0ZSBhIGZvcm1hdAorICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgICAgICRmb3JtYXQtPnNldF9zaXplKDE1KTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgCisgICAgCisgICAgICAgICMgV3JpdGUgdG8gdGhlIHdvcmtib29rCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICJIaSBFeGNlbCEiLCAkZm9ybWF0KTsKKyAgICAKKyAgICAgICAgIyBZb3UgbXVzdCBjbG9zZSB0aGUgd29ya2Jvb2sgZm9yIENvbnRlbnQtZGlzcG9zaXRpb24KKyAgICAgICAgJHdvcmtib29rLT5jbG9zZSgpOworICAgIH0KKyAgICAKKyAgICAxOworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tb2RfcGVybDEucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBtb2RfcGVybDIucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHRvIHNlbmQgYW4gRXhjZWwKK2ZpbGUgdG8gYSBicm93c2VyIHVzaW5nIG1vZF9wZXJsIDIgYW5kIEFwYWNoZS4KKworVGhpcyBtb2R1bGUgdGllcyAqWExTIGRpcmVjdGx5IHRvIEFwYWNoZSwgYW5kIHdpdGggdGhlIGNvcnJlY3QKK2NvbnRlbnQtZGlzcG9zaXRpb24vdHlwZXMgaXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gc2F2ZQordGhlIGZpbGUsIG9yIG9wZW4gaXQgYXQgdGhpcyBsb2NhdGlvbi4KKworVGhpcyBzY3JpcHQgaXMgYSBtb2RpZmljYXRpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGNnaS5wbCBleGFtcGxlLgorCitDaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIHRvIE1QMlRlc3QucG0uCitDaGFuZ2UgdGhlIHBhY2thZ2UgbG9jYXRpb24gdG8gd2hlcmUgZXZlciB5b3UgbG9jYXRlIHRoaXMgcGFja2FnZS4KK0luIHRoZSBleGFtcGxlIGJlbG93IGl0IGlzIGxvY2F0ZWQgaW4gdGhlIFdyaXRlRXhjZWwgZGlyZWN0b3J5LgorCitZb3VyIGh0dHBkLmNvbmYgZW50cnkgZm9yIHRoaXMgbW9kdWxlLCBzaG91bGQgeW91IGNob29zZSB0byB1c2UgaXQKK2FzIGEgc3RhbmQgYWxvbmUgYXBwLCBzaG91bGQgbG9vayBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6CisKKyAgICBQZXJsTW9kdWxlIEFwYWNoZTI6OlJlcXVlc3RSZWMKKyAgICBQZXJsTW9kdWxlIEFQUjo6VGFibGUKKyAgICBQZXJsTW9kdWxlIEFwYWNoZTI6OlJlcXVlc3RJTworCisgICAgPExvY2F0aW9uIC9zcHJlYWRzaGVldC10ZXN0PgorICAgICAgIFNldEhhbmRsZXIgcGVybC1zY3JpcHQKKyAgICAgICBQZXJsUmVzcG9uc2VIYW5kbGVyIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpNUDJUZXN0CisgICAgPC9Mb2NhdGlvbj4KKworVGhlIFBlcmxSZXNwb25zZUhhbmRsZXIgbXVzdCBtYXRjaCB0aGUgcGFja2FnZSBuYW1lIGJlbG93LgorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHRvIHNlbmQgYW4gRXhjZWwKKyAgICAjIGZpbGUgdG8gYSBicm93c2VyIHVzaW5nIG1vZF9wZXJsIDIgYW5kIEFwYWNoZS4KKyAgICAjCisgICAgIyBUaGlzIG1vZHVsZSB0aWVzICpYTFMgZGlyZWN0bHkgdG8gQXBhY2hlLCBhbmQgd2l0aCB0aGUgY29ycmVjdAorICAgICMgY29udGVudC1kaXNwb3NpdGlvbi90eXBlcyBpdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBzYXZlCisgICAgIyB0aGUgZmlsZSwgb3Igb3BlbiBpdCBhdCB0aGlzIGxvY2F0aW9uLgorICAgICMKKyAgICAjIFRoaXMgc2NyaXB0IGlzIGEgbW9kaWZpY2F0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBjZ2kucGwgZXhhbXBsZS4KKyAgICAjCisgICAgIyBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIHRvIE1QMlRlc3QucG0uCisgICAgIyBDaGFuZ2UgdGhlIHBhY2thZ2UgbG9jYXRpb24gdG8gd2hlcmUgZXZlciB5b3UgbG9jYXRlIHRoaXMgcGFja2FnZS4KKyAgICAjIEluIHRoZSBleGFtcGxlIGJlbG93IGl0IGlzIGxvY2F0ZWQgaW4gdGhlIFdyaXRlRXhjZWwgZGlyZWN0b3J5LgorICAgICMKKyAgICAjIFlvdXIgaHR0cGQuY29uZiBlbnRyeSBmb3IgdGhpcyBtb2R1bGUsIHNob3VsZCB5b3UgY2hvb3NlIHRvIHVzZSBpdAorICAgICMgYXMgYSBzdGFuZCBhbG9uZSBhcHAsIHNob3VsZCBsb29rIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzoKKyAgICAjCisgICAgIyAgICAgUGVybE1vZHVsZSBBcGFjaGUyOjpSZXF1ZXN0UmVjCisgICAgIyAgICAgUGVybE1vZHVsZSBBUFI6OlRhYmxlCisgICAgIyAgICAgUGVybE1vZHVsZSBBcGFjaGUyOjpSZXF1ZXN0SU8KKyAgICAjCisgICAgIyAgICAgPExvY2F0aW9uIC9zcHJlYWRzaGVldC10ZXN0PgorICAgICMgICAgICAgIFNldEhhbmRsZXIgcGVybC1zY3JpcHQKKyAgICAjICAgICAgICBQZXJsUmVzcG9uc2VIYW5kbGVyIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpNUDJUZXN0CisgICAgIyAgICAgPC9Mb2NhdGlvbj4KKyAgICAjCisgICAgIyBUaGUgUGVybFJlc3BvbnNlSGFuZGxlciBtdXN0IG1hdGNoIHRoZSBwYWNrYWdlIG5hbWUgYmVsb3cuCisgICAgCisgICAgIyBKdW4gMjAwNCwgTWF0aXNzZSBFbnplciwgbWF0aXNzZUBtYXRpc3NlLm5ldCAgKG1vZF9wZXJsIDIgdmVyc2lvbikKKyAgICAjIEFwciAyMDAxLCBUaG9tYXMgU3VsbGl2YW4sIHdlYm1hc3RlckA4NjAub3JnCisgICAgIyBGZWIgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgCisgICAgcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6TVAyVGVzdDsKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIFByYWdtYSBEZWZpbml0aW9ucworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIHVzZSBzdHJpY3Q7CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyBSZXF1aXJlZCBNb2R1bGVzCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgdXNlIEFwYWNoZTI6OkNvbnN0IC1jb21waWxlID0+IHF3KCA6Y29tbW9uICk7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgTWFpbiBBcHAgQm9keQorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIHN1YiBoYW5kbGVyIHsKKyAgICAgICAgbXkoJHIpID0gQF87ICAjIEFwYWNoZSByZXF1ZXN0IG9iamVjdCBpcyBwYXNzZWQgdG8gaGFuZGxlciBpbiBtb2RfcGVybCAyCisgICAgCisgICAgICAgICMgU2V0IHRoZSBmaWxlbmFtZSBhbmQgc2VuZCB0aGUgY29udGVudCB0eXBlCisgICAgICAgICMgVGhpcyB3aWxsIGFwcGVhciB3aGVuIHRoZXkgc2F2ZSB0aGUgc3ByZWFkc2hlZXQKKyAgICAgICAgbXkgJGZpbGVuYW1lID0ibW9kX3BlcmwyX3Rlc3QueGxzIjsKKyAgICAKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIyBTZW5kIHRoZSBjb250ZW50IHR5cGUgaGVhZGVycyB0aGUgbW9kX3BlcmwgMiB3YXkKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAkci0+aGVhZGVyc19vdXQtPnsnQ29udGVudC1EaXNwb3NpdGlvbid9ID0gImF0dGFjaG1lbnQ7ZmlsZW5hbWU9JGZpbGVuYW1lIjsKKyAgICAgICAgJHItPmNvbnRlbnRfdHlwZSgnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJyk7CisgICAgCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyBUaWUgYSBmaWxlaGFuZGxlIHRvIEFwYWNoZSdzIFNURE9VVC4KKyAgICAgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldC4KKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICB0aWUgKlhMUyA9PiAkcjsgICMgVGhlIG1vZF9wZXJsIDIgd2F5LiBUaWUgdG8gdGhlIEFwYWNoZTo6UmVxdWVzdFJlYyBvYmplY3QKKyAgICAgICAgYmlubW9kZSgqWExTKTsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoXCpYTFMpOworICAgICAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbiAxCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgMjApOworICAgIAorICAgIAorICAgICAgICAjIENyZWF0ZSBhIGZvcm1hdAorICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgICAgICRmb3JtYXQtPnNldF9zaXplKDE1KTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgCisgICAgCisgICAgICAgICMgV3JpdGUgdG8gdGhlIHdvcmtib29rCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdIaSBFeGNlbCEgZnJvbSAnIC4gJHItPmhvc3RuYW1lICwgJGZvcm1hdCk7CisgICAgCisgICAgICAgICMgWW91IG11c3QgY2xvc2UgdGhlIHdvcmtib29rIGZvciBDb250ZW50LWRpc3Bvc2l0aW9uCisgICAgICAgICR3b3JrYm9vay0+Y2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIEFwYWNoZTI6OkNvbnN0OjpPSzsKKyAgICB9CisgICAgCisgICAgMTsKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvbW9kX3BlcmwyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogb3V0bGluZS5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRvIGdlbmVyYXRlIEV4Y2VsIG91dGxpbmVzIGFuZAorZ3JvdXBpbmcuCisKKworRXhjZWwgYWxsb3dzIHlvdSB0byBncm91cCByb3dzIG9yIGNvbHVtbnMgc28gdGhhdCB0aGV5IGNhbiBiZSBoaWRkZW4gb3IKK2Rpc3BsYXllZCB3aXRoIGEgc2luZ2xlIG1vdXNlIGNsaWNrLiBUaGlzIGZlYXR1cmUgaXMgcmVmZXJyZWQgdG8gYXMgb3V0bGluZXMuCisKK091dGxpbmVzIGNhbiByZWR1Y2UgY29tcGxleCBkYXRhIGRvd24gdG8gYSBmZXcgc2FsaWVudCBzdWItdG90YWxzIG9yIAorc3VtbWFyaWVzLgorCitUaGlzIGZlYXR1cmUgaXMgYmVzdCB2aWV3ZWQgaW4gRXhjZWwgYnV0IHRoZSBmb2xsb3dpbmcgaXMgYW4gQVNDSUkKK3JlcHJlc2VudGF0aW9uIG9mIHdoYXQgYSB3b3Jrc2hlZXQgd2l0aCB0aHJlZSBvdXRsaW5lcyBtaWdodCBsb29rIGxpa2UuCitSb3dzIDMtNCBhbmQgcm93cyA3LTggYXJlIGdyb3VwZWQgYXQgbGV2ZWwgMi4gUm93cyAyLTkgYXJlIGdyb3VwZWQgYXQKK2xldmVsIDEuIFRoZSBsaW5lcyBhdCB0aGUgbGVmdCBoYW5kIHNpZGUgYXJlIGNhbGxlZCBvdXRsaW5lIGxldmVsIGJhcnMuCisKKworICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBfICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8ICBfICB8IDIgfCAgIEIgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCB8ICAgfCAzIHwgIChDKSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgfCAgIHwgNCB8ICAoRCkgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8IC0gICB8IDUgfCAgIEUgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCAgXyAgfCA2IHwgICBGICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgfCAgIHwgNyB8ICAoRykgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8IHwgICB8IDggfCAgKEgpICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCAtICAgfCA5IHwgICBJICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIC0gICAgIHwgLiB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLgorCisKK0NsaWNraW5nIHRoZSBtaW51cyBzaWduIG9uIGVhY2ggb2YgdGhlIGxldmVsIDIgb3V0bGluZXMgd2lsbCBjb2xsYXBzZSBhbmQKK2hpZGUgdGhlIGRhdGEgYXMgc2hvd24gaW4gdGhlIG5leHQgZmlndXJlLiBUaGUgbWludXMgc2lnbiBjaGFuZ2VzIHRvIGEgcGx1cworc2lnbiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBkYXRhIGluIHRoZSBvdXRsaW5lIGlzIGhpZGRlbi4KKworICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBfICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8ICAgICB8IDIgfCAgIEIgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCArICAgfCA1IHwgICBFICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgICAgIHwgNiB8ICAgRiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8ICsgICB8IDkgfCAgIEkgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgLSAgICAgfCAuIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uCisKKworQ2xpY2tpbmcgb24gdGhlIG1pbnVzIHNpZ24gb24gdGhlIGxldmVsIDEgb3V0bGluZSB3aWxsIGNvbGxhcHNlIHRoZSByZW1haW5pbmcKK3Jvd3MgYXMgZm9sbG93czoKKworICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICArICAgICB8IC4gfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4KKworU2VlIHRoZSBtYWluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL291dGxpbmUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBvdXRsaW5lLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRvIGdlbmVyYXRlIEV4Y2VsIG91dGxpbmVzIGFuZAorICAgICMgZ3JvdXBpbmcuCisgICAgIworICAgICMKKyAgICAjIEV4Y2VsIGFsbG93cyB5b3UgdG8gZ3JvdXAgcm93cyBvciBjb2x1bW5zIHNvIHRoYXQgdGhleSBjYW4gYmUgaGlkZGVuIG9yCisgICAgIyBkaXNwbGF5ZWQgd2l0aCBhIHNpbmdsZSBtb3VzZSBjbGljay4gVGhpcyBmZWF0dXJlIGlzIHJlZmVycmVkIHRvIGFzIG91dGxpbmVzLgorICAgICMKKyAgICAjIE91dGxpbmVzIGNhbiByZWR1Y2UgY29tcGxleCBkYXRhIGRvd24gdG8gYSBmZXcgc2FsaWVudCBzdWItdG90YWxzIG9yIAorICAgICMgc3VtbWFyaWVzLgorICAgICMKKyAgICAjIFRoaXMgZmVhdHVyZSBpcyBiZXN0IHZpZXdlZCBpbiBFeGNlbCBidXQgdGhlIGZvbGxvd2luZyBpcyBhbiBBU0NJSQorICAgICMgcmVwcmVzZW50YXRpb24gb2Ygd2hhdCBhIHdvcmtzaGVldCB3aXRoIHRocmVlIG91dGxpbmVzIG1pZ2h0IGxvb2sgbGlrZS4KKyAgICAjIFJvd3MgMy00IGFuZCByb3dzIDctOCBhcmUgZ3JvdXBlZCBhdCBsZXZlbCAyLiBSb3dzIDItOSBhcmUgZ3JvdXBlZCBhdAorICAgICMgbGV2ZWwgMS4gVGhlIGxpbmVzIGF0IHRoZSBsZWZ0IGhhbmQgc2lkZSBhcmUgY2FsbGVkIG91dGxpbmUgbGV2ZWwgYmFycy4KKyAgICAjCisgICAgIworICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgICBfICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8ICBfICB8IDIgfCAgIEIgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgfCB8ICAgfCAzIHwgIChDKSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIHwgfCAgIHwgNCB8ICAoRCkgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8IC0gICB8IDUgfCAgIEUgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgfCAgXyAgfCA2IHwgICBGICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIHwgfCAgIHwgNyB8ICAoRykgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8IHwgICB8IDggfCAgKEgpICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgfCAtICAgfCA5IHwgICBJICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIC0gICAgIHwgLiB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLgorICAgICMKKyAgICAjCisgICAgIyBDbGlja2luZyB0aGUgbWludXMgc2lnbiBvbiBlYWNoIG9mIHRoZSBsZXZlbCAyIG91dGxpbmVzIHdpbGwgY29sbGFwc2UgYW5kCisgICAgIyBoaWRlIHRoZSBkYXRhIGFzIHNob3duIGluIHRoZSBuZXh0IGZpZ3VyZS4gVGhlIG1pbnVzIHNpZ24gY2hhbmdlcyB0byBhIHBsdXMKKyAgICAjIHNpZ24gdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGF0YSBpbiB0aGUgb3V0bGluZSBpcyBoaWRkZW4uCisgICAgIworICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgICBfICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8ICAgICB8IDIgfCAgIEIgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgfCArICAgfCA1IHwgICBFICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIHwgICAgIHwgNiB8ICAgRiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8ICsgICB8IDkgfCAgIEkgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgLSAgICAgfCAuIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uCisgICAgIworICAgICMKKyAgICAjIENsaWNraW5nIG9uIHRoZSBtaW51cyBzaWduIG9uIHRoZSBsZXZlbCAxIG91dGxpbmUgd2lsbCBjb2xsYXBzZSB0aGUgcmVtYWluaW5nCisgICAgIyByb3dzIGFzIGZvbGxvd3M6CisgICAgIworICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgICAgICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICArICAgICB8IC4gfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4KKyAgICAjCisgICAgIyBTZWUgdGhlIG1haW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEFwcmlsIDIwMDMsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIHNvbWUgd29ya3NoZWV0cworICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnb3V0bGluZS54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0MSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnT3V0bGluZWQgUm93cycpOworICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdDb2xsYXBzZWQgUm93cycpOworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdPdXRsaW5lIENvbHVtbnMnKTsKKyAgICBteSAkd29ya3NoZWV0NCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnT3V0bGluZSBsZXZlbHMnKTsKKyAgICAKKyAgICAjIEFkZCBhIGdlbmVyYWwgZm9ybWF0CisgICAgbXkgJGJvbGQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoYm9sZCA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxOiBDcmVhdGUgYSB3b3Jrc2hlZXQgd2l0aCBvdXRsaW5lZCByb3dzLiBJdCBhbHNvIGluY2x1ZGVzIFNVQlRPVEFMKCkKKyAgICAjIGZ1bmN0aW9ucyBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgdGhlIHR5cGUgb2YgYXV0b21hdGljIG91dGxpbmVzIHRoYXQgYXJlCisgICAgIyBnZW5lcmF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBFeGNlbCBEYXRhLT5TdWJUb3RhbHMgbWVudSBpdGVtLgorICAgICMKKyAgICAKKyAgICAKKyAgICAjIEZvciBvdXRsaW5lcyB0aGUgaW1wb3J0YW50IHBhcmFtZXRlcnMgYXJlICRoaWRkZW4gYW5kICRsZXZlbC4gUm93cyB3aXRoIHRoZQorICAgICMgc2FtZSAkbGV2ZWwgYXJlIGdyb3VwZWQgdG9nZXRoZXIuIFRoZSBncm91cCB3aWxsIGJlIGNvbGxhcHNlZCBpZiAkaGlkZGVuIGlzCisgICAgIyBub24temVyby4gJGhlaWdodCBhbmQgJFhGIGFyZSBhc3NpZ25lZCBkZWZhdWx0IHZhbHVlcyBpZiB0aGV5IGFyZSB1bmRlZi4KKyAgICAjCisgICAgIyBUaGUgc3ludGF4IGlzOiBzZXRfcm93KCRyb3csICRoZWlnaHQsICRYRiwgJGhpZGRlbiwgJGxldmVsLCAkY29sbGFwc2VkKQorICAgICMKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygxLCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygyLCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygzLCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg0LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg1LCAgdW5kZWYsIHVuZGVmLCAwLCAxKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg2LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg3LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg4LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg5LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygxMCwgdW5kZWYsIHVuZGVmLCAwLCAxKTsKKyAgICAKKyAgICAKKyAgICAjIEFkZCBhIGNvbHVtbiBmb3JtYXQgZm9yIGNsYXJpdHkKKyAgICAkd29ya3NoZWV0MS0+c2V0X2NvbHVtbignQTpBJywgMjApOworICAgIAorICAgICMgQWRkIHRoZSBkYXRhLCBsYWJlbHMgYW5kIGZvcm11bGFzCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBMScsICAnUmVnaW9uJywgJGJvbGQpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTInLCAgJ05vcnRoJyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBMycsICAnTm9ydGgnKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E0JywgICdOb3J0aCcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTUnLCAgJ05vcnRoJyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBNicsICAnTm9ydGggVG90YWwnLCAkYm9sZCk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCMScsICAnU2FsZXMnLCAgJGJvbGQpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjInLCAgMTAwMCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCMycsICAxMjAwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I0JywgIDkwMCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCNScsICAxMjAwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I2JywgICc9U1VCVE9UQUwoOSxCMjpCNSknLCAkYm9sZCk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBNycsICAnU291dGgnKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E4JywgICdTb3V0aCcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTknLCAgJ1NvdXRoJyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBMTAnLCAnU291dGgnKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExMScsICdTb3V0aCBUb3RhbCcsICRib2xkKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I3JywgIDQwMCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCOCcsICA2MDApOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjknLCAgNTAwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0IxMCcsIDYwMCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCMTEnLCAnPVNVQlRPVEFMKDksQjc6QjEwKScsICRib2xkKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExMicsICdHcmFuZCBUb3RhbCcsICRib2xkKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0IxMicsICc9U1VCVE9UQUwoOSxCMjpCMTApJywgJGJvbGQpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDI6IENyZWF0ZSBhIHdvcmtzaGVldCB3aXRoIG91dGxpbmVkIHJvd3MuIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlCisgICAgIyBwcmV2aW91cyBleGFtcGxlIGV4Y2VwdCB0aGF0IHRoZSByb3dzIGFyZSBjb2xsYXBzZWQuCisgICAgIyBOb3RlOiBXZSBuZWVkIHRvIGluZGljYXRlIHRoZSByb3cgdGhhdCBjb250YWlucyB0aGUgY29sbGFwc2VkIHN5bWJvbCAnKycKKyAgICAjIHdpdGggdGhlIG9wdGlvbmFsIHBhcmFtZXRlciwgJGNvbGxhcHNlZC4KKyAgICAKKyAgICAjIFRoZSBncm91cCB3aWxsIGJlIGNvbGxhcHNlZCBpZiAkaGlkZGVuIGlzIG5vbi16ZXJvLgorICAgICMgVGhlIHN5bnRheCBpczogc2V0X3Jvdygkcm93LCAkaGVpZ2h0LCAkWEYsICRoaWRkZW4sICRsZXZlbCwgJGNvbGxhcHNlZCkKKyAgICAjCisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNSwgIHVuZGVmLCB1bmRlZiwgMSwgMSk7CisgICAgCisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coOCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coOSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMTAsIHVuZGVmLCB1bmRlZiwgMSwgMSk7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMTEsIHVuZGVmLCB1bmRlZiwgMCwgMCwgMSk7CisgICAgCisgICAgCisgICAgIyBBZGQgYSBjb2x1bW4gZm9ybWF0IGZvciBjbGFyaXR5CisgICAgJHdvcmtzaGVldDItPnNldF9jb2x1bW4oJ0E6QScsIDIwKTsKKyAgICAKKyAgICAjIEFkZCB0aGUgZGF0YSwgbGFiZWxzIGFuZCBmb3JtdWxhcworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTEnLCAgJ1JlZ2lvbicsICRib2xkKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0EyJywgICdOb3J0aCcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTMnLCAgJ05vcnRoJyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBNCcsICAnTm9ydGgnKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E1JywgICdOb3J0aCcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTYnLCAgJ05vcnRoIFRvdGFsJywgJGJvbGQpOworICAgIAorICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjEnLCAgJ1NhbGVzJywgICRib2xkKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0IyJywgIDEwMDApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjMnLCAgMTIwMCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCNCcsICA5MDApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjUnLCAgMTIwMCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCNicsICAnPVNVQlRPVEFMKDksQjI6QjUpJywgJGJvbGQpOworICAgIAorICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTcnLCAgJ1NvdXRoJyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBOCcsICAnU291dGgnKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E5JywgICdTb3V0aCcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTEwJywgJ1NvdXRoJyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMTEnLCAnU291dGggVG90YWwnLCAkYm9sZCk7CisgICAgCisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCNycsICA0MDApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjgnLCAgNjAwKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0I5JywgIDUwMCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCMTAnLCA2MDApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjExJywgJz1TVUJUT1RBTCg5LEI3OkIxMCknLCAkYm9sZCk7CisgICAgCisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMTInLCAnR3JhbmQgVG90YWwnLCAkYm9sZCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCMTInLCAnPVNVQlRPVEFMKDksQjI6QjEwKScsICRib2xkKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzOiBDcmVhdGUgYSB3b3Jrc2hlZXQgd2l0aCBvdXRsaW5lZCBjb2x1bW5zLgorICAgICMKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgICAgICAgICBbJ01vbnRoJywgJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywnIFRvdGFsJ10sCisgICAgICAgICAgICAgICAgWydOb3J0aCcsIDUwLCAgICAyMCwgICAgMTUsICAgIDI1LCAgICA2NSwgICAgODAsICAgICwnPVNVTShCMjpHMiknXSwKKyAgICAgICAgICAgICAgICBbJ1NvdXRoJywgMTAsICAgIDIwLCAgICAzMCwgICAgNTAsICAgIDUwLCAgICA1MCwgICAgLCc9U1VNKEIzOkczKSddLAorICAgICAgICAgICAgICAgIFsnRWFzdCcsICA0NSwgICAgNzUsICAgIDUwLCAgICAxNSwgICAgNzUsICAgIDEwMCwgICAsJz1TVU0oQjQ6RzQpJ10sCisgICAgICAgICAgICAgICAgWydXZXN0JywgIDE1LCAgICAxNSwgICAgNTUsICAgIDM1LCAgICAyMCwgICAgNTAsICAgICwnPVNVTShCNTpHNiknXSwKKyAgICAgICAgICAgICAgIF07CisgICAgCisgICAgIyBBZGQgYm9sZCBmb3JtYXQgdG8gdGhlIGZpcnN0IHJvdworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDAsIHVuZGVmLCAkYm9sZCk7CisgICAgCisgICAgIyBTeW50YXg6IHNldF9jb2x1bW4oJGNvbDEsICRjb2wyLCAkd2lkdGgsICRYRiwgJGhpZGRlbiwgJGxldmVsLCAkY29sbGFwc2VkKQorICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdBOkEnLCAxMCwgJGJvbGQgICAgICApOworICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdCOkcnLCA1LCAgdW5kZWYsIDAsIDEpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdIOkgnLCAxMCk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgZGF0YSBhbmQgYSBmb3JtdWxhCisgICAgJHdvcmtzaGVldDMtPndyaXRlX2NvbCgnQTEnLCAkZGF0YSk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlKCdINicsICc9U1VNKEgyOkg1KScsICRib2xkKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0OiBTaG93IGFsbCBwb3NzaWJsZSBvdXRsaW5lIGxldmVscy4KKyAgICAjCisgICAgbXkgJGxldmVscyA9IFsiTGV2ZWwgMSIsICJMZXZlbCAyIiwgIkxldmVsIDMiLCAiTGV2ZWwgNCIsCisgICAgICAgICAgICAgICAgICAiTGV2ZWwgNSIsICJMZXZlbCA2IiwgIkxldmVsIDciLCAiTGV2ZWwgNiIsCisgICAgICAgICAgICAgICAgICAiTGV2ZWwgNSIsICJMZXZlbCA0IiwgIkxldmVsIDMiLCAiTGV2ZWwgMiIsICJMZXZlbCAxIl07CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldDQtPndyaXRlX2NvbCgnQTEnLCAkbGV2ZWxzKTsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+c2V0X3JvdygwLCAgdW5kZWYsIHVuZGVmLCB1bmRlZiwgMSk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMSwgIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDIsICB1bmRlZiwgdW5kZWYsIHVuZGVmLCAzKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3JvdygzLCAgdW5kZWYsIHVuZGVmLCB1bmRlZiwgNCk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coNCwgIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDUpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDUsICB1bmRlZiwgdW5kZWYsIHVuZGVmLCA2KTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3Jvdyg2LCAgdW5kZWYsIHVuZGVmLCB1bmRlZiwgNyk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coNywgIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDYpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDgsICB1bmRlZiwgdW5kZWYsIHVuZGVmLCA1KTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3Jvdyg5LCAgdW5kZWYsIHVuZGVmLCB1bmRlZiwgNCk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMTAsIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDMpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDExLCB1bmRlZiwgdW5kZWYsIHVuZGVmLCAyKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3JvdygxMiwgdW5kZWYsIHVuZGVmLCB1bmRlZiwgMSk7CisgICAgCisgICAgCisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9vdXRsaW5lLnBsPgorCis9aGVhZDIgRXhhbXBsZTogb3V0bGluZV9jb2xsYXBzZWQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0byBnZW5lcmF0ZSBFeGNlbCBvdXRsaW5lcyBhbmQKK2dyb3VwaW5nLgorCitUaGVzZSBleGFtcGxlIGZvY3VzIG1haW5seSBvbiBjb2xsYXBzZWQgb3V0bGluZXMuIFNlZSBhbHNvIHRoZQorb3V0bGluZXMucGwgZXhhbXBsZSBwcm9ncmFtIGZvciBtb3JlIGdlbmVyYWwgZXhhbXBsZXMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL291dGxpbmVfY29sbGFwc2VkLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gb3V0bGluZV9jb2xsYXBzZWQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gZ2VuZXJhdGUgRXhjZWwgb3V0bGluZXMgYW5kCisgICAgIyBncm91cGluZy4KKyAgICAjCisgICAgIyBUaGVzZSBleGFtcGxlIGZvY3VzIG1haW5seSBvbiBjb2xsYXBzZWQgb3V0bGluZXMuIFNlZSBhbHNvIHRoZQorICAgICMgb3V0bGluZXMucGwgZXhhbXBsZSBwcm9ncmFtIGZvciBtb3JlIGdlbmVyYWwgZXhhbXBsZXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDA4LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBzb21lIHdvcmtzaGVldHMKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ291dGxpbmVfY29sbGFwc2VkLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdPdXRsaW5lZCBSb3dzJyk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0NvbGxhcHNlZCBSb3dzIDEnKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnQ29sbGFwc2VkIFJvd3MgMicpOworICAgIG15ICR3b3Jrc2hlZXQ0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdDb2xsYXBzZWQgUm93cyAzJyk7CisgICAgbXkgJHdvcmtzaGVldDUgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ091dGxpbmUgQ29sdW1ucycpOworICAgIG15ICR3b3Jrc2hlZXQ2ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdDb2xsYXBzZWQgQ29sdW1ucycpOworICAgIAorICAgIAorICAgICMgQWRkIGEgZ2VuZXJhbCBmb3JtYXQKKyAgICBteSAkYm9sZCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChib2xkID0+IDEpOworICAgIAorICAgIAorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSB0aGUgc2FtZSBkYXRhIGFuZCBzdWItdG90YWxzIG9uIGVhY2ggd29ya3NoZWV0LgorICAgICMKKyAgICBzdWIgY3JlYXRlX3N1Yl90b3RhbHMgeworICAgIAorICAgICAgICBteSAkd29ya3NoZWV0ID0gJF9bMF07CisgICAgCisgICAgICAgICMgQWRkIGEgY29sdW1uIGZvcm1hdCBmb3IgY2xhcml0eQorICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCAyMCk7CisgICAgCisgICAgICAgICMgQWRkIHRoZSBkYXRhLCBsYWJlbHMgYW5kIGZvcm11bGFzCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICAnUmVnaW9uJywgJGJvbGQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTInLCAgJ05vcnRoJyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMycsICAnTm9ydGgnKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E0JywgICdOb3J0aCcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTUnLCAgJ05vcnRoJyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNicsICAnTm9ydGggVG90YWwnLCAkYm9sZCk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMScsICAnU2FsZXMnLCAgJGJvbGQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQjInLCAgMTAwMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMycsICAxMjAwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I0JywgIDkwMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCNScsICAxMjAwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I2JywgICc9U1VCVE9UQUwoOSxCMjpCNSknLCAkYm9sZCk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNycsICAnU291dGgnKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E4JywgICdTb3V0aCcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTknLCAgJ1NvdXRoJyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTAnLCAnU291dGgnKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExMScsICdTb3V0aCBUb3RhbCcsICRib2xkKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I3JywgIDQwMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCOCcsICA2MDApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQjknLCAgNTAwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxMCcsIDYwMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMTEnLCAnPVNVQlRPVEFMKDksQjc6QjEwKScsICRib2xkKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExMicsICdHcmFuZCBUb3RhbCcsICRib2xkKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxMicsICc9U1VCVE9UQUwoOSxCMjpCMTApJywgJGJvbGQpOworICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxOiBDcmVhdGUgYSB3b3Jrc2hlZXQgd2l0aCBvdXRsaW5lZCByb3dzLiBJdCBhbHNvIGluY2x1ZGVzIFNVQlRPVEFMKCkKKyAgICAjIGZ1bmN0aW9ucyBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgdGhlIHR5cGUgb2YgYXV0b21hdGljIG91dGxpbmVzIHRoYXQgYXJlCisgICAgIyBnZW5lcmF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBFeGNlbCBEYXRhLT5TdWJUb3RhbHMgbWVudSBpdGVtLgorICAgICMKKyAgICAKKyAgICAjIFRoZSBzeW50YXggaXM6IHNldF9yb3coJHJvdywgJGhlaWdodCwgJFhGLCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coMSwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coMiwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coMywgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coNCwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coNSwgIHVuZGVmLCB1bmRlZiwgMCwgMSk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coNiwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coNywgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coOCwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coOSwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coMTAsIHVuZGVmLCB1bmRlZiwgMCwgMSk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgc3ViLXRvdGFsIGRhdGEgdGhhdCBpcyBjb21tb24gdG8gdGhlIHJvdyBleGFtcGxlcy4KKyAgICBjcmVhdGVfc3ViX3RvdGFscygkd29ya3NoZWV0MSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMjogQ3JlYXRlIGEgd29ya3NoZWV0IHdpdGggY29sbGFwc2VkIG91dGxpbmVkIHJvd3MuCisgICAgIyBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBleGFtcGxlIDEgIGV4Y2VwdCB0aGF0IHRoZSBhbGwgcm93cyBhcmUgY29sbGFwc2VkLgorICAgICMgTm90ZTogV2UgbmVlZCB0byBpbmRpY2F0ZSB0aGUgcm93IHRoYXQgY29udGFpbnMgdGhlIGNvbGxhcHNlZCBzeW1ib2wgJysnIHdpdGgKKyAgICAjIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXIsICRjb2xsYXBzZWQuCisgICAgCisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNSwgIHVuZGVmLCB1bmRlZiwgMSwgMSk7CisgICAgCisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coOCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coOSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMTAsIHVuZGVmLCB1bmRlZiwgMSwgMSk7CisgICAgCisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMTEsIHVuZGVmLCB1bmRlZiwgMCwgMCwgMSk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgc3ViLXRvdGFsIGRhdGEgdGhhdCBpcyBjb21tb24gdG8gdGhlIHJvdyBleGFtcGxlcy4KKyAgICBjcmVhdGVfc3ViX3RvdGFscygkd29ya3NoZWV0Mik7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMzogQ3JlYXRlIGEgd29ya3NoZWV0IHdpdGggY29sbGFwc2VkIG91dGxpbmVkIHJvd3MuCisgICAgIyBTYW1lIGFzIHRoZSBleGFtcGxlIDEgIGV4Y2VwdCB0aGF0IHRoZSB0d28gc3ViLXRvdGFscyBhcmUgY29sbGFwc2VkLgorICAgIAorICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDEsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDIsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDMsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDQsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDUsICB1bmRlZiwgdW5kZWYsIDAsIDEsIDEpOworICAgIAorICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDYsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDcsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDgsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDksICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDEwLCB1bmRlZiwgdW5kZWYsIDAsIDEsIDEpOworICAgIAorICAgIAorICAgICMgV3JpdGUgdGhlIHN1Yi10b3RhbCBkYXRhIHRoYXQgaXMgY29tbW9uIHRvIHRoZSByb3cgZXhhbXBsZXMuCisgICAgY3JlYXRlX3N1Yl90b3RhbHMoJHdvcmtzaGVldDMpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDQ6IENyZWF0ZSBhIHdvcmtzaGVldCB3aXRoIG91dGxpbmVkIHJvd3MuCisgICAgIyBTYW1lIGFzIHRoZSBleGFtcGxlIDEgIGV4Y2VwdCB0aGF0IHRoZSB0d28gc3ViLXRvdGFscyBhcmUgY29sbGFwc2VkLgorICAgIAorICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDEsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDIsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDMsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDQsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDUsICB1bmRlZiwgdW5kZWYsIDEsIDEsIDEpOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDYsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDcsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDgsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDksICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDEwLCB1bmRlZiwgdW5kZWYsIDEsIDEsIDEpOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDExLCB1bmRlZiwgdW5kZWYsIDAsIDAsIDEpOworICAgIAorICAgICMgV3JpdGUgdGhlIHN1Yi10b3RhbCBkYXRhIHRoYXQgaXMgY29tbW9uIHRvIHRoZSByb3cgZXhhbXBsZXMuCisgICAgY3JlYXRlX3N1Yl90b3RhbHMoJHdvcmtzaGVldDQpOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDU6IENyZWF0ZSBhIHdvcmtzaGVldCB3aXRoIG91dGxpbmVkIGNvbHVtbnMuCisgICAgIworICAgIG15ICRkYXRhID0gWworICAgICAgICAgICAgICAgIFsnTW9udGgnLCAnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCcgVG90YWwnXSwKKyAgICAgICAgICAgICAgICBbJ05vcnRoJywgNTAsICAgIDIwLCAgICAxNSwgICAgMjUsICAgIDY1LCAgICA4MCwgICAgLCc9U1VNKEIyOkcyKSddLAorICAgICAgICAgICAgICAgIFsnU291dGgnLCAxMCwgICAgMjAsICAgIDMwLCAgICA1MCwgICAgNTAsICAgIDUwLCAgICAsJz1TVU0oQjM6RzMpJ10sCisgICAgICAgICAgICAgICAgWydFYXN0JywgIDQ1LCAgICA3NSwgICAgNTAsICAgIDE1LCAgICA3NSwgICAgMTAwLCAgICwnPVNVTShCNDpHNCknXSwKKyAgICAgICAgICAgICAgICBbJ1dlc3QnLCAgMTUsICAgIDE1LCAgICA1NSwgICAgMzUsICAgIDIwLCAgICA1MCwgICAgLCc9U1VNKEI1Okc2KSddLAorICAgICAgICAgICAgICAgXTsKKyAgICAKKyAgICAjIEFkZCBib2xkIGZvcm1hdCB0byB0aGUgZmlyc3Qgcm93CisgICAgJHdvcmtzaGVldDUtPnNldF9yb3coMCwgdW5kZWYsICRib2xkKTsKKyAgICAKKyAgICAjIFN5bnRheDogc2V0X2NvbHVtbigkY29sMSwgJGNvbDIsICR3aWR0aCwgJFhGLCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisgICAgJHdvcmtzaGVldDUtPnNldF9jb2x1bW4oJ0E6QScsIDEwLCAkYm9sZCAgICAgICk7CisgICAgJHdvcmtzaGVldDUtPnNldF9jb2x1bW4oJ0I6RycsIDUsICB1bmRlZiwgMCwgMSk7CisgICAgJHdvcmtzaGVldDUtPnNldF9jb2x1bW4oJ0g6SCcsIDEwICAgICAgICAgICAgICk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgZGF0YSBhbmQgYSBmb3JtdWxhCisgICAgJHdvcmtzaGVldDUtPndyaXRlX2NvbCgnQTEnLCAkZGF0YSk7CisgICAgJHdvcmtzaGVldDUtPndyaXRlKCdINicsICc9U1VNKEgyOkg1KScsICRib2xkKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA2OiBDcmVhdGUgYSB3b3Jrc2hlZXQgd2l0aCBjb2xsYXBzZWQgb3V0bGluZWQgY29sdW1ucy4KKyAgICAjIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGUgZXhjZXB0IGNvbGxhcHNlZCBjb2x1bW5zLgorICAgIAorICAgICMgQWRkIGJvbGQgZm9ybWF0IHRvIHRoZSBmaXJzdCByb3cKKyAgICAkd29ya3NoZWV0Ni0+c2V0X3JvdygwLCB1bmRlZiwgJGJvbGQpOworICAgIAorICAgICMgU3ludGF4OiBzZXRfY29sdW1uKCRjb2wxLCAkY29sMiwgJHdpZHRoLCAkWEYsICRoaWRkZW4sICRsZXZlbCwgJGNvbGxhcHNlZCkKKyAgICAkd29ya3NoZWV0Ni0+c2V0X2NvbHVtbignQTpBJywgMTAsICRib2xkICAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0Ni0+c2V0X2NvbHVtbignQjpHJywgNSwgIHVuZGVmLCAxLCAxICAgKTsKKyAgICAkd29ya3NoZWV0Ni0+c2V0X2NvbHVtbignSDpIJywgMTAsIHVuZGVmLCAwLCAwLCAxKTsKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBkYXRhIGFuZCBhIGZvcm11bGEKKyAgICAkd29ya3NoZWV0Ni0+d3JpdGVfY29sKCdBMScsICRkYXRhKTsKKyAgICAkd29ya3NoZWV0Ni0+d3JpdGUoJ0g2JywgJz1TVU0oSDI6SDUpJywgJGJvbGQpOworICAgIAorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvb3V0bGluZV9jb2xsYXBzZWQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBwYW5lcy5wbAorCisKKworRXhhbXBsZSBvZiB1c2luZyB0aGUgV3JpdGVFeGNlbCBtb2R1bGUgdG8gY3JlYXRlIHdvcmtzaGVldCBwYW5lcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvcGFuZXMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBwYW5lcy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIHVzaW5nIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZSB0byBjcmVhdGUgd29ya3NoZWV0IHBhbmVzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygicGFuZXMueGxzIik7CisgICAgCisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1BhbmVzIDEnKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnUGFuZXMgMicpOworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdQYW5lcyAzJyk7CisgICAgbXkgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1BhbmVzIDQnKTsKKyAgICAKKyAgICAjIEZyZWV6ZSBwYW5lcworICAgICR3b3Jrc2hlZXQxLT5mcmVlemVfcGFuZXMoMSwgMCk7ICMgMSByb3cKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+ZnJlZXplX3BhbmVzKDAsIDEpOyAjIDEgY29sdW1uCisgICAgJHdvcmtzaGVldDMtPmZyZWV6ZV9wYW5lcygxLCAxKTsgIyAxIHJvdyBhbmQgY29sdW1uCisgICAgCisgICAgIyBTcGxpdCBwYW5lcy4KKyAgICAjIFRoZSBkaXZpc2lvbnMgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGVybXMgb2Ygcm93IGFuZCBjb2x1bW4gZGltZW5zaW9ucy4KKyAgICAjIFRoZSBkZWZhdWx0IHJvdyBoZWlnaHQgaXMgMTIuNzUgYW5kIHRoZSBkZWZhdWx0IGNvbHVtbiB3aWR0aCBpcyA4LjQzCisgICAgIworICAgICR3b3Jrc2hlZXQ0LT5zcGxpdF9wYW5lcygxMi43NSwgOC40MywgMSwgMSk7ICMgMSByb3cgYW5kIGNvbHVtbgorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU2V0IHVwIHNvbWUgZm9ybWF0dGluZyBhbmQgdGV4dCB0byBoaWdobGlnaHQgdGhlIHBhbmVzCisgICAgIworICAgIAorICAgIG15ICRoZWFkZXIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkaGVhZGVyLT5zZXRfY29sb3IoJ3doaXRlJyk7CisgICAgJGhlYWRlci0+c2V0X2FsaWduKCdjZW50ZXInKTsKKyAgICAkaGVhZGVyLT5zZXRfYWxpZ24oJ3ZjZW50ZXInKTsKKyAgICAkaGVhZGVyLT5zZXRfcGF0dGVybigpOworICAgICRoZWFkZXItPnNldF9mZ19jb2xvcignZ3JlZW4nKTsKKyAgICAKKyAgICBteSAkY2VudGVyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGNlbnRlci0+c2V0X2FsaWduKCdjZW50ZXInKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNoZWV0IDEKKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDEtPnNldF9jb2x1bW4oJ0E6SScsIDE2KTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygwLCAyMCk7CisgICAgJHdvcmtzaGVldDEtPnNldF9zZWxlY3Rpb24oJ0MzJyk7CisgICAgCisgICAgZm9yIG15ICRpICgwLi44KXsKKyAgICAgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsICRpLCAnU2Nyb2xsIGRvd24nLCAkaGVhZGVyKTsKKyAgICB9CisgICAgCisgICAgZm9yIG15ICRpICgxLi4xMDApeworICAgICAgICBmb3IgbXkgJGogKDAuLjgpeworICAgICAgICAgICAgJHdvcmtzaGVldDEtPndyaXRlKCRpLCAkaiwgJGkrMSwgJGNlbnRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTaGVldCAyCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQyLT5zZXRfY29sdW1uKCdBOkEnLCAxNik7CisgICAgJHdvcmtzaGVldDItPnNldF9zZWxlY3Rpb24oJ0MzJyk7CisgICAgCisgICAgZm9yIG15ICRpICgwLi40OSl7CisgICAgICAgICR3b3Jrc2hlZXQyLT5zZXRfcm93KCRpLCAxNSk7CisgICAgICAgICR3b3Jrc2hlZXQyLT53cml0ZSgkaSwgMCwgJ1Njcm9sbCByaWdodCcsICRoZWFkZXIpOworICAgIH0KKyAgICAKKyAgICBmb3IgbXkgJGkgKDAuLjQ5KXsKKyAgICAgICAgZm9yIG15ICRqICgxLi4yNSl7CisgICAgICAgICAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJGksICRqLCAkaiwgJGNlbnRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTaGVldCAzCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdBOlonLCAxNik7CisgICAgJHdvcmtzaGVldDMtPnNldF9zZWxlY3Rpb24oJ0MzJyk7CisgICAgCisgICAgZm9yIG15ICRpICgxLi4yNSl7CisgICAgICAgICR3b3Jrc2hlZXQzLT53cml0ZSgwLCAkaSwgJ1Njcm9sbCBkb3duJywgICRoZWFkZXIpOworICAgIH0KKyAgICAKKyAgICBmb3IgbXkgJGkgKDEuLjQ5KXsKKyAgICAgICAgJHdvcmtzaGVldDMtPndyaXRlKCRpLCAwLCAnU2Nyb2xsIHJpZ2h0JywgJGhlYWRlcik7CisgICAgfQorICAgIAorICAgIGZvciBteSAkaSAoMS4uNDkpeworICAgICAgICBmb3IgbXkgJGogKDEuLjI1KXsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQzLT53cml0ZSgkaSwgJGosICRqLCAkY2VudGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNoZWV0IDQKKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDQtPnNldF9zZWxlY3Rpb24oJ0MzJyk7CisgICAgCisgICAgZm9yIG15ICRpICgxLi4yNSl7CisgICAgICAgICR3b3Jrc2hlZXQ0LT53cml0ZSgwLCAkaSwgJ1Njcm9sbCcsICRjZW50ZXIpOworICAgIH0KKyAgICAKKyAgICBmb3IgbXkgJGkgKDEuLjQ5KXsKKyAgICAgICAgJHdvcmtzaGVldDQtPndyaXRlKCRpLCAwLCAnU2Nyb2xsJywgJGNlbnRlcik7CisgICAgfQorICAgIAorICAgIGZvciBteSAkaSAoMS4uNDkpeworICAgICAgICBmb3IgbXkgJGogKDEuLjI1KXsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQ0LT53cml0ZSgkaSwgJGosICRqLCAkY2VudGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvcGFuZXMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBwcm9wZXJ0aWVzLnBsCisKKworCitBbiBleGFtcGxlIG9mIGFkZGluZyBkb2N1bWVudCBwcm9wZXJ0aWVzIHRvIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZmlsZS4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvcHJvcGVydGllcy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHByb3BlcnRpZXMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEFuIGV4YW1wbGUgb2YgYWRkaW5nIGRvY3VtZW50IHByb3BlcnRpZXMgdG8gYSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBmaWxlLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDgsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygncHJvcGVydGllcy54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgJHdvcmtib29rLT5zZXRfcHJvcGVydGllcygKKyAgICAgICAgdGl0bGUgICAgPT4gJ1RoaXMgaXMgYW4gZXhhbXBsZSBzcHJlYWRzaGVldCcsCisgICAgICAgIHN1YmplY3QgID0+ICdXaXRoIGRvY3VtZW50IHByb3BlcnRpZXMnLAorICAgICAgICBhdXRob3IgICA9PiAnSm9obiBNY05hbWFyYScsCisgICAgICAgIG1hbmFnZXIgID0+ICdEci4gSGVpbnogRG9vZmVuc2htaXJ0eiAnLAorICAgICAgICBjb21wYW55ICA9PiAnb2YgV29sdmVzJywKKyAgICAgICAgY2F0ZWdvcnkgPT4gJ0V4YW1wbGUgc3ByZWFkc2hlZXRzJywKKyAgICAgICAga2V5d29yZHMgPT4gJ1NhbXBsZSwgRXhhbXBsZSwgUHJvcGVydGllcycsCisgICAgICAgIGNvbW1lbnRzID0+ICdDcmVhdGVkIHdpdGggUGVybCBhbmQgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwnLAorICAgICk7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICdTZWxlY3QgRmlsZS0+UHJvcGVydGllcyB0byBzZWUgdGhlIGZpbGUgcHJvcGVydGllcycpOworICAgIAorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvcHJvcGVydGllcy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHByb3RlY3Rpb24ucGwKKworCisKK0V4YW1wbGUgb2YgY2VsbCBsb2NraW5nIGFuZCBmb3JtdWxhIGhpZGluZyBpbiBhbiBFeGNlbCB3b3Jrc2hlZXQgdmlhCit0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9wcm90ZWN0aW9uLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gcHJvdGVjdGlvbi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBjZWxsIGxvY2tpbmcgYW5kIGZvcm11bGEgaGlkaW5nIGluIGFuIEV4Y2VsIHdvcmtzaGVldCB2aWEKKyAgICAjIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBBdWd1c3QgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJwcm90ZWN0aW9uLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAjIENyZWF0ZSBzb21lIGZvcm1hdCBvYmplY3RzCisgICAgbXkgJGxvY2tlZCAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChsb2NrZWQgPT4gMSk7CisgICAgbXkgJHVubG9ja2VkICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChsb2NrZWQgPT4gMCk7CisgICAgbXkgJGhpZGRlbiAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChoaWRkZW4gPT4gMSk7CisgICAgCisgICAgIyBGb3JtYXQgdGhlIGNvbHVtbnMKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCA0Mik7CisgICAgJHdvcmtzaGVldC0+c2V0X3NlbGVjdGlvbignQjM6QjMnKTsKKyAgICAKKyAgICAjIFByb3RlY3QgdGhlIHdvcmtzaGVldAorICAgICR3b3Jrc2hlZXQtPnByb3RlY3QoKTsKKyAgICAKKyAgICAjIEV4YW1wbGVzIG9mIGNlbGwgbG9ja2luZyBhbmQgaGlkaW5nCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ0NlbGwgQjEgaXMgbG9ja2VkLiBJdCBjYW5ub3QgYmUgZWRpdGVkLicpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMScsICc9MSsyJywgJGxvY2tlZCk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJ0NlbGwgQjIgaXMgdW5sb2NrZWQuIEl0IGNhbiBiZSBlZGl0ZWQuJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IyJywgJz0xKzInLCAkdW5sb2NrZWQpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMycsICJDZWxsIEIzIGlzIGhpZGRlbi4gVGhlIGZvcm11bGEgaXNuJ3QgdmlzaWJsZS4iKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjMnLCAnPTErMicsICRoaWRkZW4pOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNScsICdVc2UgTWVudS0+VG9vbHMtPlByb3RlY3Rpb24tPlVucHJvdGVjdCBTaGVldCcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNicsICd0byByZW1vdmUgdGhlIHdvcmtzaGVldCBwcm90ZWN0aW9uLiAgICcpOworICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9wcm90ZWN0aW9uLnBsPgorCis9aGVhZDIgRXhhbXBsZTogcmVwZWF0LnBsCisKKworCitFeGFtcGxlIG9mIHdyaXRpbmcgcmVwZWF0ZWQgZm9ybXVsYXMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3JlcGVhdC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHJlcGVhdC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2Ygd3JpdGluZyByZXBlYXRlZCBmb3JtdWxhcy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEF1Z3VzdCAyMDAyLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInJlcGVhdC54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgbXkgJGxpbWl0ID0gMTAwMDsKKyAgICAKKyAgICAjIFdyaXRlIGEgY29sdW1uIG9mIG51bWJlcnMKKyAgICBmb3IgbXkgJHJvdyAoMC4uJGxpbWl0KSB7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDAsICAkcm93KTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyBTdG9yZSBhIGZvcm11bGEKKyAgICBteSAkZm9ybXVsYSA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1BMSo1KzQnKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIGEgY29sdW1uIG9mIGZvcm11bGFzIGJhc2VkIG9uIHRoZSBzdG9yZWQgZm9ybXVsYQorICAgIGZvciBteSAkcm93ICgwLi4kbGltaXQpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJHJvdywgMSwgJGZvcm11bGEsIHVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxci9eQTEkLywgJ0EnLigkcm93KzEpKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyBEaXJlY3QgZm9ybXVsYSB3cml0aW5nLiBBcyBhIHNwZWVkIGNvbXBhcmlzb24gdW5jb21tZW50IHRoZQorICAgICMgZm9sbG93aW5nIGFuZCBydW4gdGhlIHByb2dyYW0gYWdhaW4KKyAgICAKKyAgICAjZm9yIG15ICRyb3cgKDAuLiRsaW1pdCkgeworICAgICMgICAgJHdvcmtzaGVldC0+d3JpdGVfZm9ybXVsYSgkcm93LCAyLCAnPUEnLigkcm93KzEpLicqNSs0Jyk7CisgICAgI30KKyAgICAKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3JlcGVhdC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHJpZ2h0X3RvX2xlZnQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB3b3Jrc2hlZXQgZGlyZWN0aW9uIGZyb20KK2xlZnQtdG8tcmlnaHQgdG8gcmlnaHQtdG8tbGVmdCBhcyByZXF1aXJlZCBieSBzb21lIGVhc3Rlcm4gdmVyaW9ucworb2YgRXhjZWwuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3JpZ2h0X3RvX2xlZnQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSByaWdodF90b19sZWZ0LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB3b3Jrc2hlZXQgZGlyZWN0aW9uIGZyb20KKyAgICAjIGxlZnQtdG8tcmlnaHQgdG8gcmlnaHQtdG8tbGVmdCBhcyByZXF1aXJlZCBieSBzb21lIGVhc3Rlcm4gdmVyaW9ucworICAgICMgb2YgRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBKYW51YXJ5IDIwMDYsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInJpZ2h0X3RvX2xlZnQueGxzIik7CisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICR3b3Jrc2hlZXQyLT5yaWdodF90b19sZWZ0KCk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsIDAsICdIZWxsbycpOyAjICBBMSwgQjEsIEMxLCAuLi4KKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoMCwgMCwgJ0hlbGxvJyk7ICMgLi4uLCBDMSwgQjEsIEExCisgICAgCisgICAgCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3JpZ2h0X3RvX2xlZnQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiByb3dfd3JhcC5wbAorCisKKworRGVtb25zdHJhdGVzIGhvdyB0byB3cmFwIGRhdGEgZnJvbSBvbmUgd29ya3NoZWV0IG9udG8gYW5vdGhlci4KKworRXhjZWwgaGFzIGEgcm93IGxpbWl0IG9mIDY1NTM2IHJvd3MuIFNvbWV0aW1lcyB0aGUgYW1vdW50IG9mIHJvdyBkYXRhIHRvIGJlCit3cml0dGVuIHRvIGEgZmlsZSBpcyBncmVhdGVyIHRoYW4gdGhpcyBsaW1pdC4gSW4gdGhpcyBjYXNlIGl0IGlzIGEgdXNlZnVsCit0ZWNobmlxdWUgdG8gd3JhcCB0aGUgZGF0YSBmcm9tIG9uZSB3b3Jrc2hlZXQgb250byB0aGUgbmV4dCBzbyB0aGF0IHdlIGdldAorc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKworICBTaGVldDEgIFJvdyAgICAgMSAgLSAgNjU1MzYKKyAgU2hlZXQyICBSb3cgNjU1MzcgIC0gMTMxMDcyCisgIFNoZWV0MyAgUm93IDEzMTA3MyAtIC4uLgorCitJbiBvcmRlciB0byBhY2hpZXZlIHRoaXMgd2UgdXNlIGEgc2luZ2xlIHdvcmtzaGVldCByZWZlcmVuY2UgYW5kCityZWluaXRpYWxpc2UgaXQgdG8gcG9pbnQgdG8gYSBuZXcgd29ya3NoZWV0IHdoZW4gcmVxdWlyZWQuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3Jvd193cmFwLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gcm93X3dyYXAucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIERlbW9uc3RyYXRlcyBob3cgdG8gd3JhcCBkYXRhIGZyb20gb25lIHdvcmtzaGVldCBvbnRvIGFub3RoZXIuCisgICAgIworICAgICMgRXhjZWwgaGFzIGEgcm93IGxpbWl0IG9mIDY1NTM2IHJvd3MuIFNvbWV0aW1lcyB0aGUgYW1vdW50IG9mIHJvdyBkYXRhIHRvIGJlCisgICAgIyB3cml0dGVuIHRvIGEgZmlsZSBpcyBncmVhdGVyIHRoYW4gdGhpcyBsaW1pdC4gSW4gdGhpcyBjYXNlIGl0IGlzIGEgdXNlZnVsCisgICAgIyB0ZWNobmlxdWUgdG8gd3JhcCB0aGUgZGF0YSBmcm9tIG9uZSB3b3Jrc2hlZXQgb250byB0aGUgbmV4dCBzbyB0aGF0IHdlIGdldAorICAgICMgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKyAgICAjCisgICAgIyAgIFNoZWV0MSAgUm93ICAgICAxICAtICA2NTUzNgorICAgICMgICBTaGVldDIgIFJvdyA2NTUzNyAgLSAxMzEwNzIKKyAgICAjICAgU2hlZXQzICBSb3cgMTMxMDczIC0gLi4uCisgICAgIworICAgICMgSW4gb3JkZXIgdG8gYWNoaWV2ZSB0aGlzIHdlIHVzZSBhIHNpbmdsZSB3b3Jrc2hlZXQgcmVmZXJlbmNlIGFuZAorICAgICMgcmVpbml0aWFsaXNlIGl0IHRvIHBvaW50IHRvIGEgbmV3IHdvcmtzaGVldCB3aGVuIHJlcXVpcmVkLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDYsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygncm93X3dyYXAueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgV29ya3NoZWV0IGZvcm1hdHRpbmcuCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgMjApOworICAgIAorICAgIAorICAgICMgRm9yIHRoZSBzYWtlIG9mIHRoaXMgZXhhbXBsZSB3ZSB3aWxsIHVzZSBhIHNtYWxsIHJvdyBsaW1pdC4gSW4gb3JkZXIgdG8gdXNlCisgICAgIyB0aGUgZW50aXJlIHJvdyByYW5nZSBzZXQgdGhlICRyb3dfbGltaXQgdG8gNjU1MzYuCisgICAgbXkgJHJvd19saW1pdCA9IDEwOworICAgIG15ICRyb3cgICAgICAgPSAwOworICAgIAorICAgIGZvciBteSAkY291bnQgKDEgLi4gMiAqICRyb3dfbGltaXQgKzEwKSB7CisgICAgCisgICAgICAgICMgV2hlbiB3ZSBoaXQgdGhlIHJvdyBsaW1pdCB3ZSByZWRpcmVjdCB0aGUgb3V0cHV0CisgICAgICAgICMgdG8gYSBuZXcgd29ya3NoZWV0IGFuZCByZXNldCB0aGUgcm93IG51bWJlci4KKyAgICAgICAgaWYgKCRyb3cgPT0gJHJvd19saW1pdCkgeworICAgICAgICAgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICAgICAgJHJvdyA9IDA7CisgICAgCisgICAgICAgICAgICAjIFJlcGVhdCBhbnkgd29ya3NoZWV0IGZvcm1hdHRpbmcuCisgICAgICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCAyMCk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgICJUaGlzIGlzIHJvdyAkY291bnQiKTsKKyAgICAgICAgJHJvdysrOworICAgIH0KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvcm93X3dyYXAucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBzYWxlcy5wbAorCisKKworRXhhbXBsZSBvZiBhIHNhbGVzIHdvcmtzaGVldCB0byBkZW1vbnN0cmF0ZSBzZXZlcmFsIGRpZmZlcmVudCBmZWF0dXJlcy4KK0Fsc28gdXNlcyBmdW5jdGlvbnMgZnJvbSB0aGUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4gbW9kdWxlLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9zYWxlcy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHNhbGVzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBhIHNhbGVzIHdvcmtzaGVldCB0byBkZW1vbnN0cmF0ZSBzZXZlcmFsIGRpZmZlcmVudCBmZWF0dXJlcy4KKyAgICAjIEFsc28gdXNlcyBmdW5jdGlvbnMgZnJvbSB0aGUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4gbW9kdWxlLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgT2N0b2JlciAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5OworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgICAgICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygic2FsZXMueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCAgICAgICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnTWF5IFNhbGVzJyk7CisgICAgCisgICAgCisgICAgIyBTZXQgdXAgc29tZSBmb3JtYXRzCisgICAgbXkgJWhlYWRpbmcgICAgICAgICA9ICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZ19jb2xvciAgICA9PiAxOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gICAgICAgPT4gJ2NlbnRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICBteSAldG90YWwgICAgICAgICAgID0gICAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZCAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mb3JtYXQgID0+ICckIywjIzAuMDAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICBteSAkaGVhZGluZyAgICAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCVoZWFkaW5nKTsKKyAgICBteSAkdG90YWxfZm9ybWF0ICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCV0b3RhbCk7CisgICAgbXkgJHByaWNlX2Zvcm1hdCAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICckIywjIzAuMDAnKTsKKyAgICBteSAkZGF0ZV9mb3JtYXQgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ21tbSBkIHl5eScpOworICAgIAorICAgIAorICAgICMgV3JpdGUgdGhlIG1haW4gaGVhZGluZ3MKKyAgICAkd29ya3NoZWV0LT5mcmVlemVfcGFuZXMoMSk7ICMgRnJlZXplIHRoZSBmaXJzdCByb3cKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnSXRlbScsICAgICAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJ1F1YW50aXR5JywgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdDMScsICdQcmljZScsICAgICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDEnLCAnVG90YWwnLCAgICAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0UxJywgJ0RhdGUnLCAgICAgJGhlYWRpbmcpOworICAgIAorICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGhzCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgMjUpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0I6QicsIDEwKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdDOkUnLCAxNik7CisgICAgCisgICAgCisgICAgIyBFeHRyYWN0IHRoZSBzYWxlcyBkYXRhIGZyb20gdGhlIF9fREFUQV9fIHNlY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgICAjIEluIHJlYWxpdHkgdGhpcyBpbmZvcm1hdGlvbiB3b3VsZCBwcm9iYWJseSBjb21lIGZyb20gYSBkYXRhYmFzZQorICAgIG15IEBzYWxlczsKKyAgICAKKyAgICBmb3JlYWNoIG15ICRsaW5lICg8REFUQT4pIHsKKyAgICAgICAgY2hvbXAgJGxpbmU7CisgICAgICAgIG5leHQgaWYgJGxpbmUgZXEgJyc7CisgICAgICAgICMgU2ltcGxlLW1pbmRlZCBwcm9jZXNzaW5nIG9mIENTViBkYXRhLiBSZWZlciB0byB0aGUgVGV4dDo6Q1NWX1hTCisgICAgICAgICMgYW5kIFRleHQ6OnhTViBtb2R1bGVzIGZvciBhIG1vcmUgY29tcGxldGUgQ1NWIGhhbmRsaW5nLgorICAgICAgICBteSBAaXRlbXMgPSBzcGxpdCAvLC8sICRsaW5lOworICAgICAgICBwdXNoIEBzYWxlcywgXEBpdGVtczsKKyAgICB9CisgICAgCisgICAgCisgICAgIyBXcml0ZSBvdXQgdGhlIGl0ZW1zIGZyb20gZWFjaCByb3cKKyAgICBteSAkcm93ID0gMTsKKyAgICBmb3JlYWNoIG15ICRzYWxlIChAc2FsZXMpIHsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgQCRzYWxlWzBdKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMSwgQCRzYWxlWzFdKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMiwgQCRzYWxlWzJdLCAkcHJpY2VfZm9ybWF0KTsKKyAgICAKKyAgICAgICAgIyBDcmVhdGUgYSBmb3JtdWxhIGxpa2UgJz1CMipDMicKKyAgICAgICAgbXkgJGZvcm11bGEgPSAgICc9JworICAgICAgICAgICAgICAgICAgICAgICAgLiB4bF9yb3djb2xfdG9fY2VsbCgkcm93LCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgLiAiKiIKKyAgICAgICAgICAgICAgICAgICAgICAgIC4geGxfcm93Y29sX3RvX2NlbGwoJHJvdywgMik7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDMsICRmb3JtdWxhLCAkcHJpY2VfZm9ybWF0KTsKKyAgICAKKyAgICAgICAgIyBQYXJzZSB0aGUgZGF0ZQorICAgICAgICBteSAkZGF0ZSA9IHhsX2RlY29kZV9kYXRlX1VTKEAkc2FsZVszXSk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDQsICRkYXRlLCAkZGF0ZV9mb3JtYXQpOworICAgICAgICAkcm93Kys7CisgICAgfQorICAgIAorICAgICMgQ3JlYXRlIGEgZm9ybXVsYSB0byBzdW0gdGhlIHRvdGFscywgbGlrZSAnPVNVTShEMjpENiknCisgICAgbXkgJHRvdGFsID0gJz1TVU0oRDI6JworICAgICAgICAgICAgICAgIC4geGxfcm93Y29sX3RvX2NlbGwoJHJvdy0xLCAzKQorICAgICAgICAgICAgICAgIC4gIikiOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDMsICR0b3RhbCwgJHRvdGFsX2Zvcm1hdCk7CisgICAgCisgICAgCisgICAgCisgICAgX19EQVRBX18KKyAgICA1ODYgY2FyZCwyMCwxMjUuNTAsNS8xMi8wMQorICAgIEZsYXQgU2NyZWVuIE1vbml0b3IsMSwxMzAwLjAwLDUvMTIvMDEKKyAgICA2NCBNQiBkaW1tcyw0NSw0OS45OSw1LzEzLzAxCisgICAgMTUgR0IgSEQsMTIsMzAwLjAwLDUvMTMvMDEKKyAgICBTcGVha2VycyAocGFpciksNSwxNS41MCw1LzE0LzAxCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3NhbGVzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogc2VuZG1haWwucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSBNYWlsOjpTZW5kZXIgdG8gc2VuZCBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIEV4Y2VsCitmaWxlIGFzIGFuIGF0dGFjaG1lbnQuCisKK1RoZSBtYWluIHRoaW5nIGlzIHRvIGVuc3VyZSB0aGF0IHlvdSBjbG9zZSgpIHRoZSBXb3Jib29rIGJlZm9yZSB5b3Ugc2VuZCBpdC4KKworU2VlIHRoZSBMPE1haWw6OlNlbmRlcj4gbW9kdWxlIGZvciBmdXJ0aGVyIGRldGFpbHMuCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSBNYWlsOjpTZW5kZXIgdG8gc2VuZCBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIEV4Y2VsCisgICAgIyBmaWxlIGFzIGFuIGF0dGFjaG1lbnQuCisgICAgIworICAgICMgVGhlIG1haW4gdGhpbmcgaXMgdG8gZW5zdXJlIHRoYXQgeW91IGNsb3NlKCkgdGhlIFdvcmJvb2sgYmVmb3JlIHlvdSBzZW5kIGl0LgorICAgICMKKyAgICAjIFNlZSB0aGUgTDxNYWlsOjpTZW5kZXI+IG1vZHVsZSBmb3IgZnVydGhlciBkZXRhaWxzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICB1c2UgTWFpbDo6U2VuZGVyOworICAgIAorICAgICMgQ3JlYXRlIGFuIEV4Y2VsIGZpbGUKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygic2VuZG1haWwueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldDsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAiSGVsbG8gV29ybGQhIik7CisgICAgCisgICAgJHdvcmtib29rLT5jbG9zZSgpOyAjIE11c3QgY2xvc2UgYmVmb3JlIHNlbmRpbmcKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFNlbmQgdGhlIGZpbGUuICBDaGFuZ2UgYWxsIHZhcmlhYmxlcyB0byBzdWl0CisgICAgbXkgJHNlbmRlciA9IG5ldyBNYWlsOjpTZW5kZXIKKyAgICB7CisgICAgICAgIHNtdHAgPT4gJzEyMy4xMjMuMTIzLjEyMycsCisgICAgICAgIGZyb20gPT4gJ1NvbWVvbmUnCisgICAgfTsKKyAgICAKKyAgICAkc2VuZGVyLT5NYWlsRmlsZSgKKyAgICB7CisgICAgICAgIHRvICAgICAgPT4gJ2Fub3RoZXJAbWFpbC5jb20nLAorICAgICAgICBzdWJqZWN0ID0+ICdFeGNlbCBmaWxlJywKKyAgICAgICAgbXNnICAgICA9PiAiSGVyZSBpcyB0aGUgZGF0YS5cbiIsCisgICAgICAgIGZpbGUgICAgPT4gJ21haWwueGxzJywKKyAgICB9KTsKKyAgICAKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvc2VuZG1haWwucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBzdGF0c19leHQucGwKKworCisKK0V4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlCisKK1RoaXMgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZ1bmN0aW9ucyB0aGF0IHJlZmVyZW5jZSBjZWxscyBpbgorb3RoZXIgd29ya3NoZWV0cyB3aXRoaW4gdGhlIHNhbWUgd29ya2Jvb2suCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3N0YXRzX2V4dC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHN0YXRzX2V4dC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlCisgICAgIworICAgICMgVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB0byB1c2UgZnVuY3Rpb25zIHRoYXQgcmVmZXJlbmNlIGNlbGxzIGluCisgICAgIyBvdGhlciB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgc2FtZSB3b3JrYm9vay4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInN0YXRzX2V4dC54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0MSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnVGVzdCByZXN1bHRzJyk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0RhdGEnKTsKKyAgICAKKyAgICAjIFNldCB0aGUgY29sdW1uIHdpZHRoIGZvciBjb2x1bW5zIDEKKyAgICAkd29ya3NoZWV0MS0+c2V0X2NvbHVtbignQTpBJywgMjApOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgZm9ybWF0IGZvciB0aGUgaGVhZGluZ3MKKyAgICBteSAkaGVhZGluZyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRoZWFkaW5nLT5zZXRfYm9sZCgpOworICAgIAorICAgICMgQ3JlYXRlIGEgbnVtZXJpY2FsIGZvcm1hdAorICAgIG15ICRudW1mb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkbnVtZm9ybWF0LT5zZXRfbnVtX2Zvcm1hdCgnMC4wMCcpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMgV3JpdGUgc29tZSBzdGF0aXN0aWNhbCBmdW5jdGlvbnMKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExJywgJ0NvdW50JywgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjEnLCAnPUNPVU5UKERhdGEhQjI6QjkpJyk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBMicsICdTdW0nLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCMicsICc9U1VNKERhdGEhQjI6QjkpJyk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBMycsICdBdmVyYWdlJywgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjMnLCAnPUFWRVJBR0UoRGF0YSFCMjpCOSknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E0JywgJ01pbicsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I0JywgJz1NSU4oRGF0YSFCMjpCOSknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E1JywgJ01heCcsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I1JywgJz1NQVgoRGF0YSFCMjpCOSknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E2JywgJ1N0YW5kYXJkIERldmlhdGlvbicsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I2JywgJz1TVERFVihEYXRhIUIyOkI5KScpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTcnLCAnS3VydG9zaXMnLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCNycsICc9S1VSVChEYXRhIUIyOkI5KScpOworICAgIAorICAgIAorICAgICMgV3JpdGUgdGhlIHNhbXBsZSBkYXRhCisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMScsICdTYW1wbGUnLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMicsIDEpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTMnLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E0JywgMyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBNScsIDQpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTYnLCA1KTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E3JywgNik7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBOCcsIDcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTknLCA4KTsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0IxJywgJ0xlbmd0aCcsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0IyJywgMjUuNCwgJG51bWZvcm1hdCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCMycsIDI1LjQsICRudW1mb3JtYXQpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjQnLCAyNC44LCAkbnVtZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0I1JywgMjUuMCwgJG51bWZvcm1hdCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCNicsIDI1LjMsICRudW1mb3JtYXQpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjcnLCAyNC45LCAkbnVtZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0I4JywgMjUuMiwgJG51bWZvcm1hdCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCOScsIDI0LjgsICRudW1mb3JtYXQpOworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9zdGF0c19leHQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBzdG9ja3MucGwKKworCisKK0V4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlCisKK1RoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGEgY29uZGl0aW9uYWwgbnVtZXJpY2FsIGZvcm1hdAord2l0aCBjb2xvdXJzIHRvIGluZGljYXRlIGlmIGEgc2hhcmUgcHJpY2UgaGFzIGdvbmUgdXAgb3IgZG93bi4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvc3RvY2tzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gc3RvY2tzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBmb3JtYXR0aW5nIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUKKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIGNvbmRpdGlvbmFsIG51bWVyaWNhbCBmb3JtYXQKKyAgICAjIHdpdGggY29sb3VycyB0byBpbmRpY2F0ZSBpZiBhIHNoYXJlIHByaWNlIGhhcyBnb25lIHVwIG9yIGRvd24uCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJzdG9ja3MueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbnMgMSwgMiwgMyBhbmQgNAorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMywgMTUpOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgZm9ybWF0IGZvciB0aGUgY29sdW1uIGhlYWRpbmdzCisgICAgbXkgJGhlYWRlciA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRoZWFkZXItPnNldF9ib2xkKCk7CisgICAgJGhlYWRlci0+c2V0X3NpemUoMTIpOworICAgICRoZWFkZXItPnNldF9jb2xvcignYmx1ZScpOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgZm9ybWF0IGZvciB0aGUgc3RvY2sgcHJpY2UKKyAgICBteSAkZl9wcmljZSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmX3ByaWNlLT5zZXRfYWxpZ24oJ2xlZnQnKTsKKyAgICAkZl9wcmljZS0+c2V0X251bV9mb3JtYXQoJyQwLjAwJyk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBzdG9jayB2b2x1bWUKKyAgICBteSAkZl92b2x1bWUgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZl92b2x1bWUtPnNldF9hbGlnbignbGVmdCcpOworICAgICRmX3ZvbHVtZS0+c2V0X251bV9mb3JtYXQoJyMsIyMwJyk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBwcmljZSBjaGFuZ2UuIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIGNvbmRpdGlvbmFsCisgICAgIyBmb3JtYXQuIFRoZSBudW1iZXIgaXMgZm9ybWF0dGVkIGFzIGEgcGVyY2VudGFnZS4gSWYgaXQgaXMgcG9zaXRpdmUgaXQgaXMKKyAgICAjIGZvcm1hdHRlZCBpbiBncmVlbiwgaWYgaXQgaXMgbmVnYXRpdmUgaXQgaXMgZm9ybWF0dGVkIGluIHJlZCBhbmQgaWYgaXQgaXMKKyAgICAjIHplcm8gaXQgaXMgZm9ybWF0dGVkIGFzIHRoZSBkZWZhdWx0IGZvbnQgY29sb3VyIChpbiB0aGlzIGNhc2UgYmxhY2spLgorICAgICMgTm90ZTogdGhlIFtHcmVlbl0gZm9ybWF0IHByb2R1Y2VzIGFuIHVuYXBwZWFsaW5nIGxpbWUgZ3JlZW4uIFRyeQorICAgICMgW0NvbG9yIDEwXSBpbnN0ZWFkIGZvciBhIGRhcmsgZ3JlZW4uCisgICAgIworICAgIG15ICRmX2NoYW5nZSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmX2NoYW5nZS0+c2V0X2FsaWduKCdsZWZ0Jyk7CisgICAgJGZfY2hhbmdlLT5zZXRfbnVtX2Zvcm1hdCgnW0dyZWVuXTAuMCU7W1JlZF0tMC4wJTswLjAlJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSBvdXQgdGhlIGRhdGEKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnQ29tcGFueScsICRoZWFkZXIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsICdQcmljZScsICAgJGhlYWRlcik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgJ1ZvbHVtZScsICAkaGVhZGVyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAzLCAnQ2hhbmdlJywgICRoZWFkZXIpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDAsICdEYW1hZ2UgSW5jLicgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMSwgMzAuMjUsICAgICAkZl9wcmljZSk7ICAjICQzMC4yNQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDIsIDEyMzQ1NjcsICAgJGZfdm9sdW1lKTsgIyAxLDIzNCw1NjcKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAzLCAwLjA4NSwgICAgICRmX2NoYW5nZSk7ICMgOC41JSBpbiBncmVlbgorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDAsICdEdW1wIENvcnAuJyAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMSwgMS41NiwgICAgICAkZl9wcmljZSk7ICAjICQxLjU2CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMiwgNzU2NCwgICAgICAkZl92b2x1bWUpOyAjIDcsNTY0CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMywgLTAuMDE1LCAgICAkZl9jaGFuZ2UpOyAjIC0xLjUlIGluIHJlZAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDAsICdSZXYgTHRkLicgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMSwgMC4xMywgICAgICAkZl9wcmljZSk7ICAjICQwLjEzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMiwgMzIxLCAgICAgICAkZl92b2x1bWUpOyAjIDMyMQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDMsIDAsICAgICAgICAgJGZfY2hhbmdlKTsgIyAwIGluIHRoZSBmb250IGNvbG9yIChibGFjaykKKyAgICAKKyAgICAKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvc3RvY2tzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdGFiX2NvbG9ycy5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gc2V0IEV4Y2VsIHdvcmtzaGVldCB0YWIgY29sb3Vycy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdGFiX2NvbG9ycy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHRhYl9jb2xvcnMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gc2V0IEV4Y2VsIHdvcmtzaGVldCB0YWIgY29sb3Vycy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1heSAyMDA2LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCd0YWJfY29sb3JzLnhscycpOworICAgIAorICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQ0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBXb3Jrc2hlZXQxIHdpbGwgaGF2ZSB0aGUgZGVmYXVsdCB0YWIgY29sb3VyLgorICAgICR3b3Jrc2hlZXQyLT5zZXRfdGFiX2NvbG9yKCdyZWQnKTsKKyAgICAkd29ya3NoZWV0My0+c2V0X3RhYl9jb2xvcignZ3JlZW4nKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3RhYl9jb2xvcigweDM1KTsgIyBPcmFuZ2UKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdGFiX2NvbG9ycy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHRleHR3cmFwLnBsCisKKworCitFeGFtcGxlIG9mIGZvcm1hdHRpbmcgdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZQorCitUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHdyYXAgdGV4dCBpbiBhIGNlbGwuIFRoZXJlIGFyZSB0d28gYWx0ZXJuYXRpdmVzLAordmVydGljYWwganVzdGlmaWNhdGlvbiBhbmQgdGV4dCB3cmFwLgorCitXaXRoIHZlcnRpY2FsIGp1c3RpZmljYXRpb24gdGhlIHRleHQgaXMgd3JhcHBlZCBhdXRvbWF0aWNhbGx5IHRvIGZpdCB0aGUKK2NvbHVtbiB3aWR0aC4gV2l0aCB0ZXh0IHdyYXAgeW91IG11c3Qgc3BlY2lmeSBhIG5ld2xpbmUgd2l0aCBhbiBlbWJlZGRlZCBcbi4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdGV4dHdyYXAuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB0ZXh0d3JhcC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB3cmFwIHRleHQgaW4gYSBjZWxsLiBUaGVyZSBhcmUgdHdvIGFsdGVybmF0aXZlcywKKyAgICAjIHZlcnRpY2FsIGp1c3RpZmljYXRpb24gYW5kIHRleHQgd3JhcC4KKyAgICAjCisgICAgIyBXaXRoIHZlcnRpY2FsIGp1c3RpZmljYXRpb24gdGhlIHRleHQgaXMgd3JhcHBlZCBhdXRvbWF0aWNhbGx5IHRvIGZpdCB0aGUKKyAgICAjIGNvbHVtbiB3aWR0aC4gV2l0aCB0ZXh0IHdyYXAgeW91IG11c3Qgc3BlY2lmeSBhIG5ld2xpbmUgd2l0aCBhbiBlbWJlZGRlZCBcbi4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInRleHR3cmFwLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAjIFNldCB0aGUgY29sdW1uIHdpZHRoIGZvciBjb2x1bW5zIDEsIDIgYW5kIDMKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDEsIDEsIDI0KTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDIsIDIsIDM0KTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDMsIDMsIDM0KTsKKyAgICAKKyAgICAjIFNldCB0aGUgcm93IGhlaWdodCBmb3Igcm93cyAxLCA0LCBhbmQgNi4gVGhlIGhlaWdodCBvZiByb3cgMiB3aWxsIGFkanVzdAorICAgICMgYXV0b21hdGljYWxseSB0byBmaXQgdGhlIHRleHQuCisgICAgIworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgMzApOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMywgNDApOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coNSwgODApOworICAgIAorICAgIAorICAgICMgTm8gbmV3bGluZXMKKyAgICBteSAkc3RyMSAgPSAiRm9yIHdoYXRldmVyIHdlIGxvc2UgKGxpa2UgYSB5b3Ugb3IgYSBtZSkgIjsKKyAgICAkc3RyMSAgICAuPSAiaXQncyBhbHdheXMgb3Vyc2VsdmVzIHdlIGZpbmQgaW4gdGhlIHNlYSI7CisgICAgCisgICAgIyBFbWJlZGRlZCBuZXdsaW5lcworICAgIG15ICRzdHIyICA9ICJGb3Igd2hhdGV2ZXIgd2UgbG9zZVxuKGxpa2UgYSB5b3Ugb3IgYSBtZSlcbiI7CisgICAgICAgJHN0cjIgLj0gIml0J3MgYWx3YXlzIG91cnNlbHZlc1xud2UgZmluZCBpbiB0aGUgc2VhIjsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBhIGZvcm1hdCBmb3IgdGhlIGNvbHVtbiBoZWFkaW5ncworICAgIG15ICRoZWFkZXIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkaGVhZGVyLT5zZXRfYm9sZCgpOworICAgICRoZWFkZXItPnNldF9mb250KCJDb3VyaWVyIE5ldyIpOworICAgICRoZWFkZXItPnNldF9hbGlnbignY2VudGVyJyk7CisgICAgJGhlYWRlci0+c2V0X2FsaWduKCd2Y2VudGVyJyk7CisgICAgCisgICAgIyBDcmVhdGUgYSAidmVydGljYWwganVzdGlmaWNhdGlvbiIgZm9ybWF0CisgICAgbXkgJGZvcm1hdDEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0MS0+c2V0X2FsaWduKCd2anVzdGlmeScpOworICAgIAorICAgICMgQ3JlYXRlIGEgInRleHQgd3JhcCIgZm9ybWF0CisgICAgbXkgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0Mi0+c2V0X3RleHRfd3JhcCgpOworICAgIAorICAgICMgV3JpdGUgdGhlIGhlYWRlcnMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAic2V0X2FsaWduKCd2anVzdGlmeScpIiwgJGhlYWRlcik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgInNldF9hbGlnbigndmp1c3RpZnknKSIsICRoZWFkZXIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICJzZXRfdGV4dF93cmFwKCkiLCAkaGVhZGVyKTsKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgZXhhbXBsZXMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAxLCAkc3RyMSwgJGZvcm1hdDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDIsICRzdHIxLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMywgJHN0cjIsICRmb3JtYXQyKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAxLCAkc3RyMSwgJGZvcm1hdDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDIsICRzdHIxLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMywgJHN0cjIsICRmb3JtYXQyKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAxLCAkc3RyMSwgJGZvcm1hdDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsIDIsICRzdHIxLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgMywgJHN0cjIsICRmb3JtYXQyKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdGV4dHdyYXAucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB3aW4zMm9sZS5wbAorCisKKworVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB0byBjcmVhdGUgYW4gRXhjZWwgZmlsZSB1c2luZyB0aGUKK1dpbjMyOjpPTEUgbW9kdWxlIGZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBhbiBFeGNlbCBmaWxlIHVzaW5nIHRoZQorICAgICMgV2luMzI6Ok9MRSBtb2R1bGUgZm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24uCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgQ3dkOworICAgIHVzZSBXaW4zMjo6T0xFOworICAgIHVzZSBXaW4zMjo6T0xFOjpDb25zdCAnTWljcm9zb2Z0IEV4Y2VsJzsKKyAgICAKKyAgICAKKyAgICBteSAkYXBwbGljYXRpb24gPSBXaW4zMjo6T0xFLT5uZXcoIkV4Y2VsLkFwcGxpY2F0aW9uIik7CisgICAgbXkgJHdvcmtib29rICAgID0gJGFwcGxpY2F0aW9uLT5Xb3JrYm9va3MtPkFkZDsKKyAgICBteSAkd29ya3NoZWV0ICAgPSAkd29ya2Jvb2stPldvcmtzaGVldHMoMSk7CisgICAgCisgICAgJHdvcmtzaGVldC0+Q2VsbHMoMSwxKS0+e1ZhbHVlfSA9ICJIZWxsbyBXb3JsZCI7CisgICAgJHdvcmtzaGVldC0+Q2VsbHMoMiwxKS0+e1ZhbHVlfSA9ICJPbmUiOworICAgICR3b3Jrc2hlZXQtPkNlbGxzKDMsMSktPntWYWx1ZX0gPSAiVHdvIjsKKyAgICAkd29ya3NoZWV0LT5DZWxscyg0LDEpLT57VmFsdWV9ID0gIDM7CisgICAgJHdvcmtzaGVldC0+Q2VsbHMoNSwxKS0+e1ZhbHVlfSA9ICA0LjAwMDAwMDE7CisgICAgCisgICAgIyBBZGQgc29tZSBmb3JtYXR0aW5nCisgICAgJHdvcmtzaGVldC0+Q2VsbHMoMSwxKS0+Rm9udC0+e0JvbGR9ICAgICAgID0gIlRydWUiOworICAgICR3b3Jrc2hlZXQtPkNlbGxzKDEsMSktPkZvbnQtPntTaXplfSAgICAgICA9IDE2OworICAgICR3b3Jrc2hlZXQtPkNlbGxzKDEsMSktPkZvbnQtPntDb2xvckluZGV4fSA9IDM7CisgICAgJHdvcmtzaGVldC0+Q29sdW1ucygiQTpBIiktPntDb2x1bW5XaWR0aH0gID0gMjU7CisgICAgCisgICAgIyBXcml0ZSBhIGh5cGVybGluaworICAgIG15ICRyYW5nZSA9ICR3b3Jrc2hlZXQtPlJhbmdlKCJBNzpBNyIpOworICAgICR3b3Jrc2hlZXQtPkh5cGVybGlua3MtPkFkZCh7IEFuY2hvciA9PiAkcmFuZ2UsIEFkZHJlc3MgPT4gImh0dHA6Ly93d3cucGVybC5jb20vIn0pOworICAgIAorICAgICMgR2V0IGN1cnJlbnQgZGlyZWN0b3J5IHVzaW5nIEN3ZC5wbQorICAgIG15ICRkaXIgPSBjd2QoKTsKKyAgICAKKyAgICAkd29ya2Jvb2stPlNhdmVBcyh7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTmFtZSAgID0+ICRkaXIgLiAnL3dpbjMyb2xlLnhscycsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRm9ybWF0ID0+IHhsTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICR3b3JrYm9vay0+Q2xvc2U7CisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3dpbjMyb2xlLnBsPgorCis9aGVhZDIgRXhhbXBsZTogd3JpdGVfYXJyYXlzLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSB0bword3JpdGUgMUQgYW5kIDJEIGFycmF5cyBvZiBkYXRhLgorCitUbyBmaW5kIG91dCBtb3JlIGFib3V0IGFycmF5IHJlZmVyZW5jZXMgcmVmZXIoISEpIHRvIHRoZSBwZXJscmVmIGFuZAorcGVybHJlZnR1dCBtYW5wYWdlcy4gVG8gZmluZCBvdXQgbW9yZSBhYm91dCAyRCBhcnJheXMgb3IgImxpc3Qgb2YKK2xpc3RzIiByZWZlciB0byB0aGUgcGVybGxvbCBtYW5wYWdlLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy93cml0ZV9hcnJheXMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB3cml0ZV9hcnJheXMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8KKyAgICAjIHdyaXRlIDFEIGFuZCAyRCBhcnJheXMgb2YgZGF0YS4KKyAgICAjCisgICAgIyBUbyBmaW5kIG91dCBtb3JlIGFib3V0IGFycmF5IHJlZmVyZW5jZXMgcmVmZXIoISEpIHRvIHRoZSBwZXJscmVmIGFuZAorICAgICMgcGVybHJlZnR1dCBtYW5wYWdlcy4gVG8gZmluZCBvdXQgbW9yZSBhYm91dCAyRCBhcnJheXMgb3IgImxpc3Qgb2YKKyAgICAjIGxpc3RzIiByZWZlciB0byB0aGUgcGVybGxvbCBtYW5wYWdlLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygid3JpdGVfYXJyYXlzLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdFeGFtcGxlIDEnKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRXhhbXBsZSAyJyk7CisgICAgbXkgJHdvcmtzaGVldDMgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0V4YW1wbGUgMycpOworICAgIG15ICR3b3Jrc2hlZXQ0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdFeGFtcGxlIDQnKTsKKyAgICBteSAkd29ya3NoZWV0NSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRXhhbXBsZSA1Jyk7CisgICAgbXkgJHdvcmtzaGVldDYgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0V4YW1wbGUgNicpOworICAgIG15ICR3b3Jrc2hlZXQ3ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdFeGFtcGxlIDcnKTsKKyAgICBteSAkd29ya3NoZWV0OCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRXhhbXBsZSA4Jyk7CisgICAgCisgICAgbXkgJGZvcm1hdCAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoY29sb3IgPT4gJ3JlZCcsIGJvbGQgPT4gMSk7CisgICAgCisgICAgCisgICAgIyBEYXRhIGFycmF5cyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMuCisgICAgIyB1bmRlZiB2YWx1ZXMgYXJlIHdyaXR0ZW4gYXMgYmxhbmsgY2VsbHMgKHdpdGggZm9ybWF0IGlmIHNwZWNpZmllZCkuCisgICAgIworICAgIG15IEBhcnJheSAgID0gICAoICdvbmUnLCAndHdvJywgdW5kZWYsICdmb3VyJyApOworICAgIAorICAgIG15IEBhcnJheTJkID0gICAoCisgICAgICAgICAgICAgICAgICAgICAgICBbJ21hZ2dpZScsICdtaWxseScsICdtb2xseScsICdtYXknICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgWzEzLCAgICAgICAxNCwgICAgICAxNSwgICAgICAxNiAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsnc2hlbGwnLCAgJ3N0YXInLCAgJ2NyYWInLCAgJ3N0b25lJ10sCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgIyAxLiBXcml0ZSBhIHJvdyBvZiBkYXRhIHVzaW5nIGFuIGFycmF5IHJlZmVyZW5jZS4KKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExJywgXEBhcnJheSk7CisgICAgCisgICAgIyAyLiBTYW1lIGFzIDEuIGFib3ZlIHVzaW5nIGFuIGFub255bW91cyBhcnJheSByZWYuCisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMScsIFsgQGFycmF5IF0pOworICAgIAorICAgICMgMy4gV3JpdGUgYSByb3cgb2YgZGF0YSB1c2luZyBhbiBleHBsaWNpdCB3cml0ZV9yb3coKSBtZXRob2QgY2FsbC4KKyAgICAjICAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyB3cml0ZSgpIGluIEV4LiAxIGFib3ZlLgorICAgICMKKyAgICAkd29ya3NoZWV0My0+d3JpdGVfcm93KCdBMScsIFxAYXJyYXkpOworICAgIAorICAgICMgNC4gV3JpdGUgYSBjb2x1bW4gb2YgZGF0YSB1c2luZyB0aGUgd3JpdGVfY29sKCkgbWV0aG9kIGNhbGwuCisgICAgJHdvcmtzaGVldDQtPndyaXRlX2NvbCgnQTEnLCBcQGFycmF5KTsKKyAgICAKKyAgICAjIDUuIFdyaXRlIGEgY29sdW1uIG9mIGRhdGEgdXNpbmcgYSByZWYgdG8gYW4gYXJyYXkgcmVmLCBpLmUuIGEgMkQgYXJyYXkuCisgICAgJHdvcmtzaGVldDUtPndyaXRlKCdBMScsIFsgXEBhcnJheSBdKTsKKyAgICAKKyAgICAjIDYuIFdyaXRlIGEgMkQgYXJyYXkgaW4gY29sLXJvdyBvcmRlci4KKyAgICAkd29ya3NoZWV0Ni0+d3JpdGUoJ0ExJywgXEBhcnJheTJkKTsKKyAgICAKKyAgICAjIDcuIFdyaXRlIGEgMkQgYXJyYXkgaW4gcm93LWNvbCBvcmRlci4KKyAgICAkd29ya3NoZWV0Ny0+d3JpdGVfY29sKCdBMScsIFxAYXJyYXkyZCk7CisgICAgCisgICAgIyA4LiBXcml0ZSBhIHJvdyBvZiBkYXRhIHdpdGggZm9ybWF0dGluZy4gVGhlIGJsYW5rIGNlbGwgaXMgYWxzbyBmb3JtYXR0ZWQuCisgICAgJHdvcmtzaGVldDgtPndyaXRlKCdBMScsIFxAYXJyYXksICRmb3JtYXQpOworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy93cml0ZV9hcnJheXMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB3cml0ZV9oYW5kbGVyMS5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gYWRkIGEgdXNlciBkZWZpbmVkIGRhdGEgaGFuZGxlciB0byB0aGUgU3ByZWFkc2hlZXQ6OgorV3JpdGVFeGNlbCB3cml0ZSgpIG1ldGhvZC4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBhIDcgZGlnaXQgSUQgbnVtYmVyLgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3dyaXRlX2hhbmRsZXIxLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gd3JpdGVfaGFuZGxlcjEucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byBhZGQgYSB1c2VyIGRlZmluZWQgZGF0YSBoYW5kbGVyIHRvIHRoZSBTcHJlYWRzaGVldDo6CisgICAgIyBXcml0ZUV4Y2VsIHdyaXRlKCkgbWV0aG9kLgorICAgICMKKyAgICAjIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgaGFuZGxlciBmb3IgYSA3IGRpZ2l0IElEIG51bWJlci4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIndyaXRlX2hhbmRsZXIxLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBZGQgYSBoYW5kbGVyIGZvciA3IGRpZ2l0IGlkIG51bWJlcnMuIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgYSBzdHJpbmcKKyAgICAjIHN1Y2ggYXMgMDAwMDAwMSB3cml0dGVuIGFzIGEgc3RyaW5nIGluc3RlYWQgb2YgYSBudW1iZXIgYW5kIHRodXMgcHJlc2VydmUKKyAgICAjIHRoZSBsZWFkaW5nIHplcm9lcy4KKyAgICAjCisgICAgIyBOb3RlOiB5b3UgY2FuIGdldCB0aGUgc2FtZSBlZmZlY3QgdXNpbmcgdGhlIGtlZXBfbGVhZGluZ196ZXJvcygpIG1ldGhvZCBidXQKKyAgICAjIHRoaXMgc2VydmVzIGFzIGEgc2ltcGxlIGV4YW1wbGUuCisgICAgIworICAgICR3b3Jrc2hlZXQtPmFkZF93cml0ZV9oYW5kbGVyKHFyW15cZHs3fSRdLCBcJndyaXRlX215X2lkKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGRhdGEgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLgorICAgICMKKyAgICBzdWIgd3JpdGVfbXlfaWQgeworICAgIAorICAgICAgICBteSAkd29ya3NoZWV0ID0gc2hpZnQ7CisgICAgCisgICAgICAgIHJldHVybiAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoQF8pOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIFRoaXMgZm9ybWF0IG1haW50YWlucyB0aGUgY2VsbCBhcyB0ZXh0IGV2ZW4gaWYgaXQgaXMgZWRpdGVkLgorICAgIG15ICRpZF9mb3JtYXQgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICdAJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSBzb21lIG51bWJlcnMgaW4gdGhlIHVzZXIgZGVmaW5lZCBmb3JtYXQKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnMDAwMDAwMCcsICRpZF9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICcwMDAwMDAxJywgJGlkX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgJzAwMDQwMDAnLCAkaWRfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTQnLCAnMTIzNDU2NycsICRpZF9mb3JtYXQpOworICAgIAorICAgICMgV3JpdGUgc29tZSBudW1iZXJzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGRlZmluZWQgZm9ybWF0CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E2JywgJzAwMDAwMCcsICAkaWRfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTcnLCAnMDAwMDAxJywgICRpZF9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBOCcsICcwMDQwMDAnLCAgJGlkX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E5JywgJzEyMzQ1NicsICAkaWRfZm9ybWF0KTsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3dyaXRlX2hhbmRsZXIxLnBsPgorCis9aGVhZDIgRXhhbXBsZTogd3JpdGVfaGFuZGxlcjIucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIGFkZCBhIHVzZXIgZGVmaW5lZCBkYXRhIGhhbmRsZXIgdG8gdGhlIFNwcmVhZHNoZWV0OjoKK1dyaXRlRXhjZWwgd3JpdGUoKSBtZXRob2QuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgaGFuZGxlciBmb3IgYSA3IGRpZ2l0IElEIG51bWJlci4KK0l0IGFkZHMgYW4gYWRkaXRpb25hbCBjb25zdHJhaW50IHRvIHRoZSB3cml0ZV9oYW5kbGVyMS5wbCBpbiB0aGF0IGl0IG9ubHkKK2ZpbHRlcnMgZGF0YSB0aGF0IGlzbid0IGluIHRoZSB0aGlyZCBjb2x1bW4uCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvd3JpdGVfaGFuZGxlcjIuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB3cml0ZV9oYW5kbGVyMi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGFkZCBhIHVzZXIgZGVmaW5lZCBkYXRhIGhhbmRsZXIgdG8gdGhlIFNwcmVhZHNoZWV0OjoKKyAgICAjIFdyaXRlRXhjZWwgd3JpdGUoKSBtZXRob2QuCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBhIDcgZGlnaXQgSUQgbnVtYmVyLgorICAgICMgSXQgYWRkcyBhbiBhZGRpdGlvbmFsIGNvbnN0cmFpbnQgdG8gdGhlIHdyaXRlX2hhbmRsZXIxLnBsIGluIHRoYXQgaXQgb25seQorICAgICMgZmlsdGVycyBkYXRhIHRoYXQgaXNuJ3QgaW4gdGhlIHRoaXJkIGNvbHVtbi4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIndyaXRlX2hhbmRsZXIyLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBZGQgYSBoYW5kbGVyIGZvciA3IGRpZ2l0IGlkIG51bWJlcnMuIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgYSBzdHJpbmcKKyAgICAjIHN1Y2ggYXMgMDAwMDAwMSB3cml0dGVuIGFzIGEgc3RyaW5nIGluc3RlYWQgb2YgYSBudW1iZXIgYW5kIHRodXMgcHJlc2VydmUKKyAgICAjIHRoZSBsZWFkaW5nIHplcm9lcy4KKyAgICAjCisgICAgIyBOb3RlOiB5b3UgY2FuIGdldCB0aGUgc2FtZSBlZmZlY3QgdXNpbmcgdGhlIGtlZXBfbGVhZGluZ196ZXJvcygpIG1ldGhvZCBidXQKKyAgICAjIHRoaXMgc2VydmVzIGFzIGEgc2ltcGxlIGV4YW1wbGUuCisgICAgIworICAgICR3b3Jrc2hlZXQtPmFkZF93cml0ZV9oYW5kbGVyKHFyW15cZHs3fSRdLCBcJndyaXRlX215X2lkKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGRhdGEgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLiBUaGUgaGFuZGxlcgorICAgICMgaXMgc2V0IHVwIHNvIHRoYXQgaXQgb25seSBmaWx0ZXJzIGRhdGEgaWYgaXQgaXMgaW4gdGhlIHRoaXJkIGNvbHVtbi4KKyAgICAjCisgICAgc3ViIHdyaXRlX215X2lkIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9IHNoaWZ0OworICAgICAgICBteSAkY29sICAgICAgID0gJF9bMV07CisgICAgCisgICAgICAgICMgY29sIGlzIHplcm8gYmFzZWQKKyAgICAgICAgaWYgKCRjb2wgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZyhAXyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIFJlamVjdCB0aGUgbWF0Y2ggYW5kIHJldHVybiBjb250cm9sIHRvIHdyaXRlKCkKKyAgICAgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICAgICAgfQorICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIFRoaXMgZm9ybWF0IG1haW50YWlucyB0aGUgY2VsbCBhcyB0ZXh0IGV2ZW4gaWYgaXQgaXMgZWRpdGVkLgorICAgIG15ICRpZF9mb3JtYXQgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICdAJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSBzb21lIG51bWJlcnMgaW4gdGhlIHVzZXIgZGVmaW5lZCBmb3JtYXQKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnMDAwMDAwMCcsICRpZF9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMScsICcwMDAwMDAxJywgJGlkX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0MxJywgJzAwMDAwMDInLCAkaWRfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDEnLCAnMDAwMDAwMycsICRpZF9mb3JtYXQpOworICAgIAorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvd3JpdGVfaGFuZGxlcjIucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB3cml0ZV9oYW5kbGVyMy5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gYWRkIGEgdXNlciBkZWZpbmVkIGRhdGEgaGFuZGxlciB0byB0aGUgU3ByZWFkc2hlZXQ6OgorV3JpdGVFeGNlbCB3cml0ZSgpIG1ldGhvZC4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBkYXRlcyBpbiBhIHNwZWNpZmljCitmb3JtYXQuCisKK1NlZSB3cml0ZV9oYW5kbGVyNC5wbCBmb3IgYSBtb3JlIHJpZ29yb3VzIGV4YW1wbGUgd2l0aCBlcnJvciBoYW5kbGluZy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvd3JpdGVfaGFuZGxlcjMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB3cml0ZV9oYW5kbGVyMy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGFkZCBhIHVzZXIgZGVmaW5lZCBkYXRhIGhhbmRsZXIgdG8gdGhlIFNwcmVhZHNoZWV0OjoKKyAgICAjIFdyaXRlRXhjZWwgd3JpdGUoKSBtZXRob2QuCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBkYXRlcyBpbiBhIHNwZWNpZmljCisgICAgIyBmb3JtYXQuCisgICAgIworICAgICMgU2VlIHdyaXRlX2hhbmRsZXI0LnBsIGZvciBhIG1vcmUgcmlnb3JvdXMgZXhhbXBsZSB3aXRoIGVycm9yIGhhbmRsaW5nLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ3cml0ZV9oYW5kbGVyMy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ICAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkZGF0ZV9mb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnZGQvbW0veXknKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQWRkIGEgaGFuZGxlciB0byBtYXRjaCBkYXRlcyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogZC9tL3l5eXkKKyAgICAjCisgICAgIyBUaGUgZGF5IGFuZCBtb250aCBjYW4gYmUgc2luZ2xlIG9yIGRvdWJsZSBkaWdpdHMuCisgICAgIworICAgICR3b3Jrc2hlZXQtPmFkZF93cml0ZV9oYW5kbGVyKHFyW15cZHsxLDJ9L1xkezEsMn0vXGR7NH0kXSwgXCZ3cml0ZV9teV9kYXRlKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGRhdGEgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLgorICAgICMgU2VlIHdyaXRlX2hhbmRsZXI0LnBsIGZvciBhIG1vcmUgcmlnb3JvdXMgZXhhbXBsZSB3aXRoIGVycm9yIGhhbmRsaW5nLgorICAgICMKKyAgICBzdWIgd3JpdGVfbXlfZGF0ZSB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgbXkgQGFyZ3MgICAgICA9IEBfOworICAgIAorICAgICAgICBteSAkdG9rZW4gICAgID0gJGFyZ3NbMl07CisgICAgICAgICAgICR0b2tlbiAgICAgPX4gcXJbXihcZHsxLDJ9KS8oXGR7MSwyfSkvKFxkezR9KSRdOworICAgIAorICAgICAgICAjIENoYW5nZSB0byB0aGUgZGF0ZSBmb3JtYXQgcmVxdWlyZWQgYnkgd3JpdGVfZGF0ZV90aW1lKCkuCisgICAgICAgIG15ICRkYXRlID0gc3ByaW50ZiAiJTRkLSUwMmQtJTAyZFQiLCAkMywgJDIsICQxOworICAgIAorICAgICAgICAkYXJnc1syXSA9ICRkYXRlOworICAgIAorICAgICAgICByZXR1cm4gJHdvcmtzaGVldC0+d3JpdGVfZGF0ZV90aW1lKEBhcmdzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyBXcml0ZSBzb21lIGRhdGVzIGluIHRoZSB1c2VyIGRlZmluZWQgZm9ybWF0CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJzIyLzEyLzIwMDQnLCAkZGF0ZV9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICcxLzEvMTk5NScsICAgJGRhdGVfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTMnLCAnMDEvMDEvMTk5NScsICRkYXRlX2Zvcm1hdCk7CisgICAgCisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy93cml0ZV9oYW5kbGVyMy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHdyaXRlX2hhbmRsZXI0LnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byBhZGQgYSB1c2VyIGRlZmluZWQgZGF0YSBoYW5kbGVyIHRvIHRoZSBTcHJlYWRzaGVldDo6CitXcml0ZUV4Y2VsIHdyaXRlKCkgbWV0aG9kLgorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFkZCBhIGhhbmRsZXIgZm9yIGRhdGVzIGluIGEgc3BlY2lmaWMKK2Zvcm1hdC4KKworVGhpcyBpcyBhIG1vcmUgcmlnb3JvdXMgdmVyc2lvbiBvZiB3cml0ZV9oYW5kbGVyMy5wbC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvd3JpdGVfaGFuZGxlcjQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB3cml0ZV9oYW5kbGVyNC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGFkZCBhIHVzZXIgZGVmaW5lZCBkYXRhIGhhbmRsZXIgdG8gdGhlIFNwcmVhZHNoZWV0OjoKKyAgICAjIFdyaXRlRXhjZWwgd3JpdGUoKSBtZXRob2QuCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBkYXRlcyBpbiBhIHNwZWNpZmljCisgICAgIyBmb3JtYXQuCisgICAgIworICAgICMgVGhpcyBpcyBhIG1vcmUgcmlnb3JvdXMgdmVyc2lvbiBvZiB3cml0ZV9oYW5kbGVyMy5wbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygid3JpdGVfaGFuZGxlcjQueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCAgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGRhdGVfZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ2RkL21tL3l5Jyk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEFkZCBhIGhhbmRsZXIgdG8gbWF0Y2ggZGF0ZXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzOiBkL20veXksIGQvbS95eXl5CisgICAgIworICAgICMgVGhlIGRheSBhbmQgbW9udGggY2FuIGJlIHNpbmdsZSBvciBkb3VibGUgZGlnaXRzIGFuZCB0aGUgeWVhciBjYW4gYmUgIDIgb3IgNAorICAgICMgZGlnaXRzLgorICAgICMKKyAgICAkd29ya3NoZWV0LT5hZGRfd3JpdGVfaGFuZGxlcihxclteXGR7MSwyfS9cZHsxLDJ9L1xkezIsNH0kXSwgXCZ3cml0ZV9teV9kYXRlKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGRhdGEgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLgorICAgICMKKyAgICBzdWIgd3JpdGVfbXlfZGF0ZSB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgbXkgQGFyZ3MgICAgICA9IEBfOworICAgIAorICAgICAgICBteSAkdG9rZW4gICAgID0gJGFyZ3NbMl07CisgICAgCisgICAgICAgIGlmICgkdG9rZW4gPX4gIHFyW14oXGR7MSwyfSkvKFxkezEsMn0pLyhcZHsyLDR9KSRdKSB7CisgICAgCisgICAgICAgICAgICBteSAkZGF5ICA9ICQxOworICAgICAgICAgICAgbXkgJG1vbiAgPSAkMjsKKyAgICAgICAgICAgIG15ICR5ZWFyID0gJDM7CisgICAgCisgICAgICAgICAgICAjIFVzZSBhIHdpbmRvdyBmb3IgMiBkaWdpdCBkYXRlcy4gVGhpcyB3aWxsIGtlZXAgc29tZSByYWdnZWQgUGVybAorICAgICAgICAgICAgIyBwcm9ncmFtbWVyIGVtcGxveWVkIGluIHRoaXJ0eSB5ZWFycyB0aW1lLiA6LSkKKyAgICAgICAgICAgIGlmIChsZW5ndGggJHllYXIgPT0gMikgeworICAgICAgICAgICAgICAgIGlmICgkeWVhciA8IDUwKSB7CisgICAgICAgICAgICAgICAgICAgICR5ZWFyICs9IDIwMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkeWVhciArPSAxOTAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIG15ICRkYXRlID0gc3ByaW50ZiAiJTRkLSUwMmQtJTAyZFQiLCAkeWVhciwgJG1vbiwgJGRheTsKKyAgICAKKyAgICAgICAgICAgICMgQ29udmVydCB0aGUgSVNPIElTTzg2MDEgc3R5bGUgc3RyaW5nIHRvIGFuIEV4Y2VsIGRhdGUKKyAgICAgICAgICAgICRkYXRlID0gJHdvcmtzaGVldC0+Y29udmVydF9kYXRlX3RpbWUoJGRhdGUpOworICAgIAorICAgICAgICAgICAgaWYgKGRlZmluZWQgJGRhdGUpIHsKKyAgICAgICAgICAgICAgICAjIERhdGUgd2FzIHZhbGlkCisgICAgICAgICAgICAgICAgJGFyZ3NbMl0gPSAkZGF0ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHdvcmtzaGVldC0+d3JpdGVfbnVtYmVyKEBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICMgTm90IGEgdmFsaWQgZGF0ZSB0aGVyZWZvcmUgd3JpdGUgYXMgYSBzdHJpbmcKKyAgICAgICAgICAgICAgICByZXR1cm4gJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nKEBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgU2hvdWxkbid0IGhhcHBlbiBpZiB0aGUgc2FtZSBtYXRjaCBpcyB1c2VkIGluIHRoZSByZSBhbmQgc3ViLgorICAgICAgICAgICAgcmV0dXJuIHVuZGVmOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgICMgV3JpdGUgc29tZSBkYXRlcyBpbiB0aGUgdXNlciBkZWZpbmVkIGZvcm1hdAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICcyMi8xMi8yMDA0JywgJGRhdGVfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTInLCAnMjIvMTIvMDQnLCAgICRkYXRlX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgJzIvMTIvMDQnLCAgICAkZGF0ZV9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNCcsICcyLzUvMDQnLCAgICAgJGRhdGVfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTUnLCAnMi81Lzk1JywgICAgICRkYXRlX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E2JywgJzIvNS8xOTk1JywgICAkZGF0ZV9mb3JtYXQpOworICAgIAorICAgICMgU29tZSBlcnJvbmVvdXMgZGF0ZXMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTgnLCAnMi81LzE4OTUnLCAgICRkYXRlX2Zvcm1hdCk7ICMgRGF0ZSBvdXQgb2YgRXhjZWwgcmFuZ2UKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTknLCAnMjkvMi8yMDAzJywgICRkYXRlX2Zvcm1hdCk7ICMgSW52YWxpZCBsZWFwIGRheQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTAnLCc1MC81MC81MCcsICAgJGRhdGVfZm9ybWF0KTsgIyBNYXRjaGVzIGJ1dCBpc24ndCBhIGRhdGUKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3dyaXRlX2hhbmRsZXI0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogd3JpdGVfdG9fc2NhbGFyLnBsCisKKworCitBbiBleGFtcGxlIG9mIHdyaXRpbmcgYW4gRXhjZWwgZmlsZSB0byBhIFBlcmwgc2NhbGFyIHVzaW5nIFNwcmVhZHNoZWV0OjoKK1dyaXRlRXhjZWwgYW5kIHRoZSBuZXcgZmVhdHVyZXMgb2YgcGVybCA1LjguCisKK0ZvciBhbiBleGFtcGxlcyBvZiBob3cgdG8gd3JpdGUgdG8gYSBzY2FsYXIgaW4gdmVyc2lvbnMgcHJpb3IgdG8gcGVybCA1LjgKK3NlZSB0aGUgZmlsZWhhbmRsZS5wbCBwcm9ncmFtIGFuZCBJTzpTY2FsYXIuCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQW4gZXhhbXBsZSBvZiB3cml0aW5nIGFuIEV4Y2VsIGZpbGUgdG8gYSBQZXJsIHNjYWxhciB1c2luZyBTcHJlYWRzaGVldDo6CisgICAgIyBXcml0ZUV4Y2VsIGFuZCB0aGUgbmV3IGZlYXR1cmVzIG9mIHBlcmwgNS44LgorICAgICMKKyAgICAjIEZvciBhbiBleGFtcGxlcyBvZiBob3cgdG8gd3JpdGUgdG8gYSBzY2FsYXIgaW4gdmVyc2lvbnMgcHJpb3IgdG8gcGVybCA1LjgKKyAgICAjIHNlZSB0aGUgZmlsZWhhbmRsZS5wbCBwcm9ncmFtIGFuZCBJTzpTY2FsYXIuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgCisgICAgIyBVc2UgcGVybCA1LjgncyBmZWF0dXJlIG9mIHVzaW5nIGEgc2NhbGFyIGFzIGEgZmlsZWhhbmRsZS4KKyAgICBteSAgICRmaDsKKyAgICBteSAgICRzdHIgPSAnJzsKKyAgICBvcGVuICRmaCwgJz4nLCBcJHN0ciBvciBkaWUgIkZhaWxlZCB0byBvcGVuIGZpbGVoYW5kbGU6ICQhIjs7CisgICAgCisgICAgCisgICAgIyBPciByZXBsYWNlIHRoZSBwcmV2aW91cyB0aHJlZSBsaW5lcyB3aXRoIHRoaXM6CisgICAgIyBvcGVuIG15ICRmaCwgJz4nLCBcbXkgJHN0ciBvciBkaWUgIkZhaWxlZCB0byBvcGVuIGZpbGVoYW5kbGU6ICQhIjsKKyAgICAKKyAgICAKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2UgYWNjZXB0cyBmaWxlaGFuZGxlIGFzIHdlbGwgYXMgZmlsZSBuYW1lcy4KKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygkZmgpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAgIkhpIEV4Y2VsISIpOworICAgIAorICAgICR3b3JrYm9vay0+Y2xvc2UoKTsKKyAgICAKKyAgICAKKyAgICAjIFRoZSBFeGNlbCBmaWxlIGluIG5vdyBpbiAkc3RyLiBSZW1lbWJlciB0byBiaW5tb2RlKCkgdGhlIG91dHB1dAorICAgICMgZmlsZWhhbmRsZSBiZWZvcmUgcHJpbnRpbmcgaXQuCisgICAgYmlubW9kZSBTVERPVVQ7CisgICAgcHJpbnQgJHN0cjsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3dyaXRlX3RvX3NjYWxhci5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfdXRmMTYucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2Ygd3JpdGluZyBzb21lIFVuaWNvZGUgdGV4dCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCitUaGlzIGV4YW1wbGUgc2hvd3MgVVRGMTYgZW5jb2RpbmcuIFdpdGggcGVybCA1LjggaXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UKK3V0Zjggd2l0aG91dCBtb2RpZmljYXRpb24uCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfdXRmMTYuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlX3V0ZjE2LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIHdyaXRpbmcgc29tZSBVbmljb2RlIHRleHQgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgc2hvd3MgVVRGMTYgZW5jb2RpbmcuIFdpdGggcGVybCA1LjggaXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UKKyAgICAjIHV0Zjggd2l0aG91dCBtb2RpZmljYXRpb24uCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXkgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCd1bmljb2RlX3V0ZjE2LnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBVbmljb2RlIHNtaWxleSBmYWNlICh3aXRoIGluY3JlYXNlZCBmb250IGZvciBsZWdpYmlsaXR5KQorICAgIG15ICRzbWlsZXkgICAgPSBwYWNrICJuIiwgMHgyNjNhOworICAgIG15ICRiaWdfZm9udCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoc2l6ZSA9PiA0MCk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJ0EzJywgJHNtaWxleSwgJGJpZ19mb250KTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIGEgcGhyYXNlIGluIEN5cmlsbGljCisgICAgbXkgJHVuaV9zdHIgPSBwYWNrICJIKiIsICIwNDJkMDQ0MjA0M2UwMDIwMDQ0NDA0NDAwNDMwMDQzNzA0MzAwMDIwMDQiLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiM2QwNDMwMDAyMDA0NDAwNDQzMDQ0MTA0NDEwNDNhMDQzZTA0M2MwMDIxIjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZV91dGYxNmJlX3N0cmluZygnQTUnLCAkdW5pX3N0cik7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJ0E3JywgcGFjayAiSCoiLCAiMDA3NDAwNjUwMDczMDA3NCIpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV91dGYxNi5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfdXRmMTZfamFwYW4ucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2Ygd3JpdGluZyBzb21lIFVuaWNvZGUgdGV4dCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCitUaGlzIGNyZWF0ZXMgYW4gRXhjZWwgZmlsZSB3aXRoIHRoZSB3b3JkIE5pcHBvbiBpbiAzIGNoYXJhY3RlciBzZXRzLgorCitUaGlzIGV4YW1wbGUgc2hvd3MgVVRGMTYgZW5jb2RpbmcuIFdpdGggcGVybCA1LjggaXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UKK3V0Zjggd2l0aG91dCBtb2RpZmljYXRpb24uCisKK1NlZSBhbHNvIHRoZSB1bmljb2RlXzIwMjJfanAucGwgYW5kIHVuaWNvZGVfc2hpZnRfamlzLnBsIGV4YW1wbGVzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlX3V0ZjE2X2phcGFuLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdW5pY29kZV91dGYxNl9qYXBhbi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiB3cml0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgVGhpcyBjcmVhdGVzIGFuIEV4Y2VsIGZpbGUgd2l0aCB0aGUgd29yZCBOaXBwb24gaW4gMyBjaGFyYWN0ZXIgc2V0cy4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgc2hvd3MgVVRGMTYgZW5jb2RpbmcuIFdpdGggcGVybCA1LjggaXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UKKyAgICAjIHV0Zjggd2l0aG91dCBtb2RpZmljYXRpb24uCisgICAgIworICAgICMgU2VlIGFsc28gdGhlIHVuaWNvZGVfMjAyMl9qcC5wbCBhbmQgdW5pY29kZV9zaGlmdF9qaXMucGwgZXhhbXBsZXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXkgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCd1bmljb2RlX3V0ZjE2X2phcGFuLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIFNldCBhIFVuaWNvZGUgZm9udC4KKyAgICBteSAkdW5pX2ZvbnQgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGZvbnQgPT4gJ0FyaWFsIFVuaWNvZGUgTVMnKTsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBzb21lIFVURi0xNkJFIFVuaWNvZGUgdGV4dC4KKyAgICBteSAka2FuamkgICAgID0gcGFjayAnbionLCAweDY1ZTUsIDB4NjcyYzsKKyAgICBteSAka2F0YWthbmEgID0gcGFjayAnbionLCAweGZmODYsIDB4ZmY4ZSwgMHhmZjlkOworICAgIG15ICRoaXJhZ2FuYSAgPSBwYWNrICduKicsIDB4MzA2YiwgMHgzMDdiLCAweDMwOTM7CisgICAgCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJ0ExJywgJGthbmppLCAgICAkdW5pX2ZvbnQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCdBMicsICRrYXRha2FuYSwgJHVuaV9mb250KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91dGYxNmJlX3N0cmluZygnQTMnLCAkaGlyYWdhbmEsICR1bmlfZm9udCk7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJ0thbmppJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IyJywgJ0thdGFrYW5hJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IzJywgJ0hpcmFnYW5hJyk7CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX3V0ZjE2X2phcGFuLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV9jeXJpbGxpYy5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiB3cml0aW5nIHNvbWUgUnVzc2lhbiBjeXJpbGxpYyB0ZXh0IHVzaW5nCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfY3lyaWxsaWMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlX2N5cmlsbGljLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIHdyaXRpbmcgc29tZSBSdXNzaWFuIGN5cmlsbGljIHRleHQgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDUsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFBlcmwgNS44IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgdXRmOCBoYW5kbGluZy4gRm9yIG9sZGVyIHBlcmwKKyAgICAjIHZlcnNpb25zIHlvdSBzaG91bGQgdXNlIFVURjE2IGFuZCB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKSBtZXRob2QuCisgICAgIyBTZWUgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHNlY3Rpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3MuCisgICAgIworICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgIyBJbiB0aGlzIGV4YW1wbGUgd2UgZ2VuZXJhdGUgdXRmOCBzdHJpbmdzIGZyb20gY2hhcmFjdGVyIGRhdGEgYnV0IGluIGEKKyAgICAjIHJlYWwgYXBwbGljYXRpb24gd2Ugd291bGQgZXhwZWN0IHRoZW0gdG8gY29tZSBmcm9tIGFuIGV4dGVybmFsIHNvdXJjZS4KKyAgICAjCisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBSdXNzaWFuIHdvcmtzaGVldCBuYW1lIGluIHV0ZjguCisgICAgbXkgJHNoZWV0ICAgPSBwYWNrICJVKiIsIDB4MDQyMSwgMHgwNDQyLCAweDA0NDAsIDB4MDQzMCwgMHgwNDNELCAweDA0MzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0NiwgMHgwNDMwOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgUnVzc2lhbiBzdHJpbmcuCisgICAgbXkgJHN0ciAgICAgPSBwYWNrICJVKiIsIDB4MDQxNywgMHgwNDM0LCAweDA0NDAsIDB4MDQzMCwgMHgwNDMyLCAweDA0NDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0MiwgMHgwNDMyLCAweDA0NDMsIDB4MDQzOSwgMHgwMDIwLCAweDA0MUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQzOCwgMHgwNDQwLCAweDAwMjE7CisgICAgCisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInVuaWNvZGVfY3lyaWxsaWMueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgkc2hlZXQgLiAnMScpOworICAgIAorICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDE4KTsKKyAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAkc3RyKTsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3VuaWNvZGVfY3lyaWxsaWMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlX2xpc3QucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gZGlzcGxheSBhbGwgYXZhaWxhYmxlCitVbmljb2RlIGNoYXJhY3RlcnMgaW4gYSBmb250LgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlX2xpc3QuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlX2xpc3QucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gZGlzcGxheSBhbGwgYXZhaWxhYmxlCisgICAgIyBVbmljb2RlIGNoYXJhY3RlcnMgaW4gYSBmb250LgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygndW5pY29kZV9saXN0LnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIFNldCBhIFVuaWNvZGUgZm9udC4KKyAgICBteSAkdW5pX2ZvbnQgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGZvbnQgPT4gJ0FyaWFsIFVuaWNvZGUgTVMnKTsKKyAgICAKKyAgICAjIEFzY2lpIGZvbnQgZm9yIGxhYmVscy4KKyAgICBteSAkY291cmllciAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGZvbnQgPT4gJ0NvdXJpZXIgTmV3Jyk7CisgICAgCisgICAgCisgICAgbXkgJGNoYXIgPSAwOworICAgIAorICAgICMgTG9vcCB0aHJvdWdoIGFsbCAzMjc2OCBVVEYtMTZCRSBjaGFyYWN0ZXJzLgorICAgICMKKyAgICBmb3IgbXkgJHJvdyAoMCAuLiAyICoqIDEyIC0xKSB7CisgICAgICAgIGZvciBteSAkY29sICgwIC4uIDMxKSB7CisgICAgCisgICAgICAgICAgICBsYXN0IGlmICRjaGFyID09IDB4ZmZmZjsKKyAgICAKKyAgICAgICAgICAgIGlmICgkY29sICUgMiA9PSAwKXsKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJHJvdywgJGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZignMHglMDRYJywgJGNoYXIpLCAkY291cmllcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZV91dGYxNmJlX3N0cmluZygkcm93LCAkY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjaygnbicsICRjaGFyKyspLCAkdW5pX2ZvbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV9saXN0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV8yMDIyX2pwLnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgSmFwYW5lc2UgZnJvbSBhIGZpbGUgd2l0aCBJU08tMjAyMi1KUAorZW5jb2RlZCB0ZXh0LgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlXzIwMjJfanAuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlXzIwMjJfanAucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIEphcGFuZXNlIGZyb20gYSBmaWxlIHdpdGggSVNPLTIwMjItSlAKKyAgICAjIGVuY29kZWQgdGV4dC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgIyBQZXJsIDUuOCBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHV0ZjggaGFuZGxpbmcuIEZvciBvbGRlciBwZXJsCisgICAgIyB2ZXJzaW9ucyB5b3Ugc2hvdWxkIHVzZSBVVEYxNiBhbmQgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCkgbWV0aG9kLgorICAgICMgU2VlIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZyBzZWN0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2NzLgorICAgICMKKyAgICByZXF1aXJlIDUuMDA4OworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ1bmljb2RlXzIwMjJfanAueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlXzIwMjJfanAudHh0JzsKKyAgICAKKyAgICBvcGVuIEZILCAnPDplbmNvZGluZyhpc28tMjAyMi1qcCknLCAkZmlsZSAgb3IgZGllICJDb3VsZG4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKyAgICAKKyAgICBteSAkcm93ID0gMDsKKyAgICAKKyAgICB3aGlsZSAoPEZIPikgeworICAgICAgICBuZXh0IGlmIC9eIy87ICMgSWdub3JlIHRoZSBjb21tZW50cyBpbiB0aGUgc2FtcGxlIGZpbGUuCisgICAgICAgIGNob21wOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93KyssIDAsICAkXyk7CisgICAgfQorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV8yMDIyX2pwLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV84ODU5XzExLnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgVGhhaSBmcm9tIGEgZmlsZSB3aXRoIElTTy04ODU5LTExIGVuY29kZWQgdGV4dC4KKworCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlXzg4NTlfMTEuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlXzg4NTlfMTEucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIFRoYWkgZnJvbSBhIGZpbGUgd2l0aCBJU08tODg1OS0xMSBlbmNvZGVkIHRleHQuCisgICAgIworICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFBlcmwgNS44IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgdXRmOCBoYW5kbGluZy4gRm9yIG9sZGVyIHBlcmwKKyAgICAjIHZlcnNpb25zIHlvdSBzaG91bGQgdXNlIFVURjE2IGFuZCB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKSBtZXRob2QuCisgICAgIyBTZWUgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHNlY3Rpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3MuCisgICAgIworICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInVuaWNvZGVfODg1OV8xMS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgIAorICAgIAorICAgIG15ICRmaWxlID0gJ3VuaWNvZGVfODg1OV8xMS50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKGlzby04ODU5LTExKScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlXzg4NTlfMTEucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlXzg4NTlfNy5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKworVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIEdyZWVrIGZyb20gYSBmaWxlIHdpdGggSVNPLTg4NTktNyBlbmNvZGVkIHRleHQuCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdW5pY29kZV84ODU5XzcuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlXzg4NTlfNy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgR3JlZWsgZnJvbSBhIGZpbGUgd2l0aCBJU08tODg1OS03IGVuY29kZWQgdGV4dC4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIAorICAgICMgUGVybCA1Ljggb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciB1dGY4IGhhbmRsaW5nLiBGb3Igb2xkZXIgcGVybAorICAgICMgdmVyc2lvbnMgeW91IHNob3VsZCB1c2UgVVRGMTYgYW5kIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZygpIG1ldGhvZC4KKyAgICAjIFNlZSB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcgc2VjdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jcy4KKyAgICAjCisgICAgcmVxdWlyZSA1LjAwODsKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygidW5pY29kZV84ODU5XzcueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlXzg4NTlfNy50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKGlzby04ODU5LTcpJywgJGZpbGUgIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiAkZmlsZTogJCFcbiI7CisgICAgCisgICAgbXkgJHJvdyA9IDA7CisgICAgCisgICAgd2hpbGUgKDxGSD4pIHsKKyAgICAgICAgbmV4dCBpZiAvXiMvOyAjIElnbm9yZSB0aGUgY29tbWVudHMgaW4gdGhlIHNhbXBsZSBmaWxlLgorICAgICAgICBjaG9tcDsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdysrLCAwLCAgJF8pOworICAgIH0KKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3VuaWNvZGVfODg1OV83LnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV9iaWc1LnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgQ2hpbmVzZSBmcm9tIGEgZmlsZSB3aXRoIEJJRzUgZW5jb2RlZCB0ZXh0LgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfYmlnNS5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfYmlnNS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgQ2hpbmVzZSBmcm9tIGEgZmlsZSB3aXRoIEJJRzUgZW5jb2RlZCB0ZXh0LgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgIyBQZXJsIDUuOCBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHV0ZjggaGFuZGxpbmcuIEZvciBvbGRlciBwZXJsCisgICAgIyB2ZXJzaW9ucyB5b3Ugc2hvdWxkIHVzZSBVVEYxNiBhbmQgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCkgbWV0aG9kLgorICAgICMgU2VlIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZyBzZWN0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2NzLgorICAgICMKKyAgICByZXF1aXJlIDUuMDA4OworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ1bmljb2RlX2JpZzUueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDgwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlX2JpZzUudHh0JzsKKyAgICAKKyAgICBvcGVuIEZILCAnPDplbmNvZGluZyhiaWc1KScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX2JpZzUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlX2NwMTI1MS5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKworVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIFJ1c3NpYW4gZnJvbSBhIGZpbGUgd2l0aCBDUDEyNTEgZW5jb2RlZCB0ZXh0LgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfY3AxMjUxLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdW5pY29kZV9jcDEyNTEucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIFJ1c3NpYW4gZnJvbSBhIGZpbGUgd2l0aCBDUDEyNTEgZW5jb2RlZCB0ZXh0LgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgIyBQZXJsIDUuOCBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHV0ZjggaGFuZGxpbmcuIEZvciBvbGRlciBwZXJsCisgICAgIyB2ZXJzaW9ucyB5b3Ugc2hvdWxkIHVzZSBVVEYxNiBhbmQgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCkgbWV0aG9kLgorICAgICMgU2VlIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZyBzZWN0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2NzLgorICAgICMKKyAgICByZXF1aXJlIDUuMDA4OworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ1bmljb2RlX2NwMTI1MS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgIAorICAgIAorICAgIG15ICRmaWxlID0gJ3VuaWNvZGVfY3AxMjUxLnR4dCc7CisgICAgCisgICAgb3BlbiBGSCwgJzw6ZW5jb2RpbmcoY3AxMjUxKScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX2NwMTI1MS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfY3AxMjU2LnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgQXJhYmljIHRleHQgZnJvbSBhIENQLTEyNTYgZW5jb2RlZCBmaWxlLgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfY3AxMjU2LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdW5pY29kZV9jcDEyNTYucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIEFyYWJpYyB0ZXh0IGZyb20gYSBDUC0xMjU2IGVuY29kZWQgZmlsZS4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIAorICAgICMgUGVybCA1Ljggb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciB1dGY4IGhhbmRsaW5nLiBGb3Igb2xkZXIgcGVybAorICAgICMgdmVyc2lvbnMgeW91IHNob3VsZCB1c2UgVVRGMTYgYW5kIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZygpIG1ldGhvZC4KKyAgICAjIFNlZSB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcgc2VjdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jcy4KKyAgICAjCisgICAgcmVxdWlyZSA1LjAwODsKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygidW5pY29kZV9jcDEyNTYueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlX2NwMTI1Ni50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKGNwMTI1NiknLCAkZmlsZSAgb3IgZGllICJDb3VsZG4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKyAgICAKKyAgICBteSAkcm93ID0gMDsKKyAgICAKKyAgICB3aGlsZSAoPEZIPikgeworICAgICAgICBuZXh0IGlmIC9eIy87ICMgSWdub3JlIHRoZSBjb21tZW50cyBpbiB0aGUgc2FtcGxlIGZpbGUuCisgICAgICAgIGNob21wOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93KyssIDAsICAkXyk7CisgICAgfQorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV9jcDEyNTYucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlX2tvaThyLnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgUnVzc2lhbiBmcm9tIGEgZmlsZSB3aXRoIEtPSTgtUiBlbmNvZGVkIHRleHQuCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdW5pY29kZV9rb2k4ci5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfa29pOHIucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIFJ1c3NpYW4gZnJvbSBhIGZpbGUgd2l0aCBLT0k4LVIgZW5jb2RlZCB0ZXh0LgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgIyBQZXJsIDUuOCBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHV0ZjggaGFuZGxpbmcuIEZvciBvbGRlciBwZXJsCisgICAgIyB2ZXJzaW9ucyB5b3Ugc2hvdWxkIHVzZSBVVEYxNiBhbmQgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCkgbWV0aG9kLgorICAgICMgU2VlIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZyBzZWN0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2NzLgorICAgICMKKyAgICByZXF1aXJlIDUuMDA4OworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ1bmljb2RlX2tvaThyLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCA1MCk7CisgICAgCisgICAgCisgICAgbXkgJGZpbGUgPSAndW5pY29kZV9rb2k4ci50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKGtvaTgtciknLCAkZmlsZSAgb3IgZGllICJDb3VsZG4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKyAgICAKKyAgICBteSAkcm93ID0gMDsKKyAgICAKKyAgICB3aGlsZSAoPEZIPikgeworICAgICAgICBuZXh0IGlmIC9eIy87ICMgSWdub3JlIHRoZSBjb21tZW50cyBpbiB0aGUgc2FtcGxlIGZpbGUuCisgICAgICAgIGNob21wOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93KyssIDAsICAkXyk7CisgICAgfQorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV9rb2k4ci5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfcG9saXNoX3V0ZjgucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisKK1RoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBQb2xpc2ggZnJvbSBhIGZpbGUgd2l0aCBVVEY4IGVuY29kZWQgdGV4dC4KKworCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlX3BvbGlzaF91dGY4LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdW5pY29kZV9wb2xpc2hfdXRmOC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgUG9saXNoIGZyb20gYSBmaWxlIHdpdGggVVRGOCBlbmNvZGVkIHRleHQuCisgICAgIworICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFBlcmwgNS44IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgdXRmOCBoYW5kbGluZy4gRm9yIG9sZGVyIHBlcmwKKyAgICAjIHZlcnNpb25zIHlvdSBzaG91bGQgdXNlIFVURjE2IGFuZCB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKSBtZXRob2QuCisgICAgIyBTZWUgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHNlY3Rpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3MuCisgICAgIworICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInVuaWNvZGVfcG9saXNoX3V0ZjgueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlX3BvbGlzaF91dGY4LnR4dCc7CisgICAgCisgICAgb3BlbiBGSCwgJzw6ZW5jb2RpbmcodXRmOCknLCAkZmlsZSAgb3IgZGllICJDb3VsZG4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKyAgICAKKyAgICBteSAkcm93ID0gMDsKKyAgICAKKyAgICB3aGlsZSAoPEZIPikgeworICAgICAgICBuZXh0IGlmIC9eIy87ICMgSWdub3JlIHRoZSBjb21tZW50cyBpbiB0aGUgc2FtcGxlIGZpbGUuCisgICAgICAgIGNob21wOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93KyssIDAsICAkXyk7CisgICAgfQorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV9wb2xpc2hfdXRmOC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfc2hpZnRfamlzLnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgSmFwZW5lc2UgdGV4dCBmcm9tIGEgZmlsZSB3aXRoIFNoaWZ0LUpJUworZW5jb2RlZCB0ZXh0LgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlX3NoaWZ0X2ppcy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfc2hpZnRfamlzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworICAgICMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBKYXBlbmVzZSB0ZXh0IGZyb20gYSBmaWxlIHdpdGggU2hpZnQtSklTCisgICAgIyBlbmNvZGVkIHRleHQuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIAorICAgICMgUGVybCA1Ljggb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciB1dGY4IGhhbmRsaW5nLiBGb3Igb2xkZXIgcGVybAorICAgICMgdmVyc2lvbnMgeW91IHNob3VsZCB1c2UgVVRGMTYgYW5kIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZygpIG1ldGhvZC4KKyAgICAjIFNlZSB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcgc2VjdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jcy4KKyAgICAjCisgICAgcmVxdWlyZSA1LjAwODsKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygidW5pY29kZV9zaGlmdF9qaXMueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlX3NoaWZ0X2ppcy50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKHNoaWZ0amlzKScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX3NoaWZ0X2ppcy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNzdjJ4bHMucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgV3JpdGVFeGNlbCBtb2R1bGUKKworU2ltcGxlIHByb2dyYW0gdG8gY29udmVydCBhIENTViBjb21tYS1zZXBhcmF0ZWQgdmFsdWUgZmlsZSB0byBhbiBFeGNlbCBmaWxlLgorVGhpcyBpcyBtb3JlIG9yIGxlc3MgYW4gbm9uLW9wIHNpbmNlIEV4Y2VsIGNhbiByZWFkIENTViBmaWxlcy4KK1RoZSBwcm9ncmFtIHVzZXMgVGV4dDo6Q1NWX1hTIHRvIHBhcnNlIHRoZSBDU1YuCisKK1VzYWdlOiBjc3YyeGxzLnBsIGZpbGUuY3N2IG5ld2ZpbGUueGxzCisKKworTk9URTogVGhpcyBpcyBvbmx5IGEgc2ltcGxlIGNvbnZlcnNpb24gdXRpbGl0eSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzLgorRm9yIGNvbnZlcnRpbmcgYSBDU1Ygb3IgVGFiIHNlcGFyYXRlZCBvciBhbnkgb3RoZXIgdHlwZSBvZiBkZWxpbWl0ZWQKK3RleHQgZmlsZSB0byBFeGNlbCBJIHJlY29tbWVuZCB0aGUgbW9yZSByaWdvcm91cyBjc3YyeGxzIHByb2dyYW0gdGhhdCBpcworcGFydCBvZiBILk1lcmlqbiBCcmFuZCdzIFRleHQ6OkNTVl9YUyBtb2R1bGUgZGlzdHJvLgorCitTZWUgdGhlIGV4YW1wbGVzL2NzdjJ4bHMgbGluayBoZXJlOgorICAgIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+aG1icmFuZC9UZXh0LUNTVl9YUy9NQU5JRkVTVD4KKworCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZQorICAgICMKKyAgICAjIFNpbXBsZSBwcm9ncmFtIHRvIGNvbnZlcnQgYSBDU1YgY29tbWEtc2VwYXJhdGVkIHZhbHVlIGZpbGUgdG8gYW4gRXhjZWwgZmlsZS4KKyAgICAjIFRoaXMgaXMgbW9yZSBvciBsZXNzIGFuIG5vbi1vcCBzaW5jZSBFeGNlbCBjYW4gcmVhZCBDU1YgZmlsZXMuCisgICAgIyBUaGUgcHJvZ3JhbSB1c2VzIFRleHQ6OkNTVl9YUyB0byBwYXJzZSB0aGUgQ1NWLgorICAgICMKKyAgICAjIFVzYWdlOiBjc3YyeGxzLnBsIGZpbGUuY3N2IG5ld2ZpbGUueGxzCisgICAgIworICAgICMKKyAgICAjIE5PVEU6IFRoaXMgaXMgb25seSBhIHNpbXBsZSBjb252ZXJzaW9uIHV0aWxpdHkgZm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3Nlcy4KKyAgICAjIEZvciBjb252ZXJ0aW5nIGEgQ1NWIG9yIFRhYiBzZXBhcmF0ZWQgb3IgYW55IG90aGVyIHR5cGUgb2YgZGVsaW1pdGVkCisgICAgIyB0ZXh0IGZpbGUgdG8gRXhjZWwgSSByZWNvbW1lbmQgdGhlIG1vcmUgcmlnb3JvdXMgY3N2MnhscyBwcm9ncmFtIHRoYXQgaXMKKyAgICAjIHBhcnQgb2YgSC5NZXJpam4gQnJhbmQncyBUZXh0OjpDU1ZfWFMgbW9kdWxlIGRpc3Ryby4KKyAgICAjCisgICAgIyBTZWUgdGhlIGV4YW1wbGVzL2NzdjJ4bHMgbGluayBoZXJlOgorICAgICMgICAgIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+aG1icmFuZC9UZXh0LUNTVl9YUy9NQU5JRkVTVD4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICB1c2UgVGV4dDo6Q1NWX1hTOworICAgIAorICAgICMgQ2hlY2sgZm9yIHZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMKKyAgICBpZiAoKCQjQVJHViA8IDEpIHx8ICgkI0FSR1YgPiAyKSkgeworICAgICAgIGRpZSgiVXNhZ2U6IGNzdjJ4bHMgY3N2ZmlsZS50eHQgbmV3ZmlsZS54bHNcbiIpOworICAgIH07CisgICAgCisgICAgIyBPcGVuIHRoZSBDb21tYSBTZXBhcmF0ZWQgVmFyaWFibGUgZmlsZQorICAgIG9wZW4gKENTVkZJTEUsICRBUkdWWzBdKSBvciBkaWUgIiRBUkdWWzBdOiAkISI7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgRXhjZWwgd29ya2Jvb2sKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygkQVJHVlsxXSk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IENTViBwYXJzaW5nIG9iamVjdAorICAgIG15ICRjc3YgPSBUZXh0OjpDU1ZfWFMtPm5ldzsKKyAgICAKKyAgICAjIFJvdyBhbmQgY29sdW1uIGFyZSB6ZXJvIGluZGV4ZWQKKyAgICBteSAkcm93ID0gMDsKKyAgICAKKyAgICAKKyAgICB3aGlsZSAoPENTVkZJTEU+KSB7CisgICAgICAgIGlmICgkY3N2LT5wYXJzZSgkXykpIHsKKyAgICAgICAgICAgIG15IEBGbGQgPSAkY3N2LT5maWVsZHM7CisgICAgCisgICAgICAgICAgICBteSAkY29sID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggbXkgJHRva2VuIChARmxkKSB7CisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgJGNvbCwgJHRva2VuKTsKKyAgICAgICAgICAgICAgICAkY29sKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkcm93Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBteSAkZXJyID0gJGNzdi0+ZXJyb3JfaW5wdXQ7CisgICAgICAgICAgICBwcmludCAiVGV4dDo6Q1NWX1hTIHBhcnNlKCkgZmFpbGVkIG9uIGFyZ3VtZW50OiAiLCAkZXJyLCAiXG4iOworICAgICAgICB9CisgICAgfQorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jc3YyeGxzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdGFiMnhscy5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZQorCitUaGUgZm9sbG93aW5nIGNvbnZlcnRzIGEgdGFiIHNlcGFyYXRlZCBmaWxlIGludG8gYW4gRXhjZWwgZmlsZQorCitVc2FnZTogdGFiMnhscy5wbCB0YWJmaWxlLnR4dCBuZXdmaWxlLnhscworCisKK05PVEU6IFRoaXMgaXMgb25seSBhIHNpbXBsZSBjb252ZXJzaW9uIHV0aWxpdHkgZm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3Nlcy4KK0ZvciBjb252ZXJ0aW5nIGEgQ1NWIG9yIFRhYiBzZXBhcmF0ZWQgb3IgYW55IG90aGVyIHR5cGUgb2YgZGVsaW1pdGVkCit0ZXh0IGZpbGUgdG8gRXhjZWwgSSByZWNvbW1lbmQgdGhlIG1vcmUgcmlnb3JvdXMgY3N2MnhscyBwcm9ncmFtIHRoYXQgaXMKK3BhcnQgb2YgSC5NZXJpam4gQnJhbmQncyBUZXh0OjpDU1ZfWFMgbW9kdWxlIGRpc3Ryby4KKworU2VlIHRoZSBleGFtcGxlcy9jc3YyeGxzIGxpbmsgaGVyZToKKyAgICBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfmhtYnJhbmQvVGV4dC1DU1ZfWFMvTUFOSUZFU1Q+CisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgV3JpdGVFeGNlbCBtb2R1bGUKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGNvbnZlcnRzIGEgdGFiIHNlcGFyYXRlZCBmaWxlIGludG8gYW4gRXhjZWwgZmlsZQorICAgICMKKyAgICAjIFVzYWdlOiB0YWIyeGxzLnBsIHRhYmZpbGUudHh0IG5ld2ZpbGUueGxzCisgICAgIworICAgICMKKyAgICAjIE5PVEU6IFRoaXMgaXMgb25seSBhIHNpbXBsZSBjb252ZXJzaW9uIHV0aWxpdHkgZm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3Nlcy4KKyAgICAjIEZvciBjb252ZXJ0aW5nIGEgQ1NWIG9yIFRhYiBzZXBhcmF0ZWQgb3IgYW55IG90aGVyIHR5cGUgb2YgZGVsaW1pdGVkCisgICAgIyB0ZXh0IGZpbGUgdG8gRXhjZWwgSSByZWNvbW1lbmQgdGhlIG1vcmUgcmlnb3JvdXMgY3N2MnhscyBwcm9ncmFtIHRoYXQgaXMKKyAgICAjIHBhcnQgb2YgSC5NZXJpam4gQnJhbmQncyBUZXh0OjpDU1ZfWFMgbW9kdWxlIGRpc3Ryby4KKyAgICAjCisgICAgIyBTZWUgdGhlIGV4YW1wbGVzL2NzdjJ4bHMgbGluayBoZXJlOgorICAgICMgICAgIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+aG1icmFuZC9UZXh0LUNTVl9YUy9NQU5JRkVTVD4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICAjIENoZWNrIGZvciB2YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzCisgICAgaWYgKCgkI0FSR1YgPCAxKSB8fCAoJCNBUkdWID4gMikpIHsKKyAgICAgICAgZGllKCJVc2FnZTogdGFiMnhscyB0YWJmaWxlLnR4dCBuZXdmaWxlLnhsc1xuIik7CisgICAgfTsKKyAgICAKKyAgICAKKyAgICAjIE9wZW4gdGhlIHRhYiBkZWxpbWl0ZWQgZmlsZQorICAgIG9wZW4gKFRBQkZJTEUsICRBUkdWWzBdKSBvciBkaWUgIiRBUkdWWzBdOiAkISI7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgRXhjZWwgd29ya2Jvb2sKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygkQVJHVlsxXSk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICMgUm93IGFuZCBjb2x1bW4gYXJlIHplcm8gaW5kZXhlZAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8VEFCRklMRT4pIHsKKyAgICAgICAgY2hvbXA7CisgICAgICAgICMgU3BsaXQgb24gc2luZ2xlIHRhYgorICAgICAgICBteSBARmxkID0gc3BsaXQoJ1x0JywgJF8pOworICAgIAorICAgICAgICBteSAkY29sID0gMDsKKyAgICAgICAgZm9yZWFjaCBteSAkdG9rZW4gKEBGbGQpIHsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csICRjb2wsICR0b2tlbik7CisgICAgICAgICAgICAkY29sKys7CisgICAgICAgIH0KKyAgICAgICAgJHJvdysrOworICAgIH0KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdGFiMnhscy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGRhdGVjYWxjMS5wbAorCisKKworTk9URTogQW4gZWFzaWVyIHdheSBvZiB3cml0aW5nIGRhdGVzIGFuZCB0aW1lcyBpcyB0byB1c2UgdGhlIG5ld2VyCisgICAgICB3cml0ZV9kYXRlX3RpbWUoKSBXb3Jrc2hlZXQgbWV0aG9kLiBTZWUgdGhlIGRhdGVfdGltZS5wbCBleGFtcGxlLgorCisKKworRGVtb25zdHJhdGlvbiBvZiB3cml0aW5nIGRhdGUvdGltZSBjZWxscyB0byBFeGNlbCBzcHJlYWRzaGVldHMsCit1c2luZyBVTklYL1BlcmwgdGltZSBhcyBzb3VyY2Ugb2YgZGF0ZS90aW1lLgorCisKKworVU5JWC9QZXJsIHRpbWUgaXMgdGhlIHRpbWUgc2luY2UgdGhlIEVwb2NoICgwMDowMDowMCBHTVQsIDEgSmFuIDE5NzApCittZWFzdXJlZCBpbiBzZWNvbmRzLgorCitBbiBFeGNlbCBmaWxlIGNhbiB1c2UgZXhhY3RseSBvbmUgb2YgdHdvIGRpZmZlcmVudCBkYXRlL3RpbWUgc3lzdGVtcy4KK0luIHRoZXNlIHN5c3RlbXMsIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBkYXlzCisoYW5kIGZyYWN0aW9uYWwgcGFydHMgb2YgdGhlIGRheSkgc2luY2UgYSBzdGFydCBwb2ludC4gVGhlIGZsb2F0aW5nIHBvaW50CitudW1iZXIgaXMgcmVmZXJyZWQgdG8gYXMgYSAnc2VyaWFsJy4KKworVGhlIHR3byBzeXN0ZW1zICgnMTkwMCcgYW5kICcxOTA0JykgdXNlIGRpZmZlcmVudCBzdGFydGluZyBwb2ludHM6CisKKyAnMTkwMCc7ICcxLjAwJyBpcyAxIEphbiAxOTAwIEJVVCAxOTAwIGlzIGVycm9uZW91c2x5IHJlZ2FyZGVkIGFzCisgICAgICAgICBhIGxlYXAgeWVhciAtIHNlZToKKyAgICAgICAgICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9zdXBwb3J0L2tiL2FydGljbGVzL1ExODEvMy83MC5hc3AKKyAgICAgICAgIGZvciB0aGUgZXhjdXNlXkheSF5IXkheSF5IcmVhc29uLgorICcxOTA0JzsgJzEuMDAnIGlzIDIgSmFuIDE5MDQuCisKK1RoZSAnMTkwNCcgc3lzdGVtIGlzIHRoZSBkZWZhdWx0IGZvciBBcHBsZSBNYWNzLiBXaW5kb3dzIHZlcnNpb25zIG9mCitFeGNlbCBoYXZlIHRoZSBvcHRpb24gdG8gdXNlIHRoZSAnMTkwNCcgc3lzdGVtLgorCitOb3RlIHRoYXQgVmlzdWFsIEJhc2ljJ3MgIkRhdGVTZXJpYWwiIGZ1bmN0aW9uIGRvZXMgTk9UIGVycm9uZW91c2x5CityZWdhcmQgMTkwMCBhcyBhIGxlYXAgeWVhciwgYW5kIHRodXMgaXRzIHNlcmlhbHMgZG8gbm90IGFncmVlIHdpdGgKK3RoZSAxOTAwIHNlcmlhbHMgb2YgRXhjZWwgZm9yIGRhdGVzIGJlZm9yZSAxIE1hciAxOTAwLgorCitOb3RlIHRoYXQgU3Rhck9mZmljZSAoYXQgbGVhc3QgYXQgdmVyc2lvbiA1LjIpIGRvZXMgTk9UIGVycm9uZW91c2x5CityZWdhcmQgMTkwMCBhcyBhIGxlYXAgeWVhciwgYW5kIHRodXMgaXRzIHNlcmlhbHMgZG8gbm90IGFncmVlIHdpdGgKK3RoZSAxOTAwIHNlcmlhbHMgb2YgRXhjZWwgZm9yIGRhdGVzIGJlZm9yZSAxIE1hciAxOTAwLgorCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgTk9URTogQW4gZWFzaWVyIHdheSBvZiB3cml0aW5nIGRhdGVzIGFuZCB0aW1lcyBpcyB0byB1c2UgdGhlIG5ld2VyCisgICAgIyAgICAgICB3cml0ZV9kYXRlX3RpbWUoKSBXb3Jrc2hlZXQgbWV0aG9kLiBTZWUgdGhlIGRhdGVfdGltZS5wbCBleGFtcGxlLgorICAgICMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGlvbiBvZiB3cml0aW5nIGRhdGUvdGltZSBjZWxscyB0byBFeGNlbCBzcHJlYWRzaGVldHMsCisgICAgIyB1c2luZyBVTklYL1BlcmwgdGltZSBhcyBzb3VyY2Ugb2YgZGF0ZS90aW1lLgorICAgICMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVU5JWC9QZXJsIHRpbWUgaXMgdGhlIHRpbWUgc2luY2UgdGhlIEVwb2NoICgwMDowMDowMCBHTVQsIDEgSmFuIDE5NzApCisgICAgIyBtZWFzdXJlZCBpbiBzZWNvbmRzLgorICAgICMKKyAgICAjIEFuIEV4Y2VsIGZpbGUgY2FuIHVzZSBleGFjdGx5IG9uZSBvZiB0d28gZGlmZmVyZW50IGRhdGUvdGltZSBzeXN0ZW1zLgorICAgICMgSW4gdGhlc2Ugc3lzdGVtcywgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGRheXMKKyAgICAjIChhbmQgZnJhY3Rpb25hbCBwYXJ0cyBvZiB0aGUgZGF5KSBzaW5jZSBhIHN0YXJ0IHBvaW50LiBUaGUgZmxvYXRpbmcgcG9pbnQKKyAgICAjIG51bWJlciBpcyByZWZlcnJlZCB0byBhcyBhICdzZXJpYWwnLgorICAgICMKKyAgICAjIFRoZSB0d28gc3lzdGVtcyAoJzE5MDAnIGFuZCAnMTkwNCcpIHVzZSBkaWZmZXJlbnQgc3RhcnRpbmcgcG9pbnRzOgorICAgICMKKyAgICAjICAnMTkwMCc7ICcxLjAwJyBpcyAxIEphbiAxOTAwIEJVVCAxOTAwIGlzIGVycm9uZW91c2x5IHJlZ2FyZGVkIGFzCisgICAgIyAgICAgICAgICBhIGxlYXAgeWVhciAtIHNlZToKKyAgICAjICAgICAgICAgICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9zdXBwb3J0L2tiL2FydGljbGVzL1ExODEvMy83MC5hc3AKKyAgICAjICAgICAgICAgIGZvciB0aGUgZXhjdXNlXkheSF5IXkheSF5IcmVhc29uLgorICAgICMgICcxOTA0JzsgJzEuMDAnIGlzIDIgSmFuIDE5MDQuCisgICAgIworICAgICMgVGhlICcxOTA0JyBzeXN0ZW0gaXMgdGhlIGRlZmF1bHQgZm9yIEFwcGxlIE1hY3MuIFdpbmRvd3MgdmVyc2lvbnMgb2YKKyAgICAjIEV4Y2VsIGhhdmUgdGhlIG9wdGlvbiB0byB1c2UgdGhlICcxOTA0JyBzeXN0ZW0uCisgICAgIworICAgICMgTm90ZSB0aGF0IFZpc3VhbCBCYXNpYydzICJEYXRlU2VyaWFsIiBmdW5jdGlvbiBkb2VzIE5PVCBlcnJvbmVvdXNseQorICAgICMgcmVnYXJkIDE5MDAgYXMgYSBsZWFwIHllYXIsIGFuZCB0aHVzIGl0cyBzZXJpYWxzIGRvIG5vdCBhZ3JlZSB3aXRoCisgICAgIyB0aGUgMTkwMCBzZXJpYWxzIG9mIEV4Y2VsIGZvciBkYXRlcyBiZWZvcmUgMSBNYXIgMTkwMC4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgU3Rhck9mZmljZSAoYXQgbGVhc3QgYXQgdmVyc2lvbiA1LjIpIGRvZXMgTk9UIGVycm9uZW91c2x5CisgICAgIyByZWdhcmQgMTkwMCBhcyBhIGxlYXAgeWVhciwgYW5kIHRodXMgaXRzIHNlcmlhbHMgZG8gbm90IGFncmVlIHdpdGgKKyAgICAjIHRoZSAxOTAwIHNlcmlhbHMgb2YgRXhjZWwgZm9yIGRhdGVzIGJlZm9yZSAxIE1hciAxOTAwLgorICAgICMKKyAgICAKKyAgICAjIENvcHlyaWdodCAyMDAwLCBBbmRyZXcgQmVuaGFtLCBhZHNiQGJpZ2Zvb3QuY29tCisgICAgIworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBDYWxjdWxhdGlvbiBkZXNjcmlwdGlvbgorICAgICMgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjCisgICAgIyAxOTAwIHN5c3RlbQorICAgICMgLS0tLS0tLS0tLS0KKyAgICAjIFVuaXggdGltZSBpcyAnMCcgYXQgMDA6MDA6MDAgR01UIDEgSmFuIDE5NzAsIGkuZS4gNzAgeWVhcnMgYWZ0ZXIgMSBKYW4gMTkwMC4KKyAgICAjIE9mIHRob3NlIDcwIHllYXJzLCAxNyAoMTkwNCwwOCwxMiwxNiwyMCwyNCwyOCwzMiwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NCw2OCkKKyAgICAjIHdlcmUgbGVhcCB5ZWFycyB3aXRoIGFuIGV4dHJhIGRheS4KKyAgICAjIFRodXMgdGhlcmUgd2VyZSAxNyArIDcwKjM2NSBkYXlzID0gMjU1NjcgZGF5cyBiZXR3ZWVuIDEgSmFuIDE5MDAgYW5kCisgICAgIyAxIEphbiAxOTcwLgorICAgICMgSW4gdGhlIDE5MDAgc3lzdGVtLCAnMScgaXMgMSBKYW4gMTkwMCwgYnV0IGFzIDE5MDAgd2FzIG5vdCBhIGxlYXAgeWVhcgorICAgICMgMSBKYW4gMTkwMCBzaG91bGQgcmVhbGx5IGJlICcyJywgc28gMSBKYW4gMTk3MCBpcyAnMjU1NjknLgorICAgICMKKyAgICAjIDE5MDQgc3lzdGVtCisgICAgIyAtLS0tLS0tLS0tLQorICAgICMgVW5peCB0aW1lIGlzICcwJyBhdCAwMDowMDowMCBHTVQgMSBKYW4gMTk3MCwgaS5lLiA2NiB5ZWFycyBhZnRlciAxIEphbiAxOTA0LgorICAgICMgT2YgdGhvc2UgNjYgeWVhcnMsIDE3ICgxOTA0LDA4LDEyLDE2LDIwLDI0LDI4LDMyLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0LDY4KQorICAgICMgd2VyZSBsZWFwIHllYXJzIHdpdGggYW4gZXh0cmEgZGF5LgorICAgICMgVGh1cyB0aGVyZSB3ZXJlIDE3ICsgNjYqMzY1IGRheXMgPSAyNDEwNyBkYXlzIGJldHdlZW4gMSBKYW4gMTkwNCBhbmQKKyAgICAjIDEgSmFuIDE5NzAuCisgICAgIyBJbiB0aGUgMTkwNCBzeXN0ZW0sIDIgSmFuIDE5MDQgYmVpbmcgJzEnLCAxIEphbiAxOTcwIGlzICcyNDEwNycuCisgICAgIworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBDb3B5cmlnaHQgKGMpIDIwMDAsIEFuZHJldyBCZW5oYW0uCisgICAgIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yCisgICAgIyBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKyAgICAjCisgICAgIyBBbmRyZXcgQmVuaGFtLCBhZHNiQGJpZ2Zvb3QuY29tCisgICAgIyBMb25kb24sIFVuaXRlZCBLaW5nZG9tCisgICAgIyAxMSBOb3YgMjAwMAorICAgICMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgdXNlIFRpbWU6OkxvY2FsOworICAgIAorICAgIHVzZSB2YXJzIHF3LyREQVRFX1NZU1RFTS87CisgICAgCisgICAgIyBVc2UgMTkwMCBkYXRlIHN5c3RlbSBvbiBhbGwgcGxhdGZvcm1zIG90aGVyIHRoYW4gQXBwbGUgTWFjIChmb3Igd2hpY2gKKyAgICAjIHVzZSAxOTA0IGRhdGUgc3lzdGVtKS4KKyAgICAkREFURV9TWVNURU0gPSAoJF5PIGVxICdNYWNPUycpID8gMSA6IDA7CisgICAgCisgICAgbXkgJHdvcmtib29rID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiZGF0ZXMueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIG15ICRmb3JtYXRfZGF0ZSA9ICAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0X2RhdGUtPnNldF9udW1fZm9ybWF0KCdkIG1tbW0geXl5Jyk7CisgICAgCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLDEsMjEpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZyAoMCwwLCJUaGUgZXBvY2ggKEdNVCkiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9udW1iZXIgKDAsMSwmY2FsY19zZXJpYWwoMCwxKSwweDE2KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcgKDEsMCwiVGhlIGVwb2NoIChsb2NhbHRpbWUpIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfbnVtYmVyICgxLDEsJmNhbGNfc2VyaWFsKDAsMCksMHgxNik7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nICgyLDAsIlRvZGF5Iik7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfbnVtYmVyICgyLDEsJmNhbGNfc2VyaWFsKCksJGZvcm1hdF9kYXRlKTsKKyAgICAKKyAgICBteSAkY2hyaXN0bWFzMjAwMCA9IHRpbWVsb2NhbCgwLDAsMCwyNSwxMSwxMDApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZyAoMywwLCJDaHJpc3RtYXMgMjAwMCIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX251bWJlciAoMywxLCZjYWxjX3NlcmlhbCgkY2hyaXN0bWFzMjAwMCksJGZvcm1hdF9kYXRlKTsKKyAgICAKKyAgICAkd29ya2Jvb2stPmNsb3NlKCk7CisgICAgCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjYWxjX3NlcmlhbCgpCisgICAgIworICAgICMgQ2FsbGVkIHdpdGggKHVwIHRvKSAyIHBhcmFtZXRlcnMuCisgICAgIyAgIDEuICBVbml4IHRpbWVzdGFtcC4gIElmIG9taXR0ZWQsIHVzZXMgY3VycmVudCB0aW1lLgorICAgICMgICAyLiAgR01UIGZsYWcuIFNldCB0byAnMScgdG8gcmV0dXJuIHNlcmlhbCBpbiBHTVQuCisgICAgIyAgICAgICBJZiBvbWl0dGVkLCByZXR1cm5zIHNlcmlhbCBpbiBhcHByb3ByaWF0ZSB0aW1lem9uZS4KKyAgICAjCisgICAgIyBSZXR1cm5zIGRhdGUvdGltZSBzZXJpYWwgYWNjb3JkaW5nIHRvICREQVRFX1NZU1RFTSBzZWxlY3RlZAorICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHN1YiBjYWxjX3NlcmlhbCB7CisgICAgCW15ICR0aW1lID0gKGRlZmluZWQgJF9bMF0pID8gJF9bMF0gOiB0aW1lKCk7CisgICAgCW15ICRnbXRmbGFnID0gKGRlZmluZWQgJF9bMV0pID8gJF9bMV0gOiAwOworICAgIAorICAgIAkjIERpdmlkZSB0aW1lc3RhbXAgYnkgbnVtYmVyIG9mIHNlY29uZHMgaW4gYSBkYXkuCisgICAgCSMgVGhpcyBnaXZlcyBhIGRhdGUgc2VyaWFsIHdpdGggJzAnIG9uIDEgSmFuIDE5NzAuCisgICAgCW15ICRzZXJpYWwgPSAkdGltZSAvIDg2NDAwOworICAgIAorICAgIAkjIEFkanVzdCB0aGUgZGF0ZSBzZXJpYWwgYnkgdGhlIG9mZnNldCBhcHByb3ByaWF0ZSB0byB0aGUKKyAgICAJIyBjdXJyZW50bHkgc2VsZWN0ZWQgc3lzdGVtICgxOTAwLzE5MDQpLgorICAgIAlpZiAoJERBVEVfU1lTVEVNID09IDApIHsJIyB1c2UgMTkwMCBzeXN0ZW0KKyAgICAJCSRzZXJpYWwgKz0gMjU1Njk7CisgICAgCX0gZWxzZSB7CQkJIyB1c2UgMTkwNCBzeXN0ZW0KKyAgICAJCSRzZXJpYWwgKz0gMjQxMDc7CisgICAgCX0KKyAgICAKKyAgICAJdW5sZXNzICgkZ210ZmxhZykgeworICAgIAkJIyBOb3cgaGF2ZSBhICdyYXcnIHNlcmlhbCB3aXRoIHRoZSByaWdodCBvZmZzZXQuIEJ1dCB0aGlzCisgICAgCQkjIGdpdmVzIGEgc2VyaWFsIGluIEdNVCwgd2hpY2ggaXMgZmFsc2UgdW5sZXNzIHRoZSB0aW1lem9uZQorICAgIAkJIyBpcyBHTVQuIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzZXJpYWwgYnkgdGhlIGFwcHJvcHJpYXRlCisgICAgCQkjIHRpbWV6b25lIG9mZnNldC4KKyAgICAJCSMgQ2FsY3VsYXRlIHRoZSBhcHByb3ByaWF0ZSB0aW1lem9uZSBvZmZzZXQgYnkgc2VlaW5nIHdoYXQKKyAgICAJCSMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gbG9jYWx0aW1lIGFuZCBnbXRpbWUgZm9yIHRoZSBnaXZlbgorICAgIAkJIyB0aW1lIGFyZS4KKyAgICAKKyAgICAJCW15IEBnbXRpbWUgPSBnbXRpbWUoJHRpbWUpOworICAgIAkJbXkgQGx0aW1lICA9IGxvY2FsdGltZSgkdGltZSk7CisgICAgCisgICAgCQkjIEZvciB0aGUgZmlyc3QgNyBlbGVtZW50cyBvZiB0aGUgdHdvIGFycmF5cywgYWRqdXN0IHRoZQorICAgIAkJIyBkYXRlIHNlcmlhbCB3aGVyZSB0aGUgZWxlbWVudHMgZGlmZmVyLgorICAgIAkJZm9yICgwIC4uIDYpIHsKKyAgICAJCQlteSAkZGlmZiA9ICRsdGltZVskX10gLSAkZ210aW1lWyRfXTsKKyAgICAJCQlpZiAoJGRpZmYpIHsKKyAgICAJCQkJJHNlcmlhbCArPSBfYWRqdXN0bWVudCgkZGlmZiwkXyk7CisgICAgCQkJfQorICAgIAkJfQorICAgIAl9CisgICAgCisgICAgCSMgUGVycGV0dWF0ZSB0aGUgZXJyb3IgdGhhdCAxOTAwIHdhcyBhIGxlYXAgeWVhciBieSBkZWNyZW1lbnRpbmcKKyAgICAJIyB0aGUgc2VyaWFsIGlmIHdlJ3JlIHVzaW5nIHRoZSAxOTAwIHN5c3RlbSBhbmQgdGhlIGRhdGUgaXMgcHJpb3IgdG8KKyAgICAJIyAxIE1hciAxOTAwLiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIG1ha2luZyBzZXJpYWwgdmFsdWUgJzYwJworICAgIAkjIDI5IEZlYiAxOTAwLgorICAgIAorICAgIAkjIFRoaXMgZml4IG9ubHkgaGFzIGFueSBlZmZlY3QgaWYgVU5JWC9QZXJsIHRpbWUgb24gdGhlIHBsYXRmb3JtCisgICAgCSMgY2FuIHJlcHJlc2VudCAxOTAwLiBNYW55IGNhbid0LgorICAgIAorICAgIAl1bmxlc3MgKCREQVRFX1NZU1RFTSkgeworICAgIAkJJHNlcmlhbC0tIGlmICgkc2VyaWFsIDwgNjEpOwkjICc2MScgaXMgMSBNYXIgMTkwMAorICAgIAl9CisgICAgCXJldHVybiAkc2VyaWFsOworICAgIH0KKyAgICAKKyAgICBzdWIgX2FkanVzdG1lbnQgeworICAgIAkjIEJhc2VkIG9uIHRoZSBkaWZmZXJlbmNlIGluIHRoZSBsb2NhbHRpbWUvZ210aW1lIGFycmF5IGVsZW1lbnRzCisgICAgCSMgbnVtYmVyLCByZXR1cm4gdGhlIGFkanVzdG1lbnQgcmVxdWlyZWQgdG8gdGhlIHNlcmlhbC4KKyAgICAKKyAgICAJIyBXZSBvbmx5IGxvb2sgYXQgc29tZSBlbGVtZW50cyBvZiB0aGUgbG9jYWx0aW1lL2dtdGltZSBhcnJheXM6CisgICAgCSMgICAgc2Vjb25kcyAgICB1bmxpa2VseSB0byBiZSBkaWZmZXJlbnQgYXMgYWxsIGtub3duIHRpbWV6b25lcworICAgIAkjICAgICAgICAgICAgICAgaGF2ZSBhbiBvZmZzZXQgb2YgaW50ZWdyYWwgbXVsdGlwbGVzIG9mIDE1IG1pbnV0ZXMsCisgICAgCSMJCWJ1dCBpdCdzIGVhc3kgdG8gZG8uCisgICAgCSMgICAgbWludXRlcyAgICB3aWxsIGJlIGRpZmZlcmVudCBmb3IgdGltZXpvbmUgb2Zmc2V0cyB3aGljaCBhcmUKKyAgICAJIwkJbm90IGFuIGV4YWN0IG51bWJlciBvZiBob3Vycy4KKyAgICAJIyAgICBob3Vycwl2ZXJ5IGxpa2VseSB0byBiZSBkaWZmZXJlbnQuCisgICAgCSMgICAgd2Vla2RheQl3aWxsIGRpZmZlciB3aGVuIGxvY2FsdGltZS9nbXRpbWUgZGlmZmVyZW5jZQorICAgIAkjCQlzdHJhZGRsZXMgbWlkbmlnaHQuCisgICAgCSMKKyAgICAJIyBBc3N1bWUgdGhhdCBkaWZmZXJlbmNlIGJldHdlZW4gbG9jYWx0aW1lIGFuZCBnbXRpbWUgaXMgbGVzcyB0aGFuCisgICAgCSMgNSBkYXlzLCB0aGVuIGRvbid0IGhhdmUgdG8gZG8gbWF0aHMgZm9yIGRheSBvZiBtb250aCwgbW9udGggbnVtYmVyLAorICAgIAkjIHllYXIgbnVtYmVyLCBldGMuLi4KKyAgICAKKyAgICAJbXkgKCRkZWx0YSwkZWxlbWVudCkgPSBAXzsKKyAgICAJbXkgJGFkanVzdCA9IDA7CisgICAgCisgICAgCWlmICgkZWxlbWVudCA9PSAwKSB7CQkjIFNlY29uZHMKKyAgICAJCSRhZGp1c3QgPSAkZGVsdGEvODY0MDA7CQkjIDYwICogNjAgKiAyNAorICAgIAl9IGVsc2lmICgkZWxlbWVudCA9PSAxKSB7CSMgTWludXRlcworICAgIAkJJGFkanVzdCA9ICRkZWx0YS8xNDQwOwkJIyA2MCAqIDI0CisgICAgCX0gZWxzaWYgKCRlbGVtZW50ID09IDIpIHsJIyBIb3VycworICAgIAkJJGFkanVzdCA9ICRkZWx0YS8yNDsJCSMgMjQKKyAgICAJfSBlbHNpZiAoJGVsZW1lbnQgPT0gNikgewkjIERheSBvZiB3ZWVrIG51bWJlcgorICAgIAkJIyBDYXRjaCBkaWZmZXJlbmNlIHN0cmFkZGxpbmcgU2F0L1N1biBpbiBlaXRoZXIgZGlyZWN0aW9uCisgICAgCQkkZGVsdGEgKz0gNyBpZiAoJGRlbHRhIDwgLTQpOworICAgIAkJJGRlbHRhIC09IDcgaWYgKCRkZWx0YSA+IDQpOworICAgIAorICAgIAkJJGFkanVzdCA9ICRkZWx0YTsKKyAgICAJfQorICAgIAlyZXR1cm4gJGFkanVzdDsKKyAgICB9CisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2RhdGVjYWxjMS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGRhdGVjYWxjMi5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNpbmcgdGhlIERhdGU6OkNhbGMgbW9kdWxlIHRvIGNhbGN1bGF0ZSBFeGNlbCBkYXRlcy4KKworTk9URTogQW4gZWFzaWVyIHdheSBvZiB3cml0aW5nIGRhdGVzIGFuZCB0aW1lcyBpcyB0byB1c2UgdGhlIG5ld2VyCisgICAgICB3cml0ZV9kYXRlX3RpbWUoKSBXb3Jrc2hlZXQgbWV0aG9kLiBTZWUgdGhlIGRhdGVfdGltZS5wbCBleGFtcGxlLgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2luZyB0aGUgRGF0ZTo6Q2FsYyBtb2R1bGUgdG8gY2FsY3VsYXRlIEV4Y2VsIGRhdGVzLgorICAgICMKKyAgICAjIE5PVEU6IEFuIGVhc2llciB3YXkgb2Ygd3JpdGluZyBkYXRlcyBhbmQgdGltZXMgaXMgdG8gdXNlIHRoZSBuZXdlcgorICAgICMgICAgICAgd3JpdGVfZGF0ZV90aW1lKCkgV29ya3NoZWV0IG1ldGhvZC4gU2VlIHRoZSBkYXRlX3RpbWUucGwgZXhhbXBsZS4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEp1bmUgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIHVzZSBEYXRlOjpDYWxjIHF3KERlbHRhX0RITVMpOyAjIFlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIHRoaXMgbW9kdWxlLgorICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJleGNlbF9kYXRlMi54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBFeHBhbmQgdGhlIGZpcnN0IGNvbHVtbiBzbyB0aGF0IHRoZSBkYXRlIGlzIHZpc2libGUuCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigiQTpBIiwgMjUpOworICAgIAorICAgIAorICAgICMgQWRkIGEgZm9ybWF0IGZvciB0aGUgZGF0ZQorICAgIG15ICRmb3JtYXQgPSAgJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X251bV9mb3JtYXQoJ2QgbW1tbSB5eXkgSEg6TU06U1MnKTsKKyAgICAKKyAgICAKKyAgICBteSAkZGF0ZTsKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgZGF0ZXMgYW5kIHRpbWVzCisgICAgJGRhdGUgPSAgZXhjZWxfZGF0ZSgxOTAwLCAxLCAxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgiQTEiLCAkZGF0ZSwgJGZvcm1hdCk7CisgICAgCisgICAgJGRhdGUgPSAgZXhjZWxfZGF0ZSgyMDAwLCAxLCAxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgiQTIiLCAkZGF0ZSwgJGZvcm1hdCk7CisgICAgCisgICAgJGRhdGUgPSAgZXhjZWxfZGF0ZSgyMDAwLCA0LCAxNywgMTQsIDMzLCAxNSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoIkEzIiwgJGRhdGUsICRmb3JtYXQpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBleGNlbF9kYXRlKCR5ZWFycywgJG1vbnRocywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKQorICAgICMKKyAgICAjIENyZWF0ZSBhbiBFeGNlbCBkYXRlIGluIHRoZSAxOTAwIGZvcm1hdC4gQWxsIG9mIHRoZSBhcmd1bWVudHMgYXJlIG9wdGlvbmFsCisgICAgIyBidXQgeW91IHNob3VsZCBhdCBsZWFzdCBhZGQgJHllYXJzLgorICAgICMKKyAgICAjIENvcnJlY3RzIGZvciBFeGNlbCdzIG1pc3NpbmcgbGVhcCBkYXkgaW4gMTkwMC4gU2VlIGV4Y2VsX3RpbWUxLnBsIGZvciBhbgorICAgICMgZXhwbGFuYXRpb24uCisgICAgIworICAgIHN1YiBleGNlbF9kYXRlIHsKKyAgICAKKyAgICAgICAgbXkgJHllYXJzICAgPSAkX1swXSB8fCAxOTAwOworICAgICAgICBteSAkbW9udGhzICA9ICRfWzFdIHx8IDE7CisgICAgICAgIG15ICRkYXlzICAgID0gJF9bMl0gfHwgMTsKKyAgICAgICAgbXkgJGhvdXJzICAgPSAkX1szXSB8fCAwOworICAgICAgICBteSAkbWludXRlcyA9ICRfWzRdIHx8IDA7CisgICAgICAgIG15ICRzZWNvbmRzID0gJF9bNV0gfHwgMDsKKyAgICAKKyAgICAgICAgbXkgQGRhdGUgPSAoJHllYXJzLCAkbW9udGhzLCAkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpOworICAgICAgICBteSBAZXBvY2ggPSAoMTg5OSwgMTIsIDMxLCAwLCAwLCAwKTsKKyAgICAKKyAgICAgICAgKCRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcykgPSBEZWx0YV9ESE1TKEBlcG9jaCwgQGRhdGUpOworICAgIAorICAgICAgICBteSAkZGF0ZSA9ICRkYXlzICsgKCRob3VycyozNjAwICskbWludXRlcyo2MCArJHNlY29uZHMpLygyNCo2MCo2MCk7CisgICAgCisgICAgICAgICMgQWRkIGEgZGF5IGZvciBFeGNlbCdzIG1pc3NpbmcgbGVhcCBkYXkgaW4gMTkwMAorICAgICAgICAkZGF0ZSsrIGlmICgkZGF0ZSA+IDU5KTsKKyAgICAKKyAgICAgICAgcmV0dXJuICRkYXRlOworICAgIH0KKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgZXhjZWxfZGF0ZSgkeWVhcnMsICRtb250aHMsICRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcykKKyAgICAjCisgICAgIyBDcmVhdGUgYW4gRXhjZWwgZGF0ZSBpbiB0aGUgMTkwNCBmb3JtYXQuIEFsbCBvZiB0aGUgYXJndW1lbnRzIGFyZSBvcHRpb25hbAorICAgICMgYnV0IHlvdSBzaG91bGQgYXQgbGVhc3QgYWRkICR5ZWFycy4KKyAgICAjCisgICAgIyBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gY2FsbCAkd29ya2Jvb2stPnNldF8xOTA0KCkgZm9yIHRoaXMgZm9ybWF0IHRvIGJlIHZhbGlkLgorICAgICMKKyAgICBzdWIgZXhjZWxfZGF0ZV8xOTA0IHsKKyAgICAKKyAgICAgICAgbXkgJHllYXJzICAgPSAkX1swXSB8fCAxOTAwOworICAgICAgICBteSAkbW9udGhzICA9ICRfWzFdIHx8IDE7CisgICAgICAgIG15ICRkYXlzICAgID0gJF9bMl0gfHwgMTsKKyAgICAgICAgbXkgJGhvdXJzICAgPSAkX1szXSB8fCAwOworICAgICAgICBteSAkbWludXRlcyA9ICRfWzRdIHx8IDA7CisgICAgICAgIG15ICRzZWNvbmRzID0gJF9bNV0gfHwgMDsKKyAgICAKKyAgICAgICAgbXkgQGRhdGUgPSAoJHllYXJzLCAkbW9udGhzLCAkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpOworICAgICAgICBteSBAZXBvY2ggPSAoMTkwNCwgMSwgMSwgMCwgMCwgMCk7CisgICAgCisgICAgICAgICgkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpID0gRGVsdGFfREhNUyhAZXBvY2gsIEBkYXRlKTsKKyAgICAKKyAgICAgICAgbXkgJGRhdGUgPSAkZGF5cyArICgkaG91cnMqMzYwMCArJG1pbnV0ZXMqNjAgKyRzZWNvbmRzKS8oMjQqNjAqNjApOworICAgIAorICAgICAgICByZXR1cm4gJGRhdGU7CisgICAgfQorICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9kYXRlY2FsYzIucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBsZWN4ZS5wbAorCisKK1V0aWxpdHkgcHJvZ3JhbSB0byBjb252ZXJ0IGFuIEV4Y2VsIGZpbGUgaW50byBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCitwcm9ncmFtIHVzaW5nIFdpbjMyOjpPTEUKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIworICAgICMgVXRpbGl0eSBwcm9ncmFtIHRvIGNvbnZlcnQgYW4gRXhjZWwgZmlsZSBpbnRvIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyAgICAjIHByb2dyYW0gdXNpbmcgV2luMzI6Ok9MRQorICAgICMKKyAgICAKKyAgICAjCisgICAgIyBsZWN4ZSBwcm9ncmFtCisgICAgIyBieSB0MG1hc0BuZXRsb3Jkcy5uZXQKKyAgICAjCisgICAgIyBWZXJzaW9uICAwLjAxYSAgICBJbml0aWFsIHJlbGVhc2UgKGFscGhhKQorICAgIAorICAgIAorICAgICMgTW9kdWxlcworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFdpbjMyOjpPTEU7CisgICAgdXNlIFdpbjMyOjpPTEU6OkNvbnN0OworICAgIHVzZSBHZXRvcHQ6OlN0ZDsKKyAgICAKKyAgICAKKyAgICAjIFZhcnMKKyAgICB1c2UgdmFycyBxdyglb3B0cyk7CisgICAgCisgICAgCisgICAgIyBHZXQgb3B0aW9ucworICAgIGdldG9wdHMoJ2k6bzp2JyxcJW9wdHMpOworICAgIAorICAgIAorICAgICMgTm90IGVub3VnaCBvcHRpb25zCisgICAgZXhpdCAmdXNhZ2UgdW5sZXNzICgkb3B0c3tpfSAmJiAkb3B0c3tvfSk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgRXhjZWwgb2JqZWN0CisgICAgbXkgJEV4Y2VsID0gbmV3IFdpbjMyOjpPTEUoIkV4Y2VsLkFwcGxpY2F0aW9uIiwiUXVpdCIpIG9yCisgICAgICAgICAgICBkaWUgIkNhbid0IHN0YXJ0IGV4Y2VsOiAkISI7CisgICAgCisgICAgCisgICAgIyBHZXQgY29uc3RhbnRzCisgICAgbXkgJEV4Y2VsQ29uc3Q9V2luMzI6Ok9MRTo6Q29uc3QtPkxvYWQoIk1pY3Jvc29mdCBFeGNlbCIpOworICAgIAorICAgIAorICAgICMgU2hvdyBFeGNlbAorICAgICRFeGNlbC0+e1Zpc2libGV9ID0gMSBpZiAoJG9wdHN7dn0pOworICAgIAorICAgIAorICAgICMgT3BlbiBpbmZpbGUKKyAgICBteSAkV29ya2Jvb2sgPSAkRXhjZWwtPldvcmtib29rcy0+T3Blbih7RmlsZW5hbWU9PiRvcHRze2l9fSk7CisgICAgCisgICAgCisgICAgIyBPcGVuIG91dGZpbGUKKyAgICBvcGVuIChPVVRGSUxFLCI+JG9wdHN7b30iKSBvciBkaWUgIkNhbid0IG9wZW4gb3V0ZmlsZSAkb3B0c3tvfTogJCEiOworICAgIAorICAgIAorICAgICMgUHJpbnQgaGVhZGVyIGZvciBvdXRmaWxlCisgICAgcHJpbnQgT1VURklMRSA8PCdFT0gnOworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIHVzZSB2YXJzIHF3KCR3b3JrYm9vayAld29ya3NoZWV0cyAlZm9ybWF0cyk7CisgICAgCisgICAgCisgICAgJHdvcmtib29rID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiX2NoYW5nZV9tZV8ueGxzIik7CisgICAgCisgICAgCisgICAgRU9ICisgICAgCisgICAgCisgICAgIyBMb29wIGFsbCBzaGVldHMKKyAgICBmb3JlYWNoIG15ICRzaGVldG51bSAoMS4uJEV4Y2VsLT5Xb3JrYm9va3MoMSktPldvcmtzaGVldHMtPkNvdW50KSB7CisgICAgCisgICAgCisgICAgICAgICAgICAjIEZvcm1hdCBzaGVldAorICAgICAgICAgICAgbXkgJG5hbWU9JEV4Y2VsLT5Xb3JrYm9va3MoMSktPldvcmtzaGVldHMoJHNoZWV0bnVtKS0+TmFtZTsKKyAgICAgICAgICAgIHByaW50ICJTaGVldCAkbmFtZVxuIiBpZiAoJG9wdHN7dn0pOworICAgICAgICAgICAgcHJpbnQgT1VURklMRSAiIyBTaGVldCAkbmFtZVxuIjsKKyAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIlwkd29ya3NoZWV0c3snJG5hbWUnfSA9IFwkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJyRuYW1lJyk7XG4iOworICAgIAorICAgIAorICAgICAgICAgICAgIyBHZXQgdXNlZHJhbmdlIG9mIGNlbGxzIGluIHdvcmtzaGVldAorICAgICAgICAgICAgbXkgJHVzZWRyYW5nZT0kRXhjZWwtPldvcmtib29rcygxKS0+V29ya3NoZWV0cygkc2hlZXRudW0pLT5Vc2VkUmFuZ2U7CisgICAgCisgICAgCisgICAgICAgICAgICAjIExvb3AgYWxsIGNvbHVtbnMgaW4gdXNlZCByYW5nZQorICAgICAgICAgICAgZm9yZWFjaCBteSAkaiAoMS4uJHVzZWRyYW5nZS0+Q29sdW1ucy0+Q291bnQpeworICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICAjIEZvcm1hdCBjb2x1bW4KKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkNvbCAkalxuIiBpZiAoJG9wdHN7dn0pOworICAgICAgICAgICAgICAgICAgICBteSAoJGNvbHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgJGNvbHdpZHRoPSR1c2VkcmFuZ2UtPkNvbHVtbnMoJGopLT5Db2x1bW5XaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgT1VURklMRSAiIyBDb2x1bW4gJGpcbiI7CisgICAgICAgICAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIlwkd29ya3NoZWV0c3snJG5hbWUnfS0+c2V0X2NvbHVtbigiLigkai0xKS4iLCIuKCRqLTEpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICRjb2x3aWR0aCk7XG4iOworICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICAjIExvb3AgYWxsIHJvd3MgaW4gdXNlZCByYW5nZQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRpICgxLi4kdXNlZHJhbmdlLT5Sb3dzLT5Db3VudCl7CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3JtYXQgcm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlJvdyAkaVxuIiBpZiAoJG9wdHN7dn0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIiMgUm93ICRpXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICgkcm93aGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3doZWlnaHQ9JHVzZWRyYW5nZS0+Um93cygkaSktPlJvd0hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIlwkd29ya3NoZWV0c3snJG5hbWUnfS0+c2V0X3JvdygiLigkaS0xKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgJHJvd2hlaWdodCk7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gaWYgKCRqPT0xKTsKKyAgICAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IGNyZWF0aW5nIGNlbGwgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJGZuYW1lPSJcJGZvcm1hdHN7JyIuJG5hbWUuJ1InLiRpLidDJy4kai4iJ30iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRmb3JtYXQ9IiRmbmFtZT1cJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRwcmludF9mb3JtYXQ9MDsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBib3JkZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgQGJmbmFtZXM9cXcobGVmdCByaWdodCB0b3AgYm90dG9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRrICgxLi4kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPkJvcmRlcnMtPkNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkbHN0eWxlPSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+Qm9yZGVycygkayktPkxpbmVTdHlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbHN0eWxlID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+c2V0XyIuJGJmbmFtZXNbJGstMV0uIigkbHN0eWxlKTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgZm9udAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICgkZm9udGF0dHIsJHByb3AsJGZ1bmMsJWZvbnRzZXRzLCRmb250Q29sb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICVmb250c2V0cz0oTmFtZT0+J3NldF9mb250JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplPT4nc2V0X3NpemUnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCRwcm9wLCRmdW5jKSA9IGVhY2ggJWZvbnRzZXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9udGF0dHI9JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5Gb250LT4kcHJvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZm9udGF0dHIgbmUgIiIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPiRmdW5jKCckZm9udGF0dHInKTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWZvbnRzZXRzPShCb2xkPT4nc2V0X2JvbGQoMSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0YWxpYz0+J3NldF9pdGFsaWMoMSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuZGVybGluZT0+J3NldF91bmRlcmxpbmUoMSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlrZXRocm91Z2g9PidzZXRfc3RyaWtlb3V0KDEpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBlcnNjcmlwdD0+J3NldF9zY3JpcHQoMSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnNjcmlwdD0+J3NldF9zY3JpcHQoMiknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dGxpbmVGb250PT4nc2V0X291dGxpbmUoMSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRvdz0+J3NldF9zaGFkb3coMSknKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCRwcm9wLCRmdW5jKSA9IGVhY2ggJWZvbnRzZXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9udGF0dHI9JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5Gb250LT4kcHJvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZm9udGF0dHI9PTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPiRmdW5jO1xuIiA7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvbnRDb2xvcj0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPkZvbnQtPkNvbG9ySW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZvbnRDb2xvcj4wJiYkZm9udENvbG9yIT0kRXhjZWxDb25zdC0+e3hsQ29sb3JJbmRleEF1dG9tYXRpY30pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQuPSRmbmFtZS4iLT5zZXRfY29sb3IoIi4oJGZvbnRDb2xvcis3KS4iKTtcbiIgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW50X2Zvcm1hdD0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENoZWNrIHRleHQgYWxpZ25tZW50LCBtZXJnaW5nIGFuZCB3cmFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICgkaGFsaWduLCR2YWxpZ24sJG1lcmdlLCR3cmFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGFsaWduPSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+SG9yaXpvbnRhbEFsaWdubWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAlaEFsaWducz0oJEV4Y2VsQ29uc3QtPnt4bEhBbGlnbkNlbnRlcn09PiInY2VudGVyJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjZWxDb25zdC0+e3hsSEFsaWduSnVzdGlmeX09PiInanVzdGlmeSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEV4Y2VsQ29uc3QtPnt4bEhBbGlnbkxlZnR9PT4iJ2xlZnQnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFeGNlbENvbnN0LT57eGxIQWxpZ25SaWdodH09PiIncmlnaHQnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFeGNlbENvbnN0LT57eGxIQWxpZ25GaWxsfT0+IidmaWxsJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjZWxDb25zdC0+e3hsSEFsaWduQ2VudGVyQWNyb3NzU2VsZWN0aW9ufT0+IidtZXJnZSciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhhbGlnbiE9JEV4Y2VsQ29uc3QtPnt4bEhBbGlnbkdlbmVyYWx9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+c2V0X2FsaWduKCRoQWxpZ25zeyRoYWxpZ259KTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJpbnRfZm9ybWF0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWxpZ249JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5WZXJ0aWNhbEFsaWdubWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAldkFsaWducz0oJEV4Y2VsQ29uc3QtPnt4bFZBbGlnbkJvdHRvbX09PiInYm90dG9tJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjZWxDb25zdC0+e3hsVkFsaWduQ2VudGVyfT0+Iid2Y2VudGVyJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjZWxDb25zdC0+e3hsVkFsaWduSnVzdGlmeX09PiIndmp1c3RpZnknIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFeGNlbENvbnN0LT57eGxWQWxpZ25Ub3B9PT4iJ3RvcCciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHZhbGlnbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPnNldF9hbGlnbigkdkFsaWduc3skdmFsaWdufSk7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW50X2Zvcm1hdD0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVyZ2U9JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5NZXJnZUNlbGxzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbWVyZ2U9PTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQuPSRmbmFtZS4iLT5zZXRfbWVyZ2UoKTtcbiI7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJpbnRfZm9ybWF0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3cmFwPSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+V3JhcFRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR3cmFwPT0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+c2V0X3RleHRfd3JhcCgxKTtcbiI7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJpbnRfZm9ybWF0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgcGF0dGVybnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAoJHBhdHRlcm4sJXBhdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICVwYXRzPSgtNDE0Mj0+MCwtNDEyNT0+MiwtNDEyNj0+MywtNDEyND0+NCwtNDEyOD0+NSwtNDE2Nj0+NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQxMjE9PjcsLTQxNjI9PjgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuPSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+SW50ZXJpb3ItPlBhdHRlcm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXR0ZXJuJiYkcGF0dGVybiE9JEV4Y2VsQ29uc3QtPnt4bFBhdHRlcm5BdXRvbWF0aWN9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGF0dGVybj0kcGF0c3skcGF0dGVybn0gaWYgKCRwYXR0ZXJuPDAgJiYgZGVmaW5lZCAkcGF0c3skcGF0dGVybn0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPnNldF9wYXR0ZXJuKCRwYXR0ZXJuKTtcbiI7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENvbG9ycyBmZy9iZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCRjSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNJbmRleD0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPkludGVyaW9yLT5QYXR0ZXJuQ29sb3JJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY0luZGV4PjAmJiRjSW5kZXghPSRFeGNlbENvbnN0LT57eGxDb2xvckluZGV4QXV0b21hdGljfSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+c2V0X2JnX2NvbG9yKCIuKCRjSW5kZXgrNykuIik7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNJbmRleD0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPkludGVyaW9yLT5Db2xvckluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjSW5kZXg+MCYmJGNJbmRleCE9JEV4Y2VsQ29uc3QtPnt4bENvbG9ySW5kZXhBdXRvbWF0aWN9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQuPSRmbmFtZS4iLT5zZXRfZmdfY29sb3IoIi4oJGNJbmRleCs3KS4iKTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJpbnRfZm9ybWF0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIG51bWJlciBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAoJG51bV9mb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRudW1fZm9ybWF0PSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+TnVtYmVyRm9ybWF0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbnVtX2Zvcm1hdCBuZSAiIikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPnNldF9udW1fZm9ybWF0KCckbnVtX2Zvcm1hdCcpO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgY29udGVudHMgKHRleHQgb3IgZm9ybXVsYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAoJGNvbnRlbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudHM9JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5Gb3JtdWxhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb250ZW50cz0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPlRleHQgaWYgKCRjb250ZW50cyBlcSAiIik7CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQcmludCBjZWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjb250ZW50cyBuZSAiIiBvciAkcHJpbnRfZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBPVVRGSUxFICIjIENlbGwoJGksJGopXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgT1VURklMRSAkZm9ybWF0IGlmICgkcHJpbnRfZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIlwkd29ya3NoZWV0c3snJG5hbWUnfS0+d3JpdGUoIi4oJGktMSkuIiwiLigkai0xKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwnJGNvbnRlbnRzJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBPVVRGSUxFICIsJGZuYW1lIiBpZiAoJHByaW50X2Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBPVVRGSUxFICIpO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyBGYW1vdXMgbGFzdCB3b3Jkcy4uLgorICAgIHByaW50IE9VVEZJTEUgIlwkd29ya2Jvb2stPmNsb3NlKCk7XG4iOworICAgIAorICAgIAorICAgICMgQ2xvc2Ugb3V0ZmlsZQorICAgIGNsb3NlIChPVVRGSUxFKSBvciBkaWUgIkNhbid0IGNsb3NlIG91dGZpbGUgJG9wdHN7b306ICQhIjsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIHN1YiB1c2FnZSB7CisgICAgICAgICAgICBwcmludGYgU1RERVJSICJ1c2FnZTogJDAgW29wdGlvbnNdXG4iLgorICAgICAgICAgICAgICAgICAgICAiXHRPcHRpb25zOlxuIi4KKyAgICAgICAgICAgICAgICAgICAgIlx0XHQtdiAgICAgICBcdHZlcmJvc2UgbW9kZVxuIiAuCisgICAgICAgICAgICAgICAgICAgICJcdFx0LWkgPG5hbWU+XHRuYW1lIG9mIGlucHV0IGZpbGVcbiIgLgorICAgICAgICAgICAgICAgICAgICAiXHRcdC1vIDxuYW1lPlx0bmFtZSBvZiBvdXRwdXQgZmlsZVxuIjsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICBzdWIgRU5EIHsKKyAgICAgICAgICAgICMgUXVpdCBleGNlbAorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAkRXhjZWwtPntEaXNwbGF5QWxlcnRzfSA9IDA7CisgICAgICAgICAgICAgICAgICAgICRFeGNlbC0+UXVpdDsKKyAgICAgICAgICAgIH0gaWYgKGRlZmluZWQgJEV4Y2VsKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorICAgIAorICAgID1oZWFkMSBOQU1FCisgICAgCisgICAgCisgICAgbGVjeGUgLSBBIEV4Y2VsIGZpbGUgdG8gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgY29kZSBjb252ZXJ0ZXIKKyAgICAKKyAgICAKKyAgICA9aGVhZDEgREVTQ1JJUFRJT04KKyAgICAKKyAgICAKKyAgICBUaGlzIHByb2dyYW0gdGFrZXMgYW4gTVMgRXhjZWwgd29ya2Jvb2sgZmlsZSBhcyBpbnB1dCBhbmQgZnJvbQorICAgIHRoYXQgZmlsZSwgcHJvZHVjZXMgYW4gb3V0cHV0IGZpbGUgd2l0aCBQZXJsIGNvZGUgdGhhdCB1c2VzIHRoZQorICAgIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSB0byByZXByb2R1Y2UgdGhlIG9yaWdpbmFsCisgICAgZmlsZS4KKyAgICAKKyAgICAKKyAgICA9aGVhZDEgU1RVRkYKKyAgICAKKyAgICAKKyAgICBBZGRpdGlvbmFsIGhhbmRzLW9uIGVkaXRpbmcgb2YgdGhlIG91dHB1dCBmaWxlIG1pZ2h0IGJlIG5lY2NlY2FyeQorICAgIGFzOgorICAgIAorICAgIAorICAgICogVGhpcyBwcm9ncmFtIGFsd2F5cyBuYW1lcyB0aGUgZmlsZSBwcm9kdWNlZCBieSBvdXRwdXQgc2NyaXB0CisgICAgICBfY2hhbmdlX21lXy54bHMKKyAgICAKKyAgICAKKyAgICAqIFVzZXJzIG9mIGludGVybmF0aW9uYWwgRXhjZWwgdmVyc2lvbnMgd2lsbCBoYXZlIHNvbSB3b3JrIHRvIGRvCisgICAgICBvbiBsaXN0IHNlcGFyYXRvcnMgYW5kIG51bWVyaWMgcHVuY3RhdGlvbiBjaGFyYWN0ZXJzLgorICAgIAorICAgIAorICAgID1oZWFkMSBTRUUgQUxTTworICAgIAorICAgIAorICAgIEw8V2luMzI6Ok9MRT4sIEw8V2luMzI6Ok9MRTo6VmFyaWFudD4sIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+CisgICAgCisgICAgCisgICAgPWhlYWQxIEJVR1MKKyAgICAKKyAgICAKKyAgICAqIFBpY2tzIHdyb25nIGNvbG9yIG9uIGNlbGxzIHNvbWV0aW1lcy4KKyAgICAKKyAgICAKKyAgICAqIFByb2JhYmx5IGEgZmV3IG90aGVyLi4uCisgICAgCisgICAgCisgICAgPWhlYWQxIERJU0NMQUlNRVIKKyAgICAKKyAgICAKKyAgICBJIGRvIG5vdCBndWFyYW50ZWUgQjxBTllUSElORz4gd2l0aCB0aGlzIHByb2dyYW0uIElmIHlvdSB1c2UgaXQgeW91CisgICAgYXJlIGRvaW5nIHNvIEI8QVQgWU9VUiBPV04gUklTSz4hIEkgbWF5IG9yIG1heSBub3Qgc3VwcG9ydCB0aGlzCisgICAgZGVwZW5kaW5nIG9uIG15IHRpbWUgc2NoZWR1bGUuLi4KKyAgICAKKyAgICAKKyAgICA9aGVhZDEgQVVUSE9SCisgICAgCisgICAgCisgICAgdDBtYXNAbmV0bG9yZHMubmV0CisgICAgCisgICAgCisgICAgPWhlYWQxIENPUFlSSUdIVAorICAgIAorICAgIAorICAgIENvcHlyaWdodCAyMDAxLCB0MG1hc0BuZXRsb3Jkcy5uZXQKKyAgICAKKyAgICAKKyAgICBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9sZWN4ZS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNvbnZlcnRBMS5wbAorCisKKworVGhpcyBwcm9ncmFtIGNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIHRoZSBFeGNlbCBBMSBjZWxsCityZWZlcmVuY2UgIG5vdGF0aW9uLgorCitUaGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHN1cGVyc2VkZWQgYnkgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4uCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFRoaXMgcHJvZ3JhbSBjb250YWlucyBoZWxwZXIgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCB0aGUgRXhjZWwgQTEgY2VsbAorICAgICMgcmVmZXJlbmNlICBub3RhdGlvbi4KKyAgICAjCisgICAgIyBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHN1cGVyc2VkZWQgYnkgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4uCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICAKKyAgICBwcmludCAiXG4iOworICAgIHByaW50ICJDZWxsIEI3ICAgaXMgZXF1aXZhbGVudCB0byAoIjsKKyAgICBwcmludCBqb2luICIgIiwgY2VsbF90b19yb3djb2woJ0I3Jyk7CisgICAgcHJpbnQgIikgaW4gcm93IGNvbHVtbiBub3RhdGlvbi5cbiI7CisgICAgCisgICAgcHJpbnQgIkNlbGwgXCRCNyAgaXMgZXF1aXZhbGVudCB0byAoIjsKKyAgICBwcmludCBqb2luICIgIiwgY2VsbF90b19yb3djb2woJyRCNycpOworICAgIHByaW50ICIpIGluIHJvdyBjb2x1bW4gbm90YXRpb24uXG4iOworICAgIAorICAgIHByaW50ICJDZWxsIEJcJDcgIGlzIGVxdWl2YWxlbnQgdG8gKCI7CisgICAgcHJpbnQgam9pbiAiICIsIGNlbGxfdG9fcm93Y29sKCdCJDcnKTsKKyAgICBwcmludCAiKSBpbiByb3cgY29sdW1uIG5vdGF0aW9uLlxuIjsKKyAgICAKKyAgICBwcmludCAiQ2VsbCBcJEJcJDcgaXMgZXF1aXZhbGVudCB0byAoIjsKKyAgICBwcmludCBqb2luICIgIiwgY2VsbF90b19yb3djb2woJyRCJDcnKTsKKyAgICBwcmludCAiKSBpbiByb3cgY29sdW1uIG5vdGF0aW9uLlxuXG4iOworICAgIAorICAgIHByaW50ICJSb3cgYW5kIGNvbHVtbiAoMTk5OSwgMjkpICAgICAgIGFyZSBlcXVpdmFsZW50IHRvICI7CisgICAgcHJpbnQgcm93Y29sX3RvX2NlbGwoMTk5OSwgMjkpLCAgICIuXG4iOworICAgIAorICAgIHByaW50ICJSb3cgYW5kIGNvbHVtbiAoMTk5OSwgMjksIDAsIDEpIGFyZSBlcXVpdmFsZW50IHRvICI7CisgICAgcHJpbnQgcm93Y29sX3RvX2NlbGwoMTk5OSwgMjksIDAsIDEpLCAgICIuXG5cbiI7CisgICAgCisgICAgcHJpbnQgIlRoZSBiYXNlIGNlbGwgaXM6ICAgICBaN1xuIjsKKyAgICBwcmludCAiSW5jcmVtZW50IHRoZSByb3c6ICAgICIsIGluY19jZWxsX3JvdygnWjcnKSwgIlxuIjsKKyAgICBwcmludCAiRGVjcmVtZW50IHRoZSByb3c6ICAgICIsIGRlY19jZWxsX3JvdygnWjcnKSwgIlxuIjsKKyAgICBwcmludCAiSW5jcmVtZW50IHRoZSBjb2x1bW46ICIsIGluY19jZWxsX2NvbCgnWjcnKSwgIlxuIjsKKyAgICBwcmludCAiRGVjcmVtZW50IHRoZSBjb2x1bW46ICIsIGRlY19jZWxsX2NvbCgnWjcnKSwgIlxuXG4iOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyByb3djb2xfdG9fY2VsbCgkcm93LCAkY29sLCAkcm93X2Fic29sdXRlLCAkY29sX2Fic29sdXRlKQorICAgICMKKyAgICAjIENvbnZlcnQgYSB6ZXJvIGJhc2VkIHJvdyBhbmQgY29sdW1uIHJlZmVyZW5jZSB0byBhIEExIHJlZmVyZW5jZS4gRm9yIGV4YW1wbGUKKyAgICAjICgwLCAyKSB0byBDMS4gJHJvd19hYnNvbHV0ZSwgJGNvbF9hYnNvbHV0ZSBhcmUgb3B0aW9uYWwuIFRoZXkgYXJlIGJvb2xlYW4KKyAgICAjIHZhbHVlcyB1c2VkIHRvIGluZGljYXRlIGlmIHRoZSByb3cgb3IgY29sdW1uIHZhbHVlIGlzIGFic29sdXRlLCBpLmUuIGlmIGl0IGlzCisgICAgIyBwcmVmaXhlZCBieSBhICQgc2lnbjogZWcuICgwLCAyLCAwLCAxKSBjb252ZXJ0cyB0byAkQzEuCisgICAgIworICAgICMgUmV0dXJuczogYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgIworICAgIHN1YiByb3djb2xfdG9fY2VsbCB7CisgICAgCisgICAgICAgIG15ICRyb3cgICAgID0gJF9bMF07CisgICAgICAgIG15ICRjb2wgICAgID0gJF9bMV07CisgICAgICAgIG15ICRyb3dfYWJzID0gJF9bMl0gfHwgMDsKKyAgICAgICAgbXkgJGNvbF9hYnMgPSAkX1szXSB8fCAwOworICAgIAorICAgIAorICAgICAgICBpZiAoJHJvd19hYnMpIHsKKyAgICAgICAgICAgICRyb3dfYWJzID0gJyQnCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkcm93X2FicyA9ICcnCisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYgKCRjb2xfYWJzKSB7CisgICAgICAgICAgICAkY29sX2FicyA9ICckJworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJGNvbF9hYnMgPSAnJworICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgIG15ICRpbnQgID0gaW50ICgkY29sIC8gMjYpOworICAgICAgICBteSAkZnJhYyA9ICRjb2wgJSAyNiArMTsKKyAgICAKKyAgICAgICAgbXkgJGNocjEgPScnOworICAgICAgICBteSAkY2hyMiA9Jyc7CisgICAgCisgICAgCisgICAgICAgIGlmICgkZnJhYyAhPSAwKSB7CisgICAgICAgICAgICAkY2hyMiA9IGNociAob3JkKCdBJykgKyAkZnJhYyAtMSk7OworICAgICAgICB9CisgICAgCisgICAgICAgIGlmICgkaW50ID4gMCkgeworICAgICAgICAgICAgJGNocjEgPSBjaHIgKG9yZCgnQScpICsgJGludCAgLTEpOworICAgICAgICB9CisgICAgCisgICAgICAgICRyb3crKzsgICAgICMgWmVybyBpbmRleCB0byAxLWluZGV4CisgICAgCisgICAgICAgIHJldHVybiAkY29sX2FicyAuICRjaHIxIC4gJGNocjIgLiAkcm93X2Ficy4gJHJvdzsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIGNlbGxfdG9fcm93Y29sKCRjZWxsX3JlZikKKyAgICAjCisgICAgIyBDb252ZXJ0IGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIHRvIGEgemVybyBiYXNlZCByb3cgYW5kIGNvbHVtbgorICAgICMgcmVmZXJlbmNlOyBjb252ZXJ0cyBDMSB0byAoMCwgMiwgMCwgMCkuCisgICAgIworICAgICMgUmV0dXJuczogcm93LCBjb2x1bW4sIHJvd19pc19hYnNvbHV0ZSwgY29sdW1uX2lzX2Fic29sdXRlCisgICAgIworICAgICMKKyAgICBzdWIgY2VsbF90b19yb3djb2wgeworICAgIAorICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgIAorICAgICAgICAkY2VsbCA9fiAvKFwkPykoW0EtSV0/W0EtWl0pKFwkPykoXGQrKS87CisgICAgCisgICAgICAgIG15ICRjb2xfYWJzID0gJDEgZXEgIiIgPyAwIDogMTsKKyAgICAgICAgbXkgJGNvbCAgICAgPSAkMjsKKyAgICAgICAgbXkgJHJvd19hYnMgPSAkMyBlcSAiIiA/IDAgOiAxOworICAgICAgICBteSAkcm93ICAgICA9ICQ0OworICAgIAorICAgICAgICAjIENvbnZlcnQgYmFzZTI2IGNvbHVtbiBzdHJpbmcgdG8gbnVtYmVyCisgICAgICAgICMgQWxsIHlvdXIgQmFzZSBhcmUgYmVsb25nIHRvIHVzLgorICAgICAgICBteSBAY2hhcnMgID0gc3BsaXQgLy8sICRjb2w7CisgICAgICAgIG15ICRleHBuICAgPSAwOworICAgICAgICAkY29sICAgICAgID0gMDsKKyAgICAKKyAgICAgICAgd2hpbGUgKEBjaGFycykgeworICAgICAgICAgICAgbXkgJGNoYXIgPSBwb3AoQGNoYXJzKTsgIyBMUyBjaGFyIGZpcnN0CisgICAgICAgICAgICAkY29sICs9IChvcmQoJGNoYXIpIC1vcmQoJ0EnKSArMSkgKiAoMjYqKiRleHBuKTsKKyAgICAgICAgICAgICRleHBuKys7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgIyBDb252ZXJ0IDEtaW5kZXggdG8gemVyby1pbmRleAorICAgICAgICAkcm93LS07CisgICAgICAgICRjb2wtLTsKKyAgICAKKyAgICAgICAgcmV0dXJuICRyb3csICRjb2wsICRyb3dfYWJzLCAkY29sX2FiczsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIGluY19jZWxsX3JvdygkY2VsbF9yZWYpCisgICAgIworICAgICMgSW5jcmVtZW50cyB0aGUgcm93IG51bWJlciBvZiBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbi4KKyAgICAjIEZvciBleGFtcGxlIEMzIHRvIEM0CisgICAgIworICAgICMgUmV0dXJuczogYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgIworICAgIHN1YiBpbmNfY2VsbF9yb3cgeworICAgIAorICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgICAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IGNlbGxfdG9fcm93Y29sKCRjZWxsKTsKKyAgICAKKyAgICAgICAgJHJvdysrOworICAgIAorICAgICAgICByZXR1cm4gcm93Y29sX3RvX2NlbGwoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIGRlY19jZWxsX3JvdygkY2VsbF9yZWYpCisgICAgIworICAgICMgRGVjcmVtZW50cyB0aGUgcm93IG51bWJlciBvZiBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbi4KKyAgICAjIEZvciBleGFtcGxlIEM0IHRvIEMzCisgICAgIworICAgICMgUmV0dXJuczogYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgIworICAgIHN1YiBkZWNfY2VsbF9yb3cgeworICAgIAorICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgICAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IGNlbGxfdG9fcm93Y29sKCRjZWxsKTsKKyAgICAKKyAgICAgICAgJHJvdy0tOworICAgIAorICAgICAgICByZXR1cm4gcm93Y29sX3RvX2NlbGwoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIGluY19jZWxsX2NvbCgkY2VsbF9yZWYpCisgICAgIworICAgICMgSW5jcmVtZW50cyB0aGUgY29sdW1uIG51bWJlciBvZiBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbi4KKyAgICAjIEZvciBleGFtcGxlIEMzIHRvIEQzCisgICAgIworICAgICMgUmV0dXJuczogYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgIworICAgIHN1YiBpbmNfY2VsbF9jb2wgeworICAgIAorICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgICAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IGNlbGxfdG9fcm93Y29sKCRjZWxsKTsKKyAgICAKKyAgICAgICAgJGNvbCsrOworICAgIAorICAgICAgICByZXR1cm4gcm93Y29sX3RvX2NlbGwoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIGRlY19jZWxsX2NvbCgkY2VsbF9yZWYpCisgICAgIworICAgICMgRGVjcmVtZW50cyB0aGUgY29sdW1uIG51bWJlciBvZiBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbi4KKyAgICAjIEZvciBleGFtcGxlIEQzIHRvIEMzCisgICAgIworICAgICMgUmV0dXJuczogYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgIworICAgIHN1YiBkZWNfY2VsbF9jb2wgeworICAgIAorICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgICAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IGNlbGxfdG9fcm93Y29sKCRjZWxsKTsKKyAgICAKKyAgICAgICAgJGNvbC0tOworICAgIAorICAgICAgICByZXR1cm4gcm93Y29sX3RvX2NlbGwoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKTsKKyAgICB9CisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NvbnZlcnRBMS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGZ1bmN0aW9uX2xvY2FsZS5wbAorCisKKworR2VuZXJhdGUgZnVuY3Rpb24gbmFtZXMgZm9yIGRpZmZlcmVudCBsb2NhbGVzLgorCitUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhhc2ggb2Yga25vd24gZnVuY3Rpb25zIGZvciB1c2UgaW4KK3RoZSBGb3JtdWxhLnBtIG1vZHVsZS4gQnkgZGVmYXVsdCB0aGUgZnVuY3Rpb24gbmFtZXMgYXJlIGluIEVuZ2xpc2ggYnV0IHlvdQorY2FuIGFsc28gY2hvb3NlIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBsYW5ndWFnZXM6IEdlcm1hbiwgRnJlbmNoLCBTcGFuaXNoLAorUG9ydHVndWVzZSwgRHV0Y2gsIEZpbm5pc2gsIEl0YWxpYW4gYW5kIFN3ZWRpc2guCisKK1RoaXMgd291bGQgYWxsb3cgeW91IHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICc9U1VNKEMxOkMzKScgICk7CisgICAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAwLCAnPVNVTU1FKEMxOkMzKScpOworICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMCwgJz1TT01NRShDMTpDMyknKTsKKyAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDAsICc9U1VNQShDMTpDMyknICk7CisgICAgICAkd29ya3NoZWV0LT53cml0ZSg0LCAwLCAnPVNPTUEoQzE6QzMpJyApOworICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgMCwgJz1TT00oQzE6QzMpJyAgKTsKKyAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsIDAsICc9U1VNTUEoQzE6QzMpJyk7CisgICAgICAkd29ya3NoZWV0LT53cml0ZSg3LCAwLCAnPVNPTU1BKEMxOkMzKScpOworCitVbmZvcnR1bmF0ZWx5LCBpZiB5b3Ugd2lzaCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgbGFuZ3VhZ2UgdGhlcmUgYXJlIHNvbWUKK2NvbmZsaWN0cyBiZXR3ZWVuIGZ1bmN0aW9uIG5hbWVzOgorCisgICAgICBGdW5jdGlvbiAgICAgICAgTGFuZ3VhZ2UgMSAgICAgICAgICAgICAgTGFuZ3VhZ2UgMgorICAgICAgPT09PT09PT0gICAgICAgID09PT09PT09PT0gICAgICAgICAgICAgID09PT09PT09PT0KKyAgICAgIE5CICAgICAgICAgICAgICBGcmVuY2ggICAgICAgICAgICAgICAgICBEdXRjaAorICAgICAgTkEgICAgICAgICAgICAgIEVuZ2xpc2gvRnJlbmNoICAgICAgICAgIEZpbm5pc2gKKyAgICAgIFRSSU0gICAgICAgICAgICBGcmVuY2ggICAgICAgICAgICAgICAgICBFbmdsaXNoCisgICAgICBESUEgICAgICAgICAgICAgU3BhbmlzaC9Qb3J0dWd1ZXNlICAgICAgR2VybWFuCisKK1RoZXJlZm9yZSwgaWYgeW91IHRyeSB0byBnZW5lcmF0ZSBhIGhhc2ggb2YgZnVuY3Rpb24gbmFtZXMgdG8gc3VwcG9ydCBib3RoCitGcmVuY2ggYW5kIEVuZ2xpc2ggdGhlbiB0aGUgZnVuY3Rpb24gVFJJTSB3aWxsIGJlIGFzc2lnbmVkIHRoZSBtZWFuaW5nIG9mIHRoZQorZmlyc3QgbGFuZ3VhZ2UgdGhhdCBkZWZpbmVzIGl0LCB3aGljaCBpbiB0aGlzIGNhc2UgaXMgRnJlbmNoLiBZb3UgY2FuIGdldAorYXJvdW5kIHRoaXMgYnkgcmVuYW1pbmcgdGhlIGZ1bmN0aW9uIGZvciBvbmUgb2YgdGhlIGxhbmd1YWdlcyBhbmQgZG9jdW1lbnRpbmcKK3RoZSBjaGFuZ2UsIGZvciBleGFtcGxlOiBUUklNLkVOIG9yIFRSSU0uRlIuCisKK1BsZWFzZSBub3RlIHRoYXQgdGhpcyBvbmx5IHBhcnRpYWxseSBzb2x2ZXMgdGhlIHByb2JsZW0gb2YgbG9jYWxpc2F0aW9uLgorVGhlcmUgYXJlIGFsc28gbnVtYmVyIGZvcm1hdHMgdG8gY29uc2lkZXIgKDEuNSA9PSAxLDUpIGFuZCB0aGUgZmFjdCB0aGF0IHRoZQorbGlzdCBzZXBhcmF0b3IgIiwiIGFuZCB0aGUgYXJyYXkgc2VwYXJhdG9yICI7IiBhcmUgaW50ZXJjaGFuZ2VkIGluIGRpZmZlcmVudAorbG9jYWxlcy4KKworVGhlIGxvbmdlc3QgZnVuY3Rpb24gbmFtZSBpcyBMT0kuTk9STUFMRS5TVEFOREFSRC5JTlZFUlNFICgyOSBjaGFycykgZm9sbG93ZWQKK2J5IE5PUk0uSkFLQVVNQS5OT1JNSVQuS8TETlQgKDI1IGNoYXJzKS4KK1RoZSBzaG9ydGVzdCBmdW5jdGlvbiBuYW1lIGluIGFsbCBsYW5ndWFnZXMgaXMgVC4KKworCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBHZW5lcmF0ZSBmdW5jdGlvbiBuYW1lcyBmb3IgZGlmZmVyZW50IGxvY2FsZXMuCisgICAgIworICAgICMgVGhpcyBwcm9ncmFtIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoYXNoIG9mIGtub3duIGZ1bmN0aW9ucyBmb3IgdXNlIGluCisgICAgIyB0aGUgRm9ybXVsYS5wbSBtb2R1bGUuIEJ5IGRlZmF1bHQgdGhlIGZ1bmN0aW9uIG5hbWVzIGFyZSBpbiBFbmdsaXNoIGJ1dCB5b3UKKyAgICAjIGNhbiBhbHNvIGNob29zZSB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzOiBHZXJtYW4sIEZyZW5jaCwgU3BhbmlzaCwKKyAgICAjIFBvcnR1Z3Vlc2UsIER1dGNoLCBGaW5uaXNoLCBJdGFsaWFuIGFuZCBTd2VkaXNoLgorICAgICMKKyAgICAjIFRoaXMgd291bGQgYWxsb3cgeW91IHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6CisgICAgIworICAgICMgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgJz1TVU0oQzE6QzMpJyAgKTsKKyAgICAjICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDAsICc9U1VNTUUoQzE6QzMpJyk7CisgICAgIyAgICAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAwLCAnPVNPTU1FKEMxOkMzKScpOworICAgICMgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMCwgJz1TVU1BKEMxOkMzKScgKTsKKyAgICAjICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDQsIDAsICc9U09NQShDMTpDMyknICk7CisgICAgIyAgICAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAwLCAnPVNPTShDMTpDMyknICApOworICAgICMgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNiwgMCwgJz1TVU1NQShDMTpDMyknKTsKKyAgICAjICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsIDAsICc9U09NTUEoQzE6QzMpJyk7CisgICAgIworICAgICMgVW5mb3J0dW5hdGVseSwgaWYgeW91IHdpc2ggdG8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGxhbmd1YWdlIHRoZXJlIGFyZSBzb21lCisgICAgIyBjb25mbGljdHMgYmV0d2VlbiBmdW5jdGlvbiBuYW1lczoKKyAgICAjCisgICAgIyAgICAgICBGdW5jdGlvbiAgICAgICAgTGFuZ3VhZ2UgMSAgICAgICAgICAgICAgTGFuZ3VhZ2UgMgorICAgICMgICAgICAgPT09PT09PT0gICAgICAgID09PT09PT09PT0gICAgICAgICAgICAgID09PT09PT09PT0KKyAgICAjICAgICAgIE5CICAgICAgICAgICAgICBGcmVuY2ggICAgICAgICAgICAgICAgICBEdXRjaAorICAgICMgICAgICAgTkEgICAgICAgICAgICAgIEVuZ2xpc2gvRnJlbmNoICAgICAgICAgIEZpbm5pc2gKKyAgICAjICAgICAgIFRSSU0gICAgICAgICAgICBGcmVuY2ggICAgICAgICAgICAgICAgICBFbmdsaXNoCisgICAgIyAgICAgICBESUEgICAgICAgICAgICAgU3BhbmlzaC9Qb3J0dWd1ZXNlICAgICAgR2VybWFuCisgICAgIworICAgICMgVGhlcmVmb3JlLCBpZiB5b3UgdHJ5IHRvIGdlbmVyYXRlIGEgaGFzaCBvZiBmdW5jdGlvbiBuYW1lcyB0byBzdXBwb3J0IGJvdGgKKyAgICAjIEZyZW5jaCBhbmQgRW5nbGlzaCB0aGVuIHRoZSBmdW5jdGlvbiBUUklNIHdpbGwgYmUgYXNzaWduZWQgdGhlIG1lYW5pbmcgb2YgdGhlCisgICAgIyBmaXJzdCBsYW5ndWFnZSB0aGF0IGRlZmluZXMgaXQsIHdoaWNoIGluIHRoaXMgY2FzZSBpcyBGcmVuY2guIFlvdSBjYW4gZ2V0CisgICAgIyBhcm91bmQgdGhpcyBieSByZW5hbWluZyB0aGUgZnVuY3Rpb24gZm9yIG9uZSBvZiB0aGUgbGFuZ3VhZ2VzIGFuZCBkb2N1bWVudGluZworICAgICMgdGhlIGNoYW5nZSwgZm9yIGV4YW1wbGU6IFRSSU0uRU4gb3IgVFJJTS5GUi4KKyAgICAjCisgICAgIyBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgb25seSBwYXJ0aWFsbHkgc29sdmVzIHRoZSBwcm9ibGVtIG9mIGxvY2FsaXNhdGlvbi4KKyAgICAjIFRoZXJlIGFyZSBhbHNvIG51bWJlciBmb3JtYXRzIHRvIGNvbnNpZGVyICgxLjUgPT0gMSw1KSBhbmQgdGhlIGZhY3QgdGhhdCB0aGUKKyAgICAjIGxpc3Qgc2VwYXJhdG9yICIsIiBhbmQgdGhlIGFycmF5IHNlcGFyYXRvciAiOyIgYXJlIGludGVyY2hhbmdlZCBpbiBkaWZmZXJlbnQKKyAgICAjIGxvY2FsZXMuCisgICAgIworICAgICMgVGhlIGxvbmdlc3QgZnVuY3Rpb24gbmFtZSBpcyBMT0kuTk9STUFMRS5TVEFOREFSRC5JTlZFUlNFICgyOSBjaGFycykgZm9sbG93ZWQKKyAgICAjIGJ5IE5PUk0uSkFLQVVNQS5OT1JNSVQuS8TETlQgKDI1IGNoYXJzKS4KKyAgICAjIFRoZSBzaG9ydGVzdCBmdW5jdGlvbiBuYW1lIGluIGFsbCBsYW5ndWFnZXMgaXMgVC4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpOyBKb2huIE1jTmFtYXJhLCBNYXJjaCAyMDAxLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBNb2RpZnkgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgdG8gYWRkIHRoZSBsYW5ndWFnZSB0byB0aGUgZnVuY3Rpb24gbmFtZSBoYXNoCisgICAgIworICAgIG15ICRlbmdsaXNoICAgID0gMTsKKyAgICBteSAkZ2VybWFuICAgICA9IDA7CisgICAgbXkgJGZyZW5jaCAgICAgPSAwOworICAgIG15ICRzcGFuaXNoICAgID0gMDsKKyAgICBteSAkcG9ydHVndWVzZSA9IDA7CisgICAgbXkgJGR1dGNoICAgICAgPSAwOworICAgIG15ICRmaW5uaXNoICAgID0gMDsKKyAgICBteSAkaXRhbGlhbiAgICA9IDA7CisgICAgbXkgJHN3ZWRpc2ggICAgPSAwOworICAgIAorICAgIG15ICVmdW5jczsKKyAgICAKKyAgICAjIElnbm9yZSB0aGUgaGVhZGluZ3MKKyAgICA8REFUQT47CisgICAgCisgICAgIyBQcmludCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoYXNoIGRlZmluaXRpb24KKyAgICBwcmludCAiICAgICVmdW5jdGlvbnMgID0gKFxuIjsKKyAgICBwcmludCAiICAgICAgICAjIiAuICIgIiB4IDM3IDsKKyAgICBwcmludCAicHRnICBhcmdzICBjbGFzcyAgdm9sXG4iOworICAgIAorICAgIHdoaWxlICg8REFUQT4peworICAgICAgICBteSBARiA9IHNwbGl0ICIgIjsKKyAgICAgICAgbXkgJHZhbHVlID0gJEZbMF07CisgICAgICAgIG15ICRhcmdzICA9ICRGWzFdOworICAgICAgICBteSAkcmVmICAgPSAkRlsyXTsKKyAgICAgICAgbXkgJHZvbCAgID0gJEZbM107CisgICAgCisgICAgICAgIHByaW50X2Z1bmN0aW9uKCRGWzRdLCAgJHZhbHVlLCAkYXJncywgJHJlZiwgJHZvbCkgaWYgJGVuZ2xpc2g7CisgICAgICAgIHByaW50X2Z1bmN0aW9uKCRGWzVdLCAgJHZhbHVlLCAkYXJncywgJHJlZiwgJHZvbCkgaWYgJGdlcm1hbjsKKyAgICAgICAgcHJpbnRfZnVuY3Rpb24oJEZbNl0sICAkdmFsdWUsICRhcmdzLCAkcmVmLCAkdm9sKSBpZiAkZnJlbmNoOworICAgICAgICBwcmludF9mdW5jdGlvbigkRls3XSwgICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpIGlmICRzcGFuaXNoOworICAgICAgICBwcmludF9mdW5jdGlvbigkRls4XSwgICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpIGlmICRwb3J0dWd1ZXNlOworICAgICAgICBwcmludF9mdW5jdGlvbigkRls5XSwgICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpIGlmICRkdXRjaDsKKyAgICAgICAgcHJpbnRfZnVuY3Rpb24oJEZbMTBdLCAkdmFsdWUsICRhcmdzLCAkcmVmLCAkdm9sKSBpZiAkZmlubmlzaDsKKyAgICAgICAgcHJpbnRfZnVuY3Rpb24oJEZbMTFdLCAkdmFsdWUsICRhcmdzLCAkcmVmLCAkdm9sKSBpZiAkaXRhbGlhbjsKKyAgICAgICAgcHJpbnRfZnVuY3Rpb24oJEZbMTJdLCAkdmFsdWUsICRhcmdzLCAkcmVmLCAkdm9sKSBpZiAkc3dlZGlzaDsKKyAgICB9CisgICAgIyBQcmludCB0aGUgZW5kIG9mIHRoZSBoYXNoIGRlZmluaXRpb24KKyAgICBwcmludCAiICAgICk7XG4iOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBGdW5jdGlvbiB0byBwcmludCB0aGUgZnVuY3Rpb24gbmFtZXMuIEl0IHByaW50cyBhIHdhcm5pbmcgaWYgdGhlcmUgaXMgYQorICAgICMgY2xhc2guCisgICAgIworICAgIHN1YiBwcmludF9mdW5jdGlvbiB7CisgICAgCisgICAgICAgIG15ICRmdW5jICA9IHNoaWZ0OworICAgICAgICBteSAkdmFsdWUgPSBzaGlmdDsKKyAgICAgICAgbXkgJGFyZ3MgID0gc2hpZnQ7CisgICAgICAgIG15ICRyZWYgICA9IHNoaWZ0OworICAgICAgICBteSAkdm9sICAgPSBzaGlmdDsKKyAgICAKKyAgICAgICAgJGZ1bmMgPSAiJyRmdW5jJyI7CisgICAgCisgICAgICAgIGlmIChub3QgZXhpc3RzICRmdW5jc3skZnVuY30pIHsKKyAgICAgICAgICAgIHByaW50ZigiICAgICAgICAlLTMxcyA9PiBbJTRkLCAlNGQsICU0ZCwgJTRkIF0sXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ1bmMsICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpOworICAgICAgICAgICAgJGZ1bmNzeyRmdW5jfSA9ICR2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgkZnVuY3N7JGZ1bmN9ICE9ICR2YWx1ZSkgeworICAgICAgICAgICAgICAgIHByaW50ICIgICAgICAgICMgV2FybmluZyAiOworICAgICAgICAgICAgICAgIHByaW50ICRmdW5jLCAiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBhbm90aGVyIGxhbmd1YWdlXG4iOworICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgICAjJS0zMXMgPT4gWyU0ZCwgJTRkLCAlNGQsICU0ZCBdLFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ1bmMsICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgICMgTm90ZTogVGhlIGZvbGxvd2luZyBkYXRhIGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBuYW1lcyBpbiB0aGUgdmFyaW91cworICAgICMgbGFuZ3VhZ2VzLiBUaGVzZSBsaW5lcyBhcmUgTE9ORy4KKyAgICAKKyAgICBfX0RBVEFfXworICAgIFZhbHVlICAgQXJncyAgICBSZWZjbGFzcyAgIFZvbGF0aWxlICAgRW5nbGlzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXJtYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZW5jaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhbmlzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0dWd1ZXNlICAgICAgICAgICAgICAgICAgICAgICAgIER1dGNoICAgICAgICAgICAgICAgICAgICAgICAgRmlubmlzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGFsaWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3ZWRpc2gKKyAgICAwICAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIENPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5aQUhMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVC5O2k0gICAgICAgICAgICAgICAgICAgICAgICAgICBBQU5UQUwgICAgICAgICAgICAgICAgICAgICAgIExBU0tFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEEuTlVNRVJJICAgICAgICAgICAgICAgICAgICAgICBBTlRBTAorICAgIDEgICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRU5OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUyAgICAgICAgICAgICAgICAgICAgICAgICAgSk9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NCisgICAgMiAgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBJU05BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTVE5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU05PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMkuTsNPLkRJU1AgICAgICAgICAgICAgICAgICAgICAgICAgSVNOQiAgICAgICAgICAgICAgICAgICAgICAgICBPTlBVVVRUVVUgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTC5OT04uRElTUCAgICAgICAgICAgICAgICAgICAgICAgxFJTQUtOQUQKKyAgICAzICAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElTRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNURkVITEVSICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RFUlJFVVIgICAgICAgICAgICAgICAgICAgICAgICAgIEVTRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgyUVSUk9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0ZPVVQgICAgICAgICAgICAgICAgICAgICAgIE9OVklSSEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMLkVSUk9SRSAgICAgICAgICAgICAgICAgICAgICAgICDEUkZFTAorICAgIDQgICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgU1VNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT01BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT01NQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BCisgICAgNSAgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBBVkVSQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JVFRFTFdFUlQgICAgICAgICAgICAgICAgICAgICAgICAgTU9ZRU5ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9NRURJTyAgICAgICAgICAgICAgICAgICAgICAgICAgIE3JRElBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VNSURERUxERSAgICAgICAgICAgICAgICAgICBLRVNLSUFSVk8gICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVERUwKKyAgICA2ICAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTc1OSU1PICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU4gICAgICAgICAgICAgICAgICAgICAgICAgIE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU4KKyAgICA3ICAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTcFYSU1PICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVggICAgICAgICAgICAgICAgICAgICAgICAgIE1BS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVgKKyAgICA4ICAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFJPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUdORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUogICAgICAgICAgICAgICAgICAgICAgICAgIFJJVkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUklGLlJJR0EgICAgICAgICAgICAgICAgICAgICAgICAgICBSQUQKKyAgICA5ICAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIENPTFVNTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBTFRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPTk5FICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLT0xPTSAgICAgICAgICAgICAgICAgICAgICAgIFNBUkFLRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUklGLkNPTE9OTkEgICAgICAgICAgICAgICAgICAgICAgICBLT0xVTU4KKyAgICAxMCAgICAgICAwICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTsNPLkRJU1AgICAgICAgICAgICAgICAgICAgICAgICAgICBOQiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVVVRUVVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9OLkRJU1AgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUtOQVMKKyAgICAxMSAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE5QViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSFcgICAgICAgICAgICAgICAgICAgICAgICAgIE5OQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVROVVbEUkRFCisgICAgMTIgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBTVERFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUJXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNBUlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNWRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1ZQQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RERVYgICAgICAgICAgICAgICAgICAgICAgICBLRVNLSUhBSk9OVEEgICAgICAgICAgICAgICAgICAgICAgIERFVi5TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1REQVYKKyAgICAxMyAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIERPTExBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PTkVEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9FREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVUxERU4gICAgICAgICAgICAgICAgICAgICAgIFZBTFVVVFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVVEEKKyAgICAxNCAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVFhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0lNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGLk7aTS5ERUMgICAgICAgICAgICAgICAgICAgICAgICBWQVNUICAgICAgICAgICAgICAgICAgICAgICAgIEtJSU5URcQgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklTU08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVNUVEFMCisgICAgMTUgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBTSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU5PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOICAgICAgICAgICAgICAgICAgICAgICAgICBTSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOCisgICAgMTYgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TICAgICAgICAgICAgICAgICAgICAgICAgICBDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TCisgICAgMTcgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOICAgICAgICAgICAgICAgICAgICAgICAgICBUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOCisgICAgMTggICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PR1RBTiAgICAgICAgICAgICAgICAgICAgICBBVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOCisgICAgMTkgICAgICAgMCAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEkgICAgICAgICAgICAgICAgICAgICAgICAgICBQSUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJLkdSRUNPICAgICAgICAgICAgICAgICAgICAgICAgICAgUEkKKyAgICAyMCAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNRUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1VSWkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQUNJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBSVogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFJWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JURUwgICAgICAgICAgICAgICAgICAgICAgIE5FTEnWSlVVUkkgICAgICAgICAgICAgICAgICAgICAgICAgUkFEUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST1QKKyAgICAyMSAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEVYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFAgICAgICAgICAgICAgICAgICAgICAgICAgIEVLU1BPTkVOVFRJICAgICAgICAgICAgICAgICAgICAgICAgRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFAKKyAgICAyMiAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIExOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTiAgICAgICAgICAgICAgICAgICAgICAgICAgIExVT05OTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTgorICAgIDIzICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTE9HMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzEwICAgICAgICAgICAgICAgICAgICAgICAgTE9HMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzEwCisgICAgMjQgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTICAgICAgICAgICAgICAgICAgICAgICAgICBJVFNFSVNBUlZPICAgICAgICAgICAgICAgICAgICAgICAgIEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTCisgICAgMjUgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBTlpaQUhMICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlRFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URUdFUiAgICAgICAgICAgICAgICAgICAgICBLT0tPTkFJU0xVS1UgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVMVEFMCisgICAgMjYgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBTSUdOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPUlpFSUNIRU4gICAgICAgICAgICAgICAgICAgICAgICAgU0lHTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSUdOTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9TLk5FRyAgICAgICAgICAgICAgICAgICAgICBFVFVNRVJLS0kgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR05PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVDS0VOCisgICAgMjcgICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJVTkRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJST05ESSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRURPTkRFQVIgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZST05ERU4gICAgICAgICAgICAgICAgICAgICBQWdZSSVNUxCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUk9UT05EQSAgICAgICAgICAgICAgICAgICAgICAgICAgQVZSVU5EQQorICAgIDI4ICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgTE9PS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJXRUlTICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ0hFUkNIRSAgICAgICAgICAgICAgICAgICAgICAgICAgQlVTQ0FSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpPRUtFTiAgICAgICAgICAgICAgICAgICAgICAgSEFLVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRVJDQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVEFVUFAKKyAgICAyOSAgICAgIC0xICAgICAgMCAgICAgICAgICAxICAgICAgICAgIElOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgzU5ESUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRFWCAgICAgICAgICAgICAgICAgICAgICAgIElOREVLU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRFWAorICAgIDMwICAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUkVQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSUVERVJIT0xFTiAgICAgICAgICAgICAgICAgICAgICAgIFJFUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQRVRJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVBFVElSICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkhBTElORyAgICAgICAgICAgICAgICAgICAgVE9JU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSVBFVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUAorICAgIDMxICAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFQuVEVYVE8gICAgICAgICAgICAgICAgICAgICAgICAgIERFRUwgICAgICAgICAgICAgICAgICAgICAgICAgUE9JTUkuVEVLU1RJICAgICAgICAgICAgICAgICAgICAgICBTVFJJTkdBLkVTVFJBSSAgICAgICAgICAgICAgICAgICAgIEVYVEVYVAorICAgIDMyICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMxE5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CQ0FSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBO2k0uQ0FSQUNUICAgICAgICAgICAgICAgICAgICAgICAgIExFTkdURSAgICAgICAgICAgICAgICAgICAgICAgUElUVVVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVU5HSEVaWkEgICAgICAgICAgICAgICAgICAgICAgICAgIEzETkdECisgICAgMzMgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBWQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FBUkRFICAgICAgICAgICAgICAgICAgICAgICBBUlZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTE9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVE5VTQorICAgIDM0ICAgICAgIDAgICAgICAxICAgICAgICAgIDAgICAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQUhSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZSQUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSREFERVJPICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJEQURFSVJPICAgICAgICAgICAgICAgICAgICAgICAgIFdBQVIgICAgICAgICAgICAgICAgICAgICAgICAgVE9TSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTlQKKyAgICAzNSAgICAgICAwICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTldBQVIgICAgICAgICAgICAgICAgICAgICAgIEVQxFRPU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTS1QKKyAgICAzNiAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ0gKKyAgICAzNyAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTExFUgorICAgIDM4ICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUNIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOw08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JRVQgICAgICAgICAgICAgICAgICAgICAgICAgRUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDS0UKKyAgICAzOSAgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE1PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0lEVU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNUICAgICAgICAgICAgICAgICAgICAgICAgIEpBS09KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNUCisgICAgNDAgICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBEQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCQU5aQUhMICAgICAgICAgICAgICAgICAgICAgICAgICAgQkROQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRENPTlRBUiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEQ09OVEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgREJBQU5UQUwgICAgICAgICAgICAgICAgICAgICBUTEFTS0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCLkNPTlRBLk5VTUVSSSAgICAgICAgICAgICAgICAgICAgREFOVEFMCisgICAgNDEgICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBEU1VNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCU1VNTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRTT01NRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFNVTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEU09NQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJTT00gICAgICAgICAgICAgICAgICAgICAgICBUU1VNTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCLlNPTU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNVTU1BCisgICAgNDIgICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBEQVZFUkFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTUlUVEVMV0VSVCAgICAgICAgICAgICAgICAgICAgICAgQkRNT1lFTk5FICAgICAgICAgICAgICAgICAgICAgICAgICBCRFBST01FRElPICAgICAgICAgICAgICAgICAgICAgICAgIEJETclESUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHRU1JRERFTERFICAgICAgICAgICAgICAgICBUS0VTS0lBUlZPICAgICAgICAgICAgICAgICAgICAgICAgIERCLk1FRElBICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1FREVMCisgICAgNDMgICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBETUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJETc1OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJNSU4gICAgICAgICAgICAgICAgICAgICAgICBUTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCLk1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1JTgorICAgIDQ0ICAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgRE1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQk1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJETUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRNQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRE3BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTUFYICAgICAgICAgICAgICAgICAgICAgICAgVE1BS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQi5NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQVgKKyAgICA0NSAgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERTVERFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJTVERBQlcgICAgICAgICAgICAgICAgICAgICAgICAgICBCREVDQVJUWVBFICAgICAgICAgICAgICAgICAgICAgICAgIEJEREVTVkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgQkRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlNUREVWICAgICAgICAgICAgICAgICAgICAgIFRLRVNLSUhBSk9OVEEgICAgICAgICAgICAgICAgICAgICAgREIuREVWLlNUICAgICAgICAgICAgICAgICAgICAgICAgICBEU1REQVYKKyAgICA0NiAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSSUFOWiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVIgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQU5TCisgICAgNDcgICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBEVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVkFSSUFOWiAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVkFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgREJWQVIgICAgICAgICAgICAgICAgICAgICAgICBUVkFSSUFOU1NJICAgICAgICAgICAgICAgICAgICAgICAgIERCLlZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFZBUklBTlMKKyAgICA0OCAgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUtTVCAgICAgICAgICAgICAgICAgICAgICAgIFRFS1NUSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUCisgICAgNDkgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBMSU5FU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPSVRFUkVHICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RJTUFDSU9OLkxJTkVBTCAgICAgICAgICAgICAgICAgIFBST0ouTElOICAgICAgICAgICAgICAgICAgICAgICAgICAgTElKTlNDSCAgICAgICAgICAgICAgICAgICAgICBMSU5SRUdSICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR1IuTElOICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHUgorICAgIDUwICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgVFJFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTkRBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVOREVOQ0lBICAgICAgICAgICAgICAgICAgICAgICAgICBURU5Eyk5DSUEgICAgICAgICAgICAgICAgICAgICAgICAgIFRSRU5EICAgICAgICAgICAgICAgICAgICAgICAgU1VVTlRBVVMgICAgICAgICAgICAgICAgICAgICAgICAgICBURU5ERU5aQSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSRU5ECisgICAgNTEgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBMT0dFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJLUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RJTUFDSU9OLkxPR0FSSVRNSUNBICAgICAgICAgICAgIFBST0ouTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HU0NIICAgICAgICAgICAgICAgICAgICAgICBMT0dSRUdSICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR1IuTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQUkVHUgorICAgIDUyICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgR1JPV1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgIENST0lTU0FOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQ0lNSUVOVE8gICAgICAgICAgICAgICAgICAgICAgICBDUkVTQ0lNRU5UTyAgICAgICAgICAgICAgICAgICAgICAgIEdST0VJICAgICAgICAgICAgICAgICAgICAgICAgS0FTVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVTQ0lUQSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUFRSRU5ECisgICAgNTYgICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBQViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFcgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVWxFJERQorICAgIDU3ICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRXICAgICAgICAgICAgICAgICAgICAgICAgICAgVFVMRVZBLkFSVk8gICAgICAgICAgICAgICAgICAgICAgICBWQUwuRlVUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMVVRWxFJERQorICAgIDU4ICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTlBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaWlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5QTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5QRVIgICAgICAgICAgICAgICAgICAgICAgICAgTkpBS1NPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU0uUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUklPREVSCisgICAgNTkgICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBQTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJNWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBHVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtTVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQUxOSU5HCisgICAgNjAgICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBSQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpJTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFVWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBWEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVOVEUgICAgICAgICAgICAgICAgICAgICAgICBLT1JLTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBU1NPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUsROVEEKKyAgICA2MSAgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE1JUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUlLViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUklNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSVIgICAgICAgICAgICAgICAgICAgICAgICAgIE1TSVPESU5FTiAgICAgICAgICAgICAgICAgICAgICAgICAgVElSLlZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RJUgorICAgIDYyICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgSVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJS1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lTxElORU4uS09SS08gICAgICAgICAgICAgICAgICAgICBUSVIuQ09TVCAgICAgICAgICAgICAgICAgICAgICAgICAgIElSCisgICAgNjMgICAgICAgMCAgICAgIDEgICAgICAgICAgMSAgICAgICAgICBSQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpVRkFMTFNaQUhMICAgICAgICAgICAgICAgICAgICAgICAgQUxFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTEVBVE9SSU8gICAgICAgICAgICAgICAgICAgICAgICAgIEFMRUFU01JJTyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNFTEVDVCAgICAgICAgICAgICAgICAgICAgICBTQVRVTk5BSVNMVUtVICAgICAgICAgICAgICAgICAgICAgIENBU1VBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xVTVAKKyAgICA2NCAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE1BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSR0xFSUNIICAgICAgICAgICAgICAgICAgICAgICAgICBFUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSU5DSURJUiAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SUkVTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJHRUxJSktFTiAgICAgICAgICAgICAgICAgIFZBU1RJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORlJPTlRBICAgICAgICAgICAgICAgICAgICAgICAgICBQQVNTQQorICAgIDY1ICAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRVTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVDSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVFVNICAgICAgICAgICAgICAgICAgICAgICAgUMRJVsRZUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVFVNCisgICAgNjYgICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUSU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0hPUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVBPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElKRCAgICAgICAgICAgICAgICAgICAgICAgICBBSUtBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9SQVJJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0xPQ0tTTEFHCisgICAgNjcgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBEQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9VUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHICAgICAgICAgICAgICAgICAgICAgICAgICBQxElWxCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJT1JOTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHCisgICAgNjggICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBNT05USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PTkFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9JUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE3KUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFBTkQgICAgICAgICAgICAgICAgICAgICAgICBLVVVLQVVTSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTcVOQUQKKyAgICA2OSAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFlFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk5FRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEHRTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQUFSICAgICAgICAgICAgICAgICAgICAgICAgIFZVT1NJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5OTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDFUgorICAgIDcwICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgV0VFS0RBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT0NIRU5UQUcgICAgICAgICAgICAgICAgICAgICAgICAgIEpPVVJTRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRElBU0VNICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUEuREEuU0VNQU5BICAgICAgICAgICAgICAgICAgICAgIFdFRUtEQUcgICAgICAgICAgICAgICAgICAgICAgVklJS09OUMRJVsQgICAgICAgICAgICAgICAgICAgICAgICBHSU9STk8uU0VUVElNQU5BICAgICAgICAgICAgICAgICAgIFZFQ0tPREFHCisgICAgNzEgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBIT1VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUVU5ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVVSICAgICAgICAgICAgICAgICAgICAgICAgICBUVU5OSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9SQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNTUUKKyAgICA3MiAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE1JTlVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VVVQgICAgICAgICAgICAgICAgICAgICAgIE1JTlVVVElUICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VVAorICAgIDczICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgU0VDT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUtVTkRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ09OREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHVU5ETyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdVTkRPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ09OREUgICAgICAgICAgICAgICAgICAgICAgU0VLVU5OSVQgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNPTkRPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFS1VORAorICAgIDc0ICAgICAgIDAgICAgICAxICAgICAgICAgIDEgICAgICAgICAgTk9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRVRaVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BSU5URU5BTlQgICAgICAgICAgICAgICAgICAgICAgICAgQUhPUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR09SQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VICAgICAgICAgICAgICAgICAgICAgICAgICAgTllUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREVTU08gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VCisgICAgNzUgICAgICAgMSAgICAgIDAgICAgICAgICAgMSAgICAgICAgICBBUkVBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFUkVJQ0hFICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9ORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkVBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMFSRUFTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVSRUlLRU4gICAgICAgICAgICAgICAgICAgICBBTFVFRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01SxURFTgorICAgIDc2ICAgICAgIDEgICAgICAwICAgICAgICAgIDEgICAgICAgICAgUk9XUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRUlMRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJR05FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMQVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJSkVOICAgICAgICAgICAgICAgICAgICAgICAgUklWSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUdIRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBREVSCisgICAgNzcgICAgICAgMSAgICAgIDAgICAgICAgICAgMSAgICAgICAgICBDT0xVTU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQUxURU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT05ORVMgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU5BUyAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS09MT01NRU4gICAgICAgICAgICAgICAgICAgICBTQVJBS0tFRVQgICAgICAgICAgICAgICAgICAgICAgICAgIENPTE9OTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgS09MVU1ORVIKKyAgICA3OCAgICAgIC0xICAgICAgMCAgICAgICAgICAxICAgICAgICAgIE9GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVSRUlDSC5WRVJTQ0hJRUJFTiAgICAgICAgICAgICAgICBERUNBTEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJTQ0hVSVZJTkcgICAgICAgICAgICAgICAgIFNJSVJUWU3EICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBUlRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBG1lJTS0pVVE5JTkcKKyAgICA4MiAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNFQVJDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VDSEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVSQ0hFICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTExBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUxJWkFSICAgICAgICAgICAgICAgICAgICAgICAgICBWSU5ELlNQRUMgICAgICAgICAgICAgICAgICAgIEvEWS5MxFBJICAgICAgICAgICAgICAgICAgICAgICAgICAgUklDRVJDQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBT1ksKKyAgICA4MyAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRSQU5TUE9TRSAgICAgICAgICAgICAgICAgICAgICAgICAgTVRSQU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPU0UgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9ORVIgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1IgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPTkVSRU4gICAgICAgICAgICAgICAgIFRSQU5TUE9OT0kgICAgICAgICAgICAgICAgICAgICAgICAgTUFUUi5UUkFTUE9TVEEgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPTkVSQQorICAgIDg2ICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElQTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVBPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgVFlZUFBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVBPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFbEUkRFVFlQCisgICAgOTcgICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBVEFOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRBTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVEFOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUQU4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PR1RBTjIgICAgICAgICAgICAgICAgICAgICBBVEFOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTi4yICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOMgorICAgIDk4ICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQVNJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNTSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNFTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0dTSU4gICAgICAgICAgICAgICAgICAgICAgQVNJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNTRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1NJTgorICAgIDk5ICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQUNPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0dDT1MgICAgICAgICAgICAgICAgICAgICAgQUNPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ0NPUworICAgIDEwMCAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ0hPT1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQUhMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIT0lTSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFR0lSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0NPTEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIEtJRVpFTiAgICAgICAgICAgICAgICAgICAgICAgVkFMSVRTRS5JTkRFS1NJICAgICAgICAgICAgICAgICAgICBTQ0VHTEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFbETEoKKyAgICAxMDEgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIEhMT09LVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1ZFUldFSVMgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNIRVJDSEVIICAgICAgICAgICAgICAgICAgICAgICAgIEJVU0NBUkggICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1JJWi5aT0VLRU4gICAgICAgICAgICAgICAgIFZIQUtVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VSQ0EuT1JJWlogICAgICAgICAgICAgICAgICAgICAgICBMRVRBS09MVU1OCisgICAgMTAyICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBWTE9PS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWRVJXRUlTICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDSEVSQ0hFViAgICAgICAgICAgICAgICAgICAgICAgICBCVVNDQVJWICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSVC5aT0VLRU4gICAgICAgICAgICAgICAgICBQSEFLVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFUkNBLlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgTEVUQVJBRAorICAgIDEwNSAgICAgIDEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgSVNSRUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1RCRVpVRyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVFJFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNSRUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDJUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTVkVSV0lKWklORyAgICAgICAgICAgICAgICAgT05WSUlUVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUwuUklGICAgICAgICAgICAgICAgICAgICAgICAgICAgIMRSUkVGCisgICAgMTA5ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBMT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HCisgICAgMTExICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFSUNIRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVJBQ1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIENBUkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVLRU4gICAgICAgICAgICAgICAgICAgICAgICBNRVJLS0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPRElDRS5DQVJBVFQgICAgICAgICAgICAgICAgICAgICAgVEVDS0VOS09ECisgICAgMTEyICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBMT1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtMRUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVVNDVUxFICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTtpTQ1VMQSAgICAgICAgICAgICAgICAgICAgICAgICAgS0xFSU5FLkxFVFRFUlMgICAgICAgICAgICAgICBQSUVORVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlVTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VNRU5FUgorICAgIDExMyAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgVVBQRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUk9TUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BSlVTQ1VMRSAgICAgICAgICAgICAgICAgICAgICAgICAgTUFZVVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUnaU0NVTEEgICAgICAgICAgICAgICAgICAgICAgICAgIEhPT0ZETEVUVEVSUyAgICAgICAgICAgICAgICAgSVNPVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUlVU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUlNBTEVSCisgICAgMTE0ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBQUk9QRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdST1NTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9NUFJPUFJFICAgICAgICAgICAgICAgICAgICAgICAgICBOT01QUk9QSU8gICAgICAgICAgICAgICAgICAgICAgICAgIFBSSS5NQUnaU0NVTEEgICAgICAgICAgICAgICAgICAgICAgQkVHSU5MRVRURVJTICAgICAgICAgICAgICAgICBFUklTTklNSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BSVVTQy5JTklaICAgICAgICAgICAgICAgICAgICAgICAgSU5JVElBTAorICAgIDExNSAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVUNIRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVpRVUlFUkRBICAgICAgICAgICAgICAgICAgICAgICAgICBFU1FVRVJEQSAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTktTICAgICAgICAgICAgICAgICAgICAgICAgVkFTRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU5JU1RSQSAgICAgICAgICAgICAgICAgICAgICAgICAgIFbETlNURVIKKyAgICAxMTYgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFJJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDSFRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUk9JVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFUkVDSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSRUlUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNIVFMgICAgICAgICAgICAgICAgICAgICAgIE9JS0VBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVFJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBI1kdFUgorICAgIDExNyAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRVhBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVOVElTQ0ggICAgICAgICAgICAgICAgICAgICAgICAgIEVYQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEFUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTElKSyAgICAgICAgICAgICAgICAgICAgICAgVkVSVEFBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVOVElDTyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQUtUCisgICAgMTE4ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUUklNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMxFRURU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VQUFJFU1BBQ0UgICAgICAgICAgICAgICAgICAgICAgICBFU1BBQ0lPUyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUlVNQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBVElFUy5XSVNTRU4gICAgICAgICAgICAgICBQT0lTVEEuVsRMSVQgICAgICAgICAgICAgICAgICAgICAgIEFOTlVMTEEuU1BBWkkgICAgICAgICAgICAgICAgICAgICAgUkVOU0EKKyAgICAxMTkgICAgICA0ICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFJFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJTRVRaRU4gICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1QTEFDRVIgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRU1QTEFaQVIgICAgICAgICAgICAgICAgICAgICAgICAgTVVEQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJWQU5HRU4gICAgICAgICAgICAgICAgICAgIEtPUlZBQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUklNUElBWlpBICAgICAgICAgICAgICAgICAgICAgICAgICBFUlPEVFQKKyAgICAxMjAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNVQlNUSVRVVEUgICAgICAgICAgICAgICAgICAgICAgICAgV0VDSFNFTE4gICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJTVElUVUUgICAgICAgICAgICAgICAgICAgICAgICAgIFNVU1RJVFVJUiAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCU1RJVFVJUiAgICAgICAgICAgICAgICAgICAgICAgICBTVUJTVElUVUVSRU4gICAgICAgICAgICAgICAgIFZBSUhEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09TVElUVUlTQ0kgICAgICAgICAgICAgICAgICAgICAgICBCWVQuVVQKKyAgICAxMjEgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENPREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPRElHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ9NESUdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFICAgICAgICAgICAgICAgICAgICAgICAgIEtPT0RJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ESUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLT0QKKyAgICAxMjQgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZJTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklOREVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUk9VVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09OVFJBUiAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ1VSQVIgICAgICAgICAgICAgICAgICAgICAgICAgICBWSU5ELkFMTEVTICAgICAgICAgICAgICAgICAgIEVUU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJPVkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISVRUQQorICAgIDEyNSAgICAgLTEgICAgICAwICAgICAgICAgIDEgICAgICAgICAgQ0VMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRUxMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTExVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDyUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTCAgICAgICAgICAgICAgICAgICAgICAgICAgU09MVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxMQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTEwKKyAgICAxMjYgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElTRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNURkVITCAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RFUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyUVSUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0ZPVVQyICAgICAgICAgICAgICAgICAgICAgIE9OVklSSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMLkVSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICDEUkYKKyAgICAxMjcgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElTVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RURVhURSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVEVYVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgyVRFWFRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1RFS1NUICAgICAgICAgICAgICAgICAgICAgIE9OVEVLU1RJICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMLlRFU1RPICAgICAgICAgICAgICAgICAgICAgICAgICDEUlRFWFQKKyAgICAxMjggICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElTTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNUWkFITCAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1ROVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTTlVNRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgyU7aTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0dFVEFMICAgICAgICAgICAgICAgICAgICAgIE9OTFVLVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMLk5VTUVSTyAgICAgICAgICAgICAgICAgICAgICAgICDEUlRBTAorICAgIDEyOSAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgSVNCTEFOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1RMRUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVFZJREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNCTEFOQ08gICAgICAgICAgICAgICAgICAgICAgICAgICDJQ8lMLlZBWklBICAgICAgICAgICAgICAgICAgICAgICAgIElTTEVFRyAgICAgICAgICAgICAgICAgICAgICAgT05UWUhKxCAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUwuVlVPVE8gICAgICAgICAgICAgICAgICAgICAgICAgIMRSVE9NCisgICAgMTMwICAgICAgMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVAorICAgIDEzMSAgICAgIDEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4KKyAgICAxNDAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIERBVEVWQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgREFUV0VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZFQ0hBTlVNRVJPICAgICAgICAgICAgICAgICAgICAgICAgREFUQS5WQUxPUiAgICAgICAgICAgICAgICAgICAgICAgICBEQVRVTVdBQVJERSAgICAgICAgICAgICAgICAgIFDESVbEWVNBUlZPICAgICAgICAgICAgICAgICAgICAgICAgREFUQS5WQUxPUkUgICAgICAgICAgICAgICAgICAgICAgICBEQVRVTVbEUkRFCisgICAgMTQxICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUSU1FVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgIFpFSVRXRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUFNWQUwgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1JBTlVNRVJPICAgICAgICAgICAgICAgICAgICAgICAgIFZBTE9SLlRFTVBPICAgICAgICAgICAgICAgICAgICAgICAgVElKRFdBQVJERSAgICAgICAgICAgICAgICAgICBBSUtBX0FSVk8gICAgICAgICAgICAgICAgICAgICAgICAgIE9SQVJJTy5WQUxPUkUgICAgICAgICAgICAgICAgICAgICAgVElEVsRSREUKKyAgICAxNDIgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTU9STElOICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU4uQUZTQ0hSICAgICAgICAgICAgICAgICAgIFNUUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1NT1JULkNPU1QgICAgICAgICAgICAgICAgICAgICAgICBMSU5BVlNLUgorICAgIDE0MyAgICAgIDQgICAgICAxICAgICAgICAgIDAgICAgICAgICAgU1lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZRCAgICAgICAgICAgICAgICAgICAgICAgICAgVlVPU0lQT0lTVE8gICAgICAgICAgICAgICAgICAgICAgICBBTU1PUlQuQU5OVU8gICAgICAgICAgICAgICAgICAgICAgIMVSU0FWU0tSCisgICAgMTQ0ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBEREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERCICAgICAgICAgICAgICAgICAgICAgICAgICBEREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNTU9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVHQVZTS1IKKyAgICAxNDggICAgIC0xICAgICAgMSAgICAgICAgICAxICAgICAgICAgIElORElSRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESVJFS1QgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJUkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElSRUNUTyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESVJFVE8gICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJUkVDVCAgICAgICAgICAgICAgICAgICAgIEVQxFNVT1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESVJFVFRPICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJUkVLVAorICAgIDE1MCAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVUZSVUZFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPTkNUSU9OLkFQUEVMQU5URSAgICAgICAgICAgICAgICAgTExBTUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFNQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPRVBFTiAgICAgICAgICAgICAgICAgICAgICAgS1VUU1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUNISUFNQSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOUk9QQQorICAgIDE2MiAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTxFVCRVJOICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQVVJBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNUElBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVJBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJU1NFTi5DT05UUk9MICAgICAgICAgICAgICAgU0lJVk9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJFUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUxERBCisgICAgMTYzICAgICAgMSAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBNREVURVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ERVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVURVJNQVQgICAgICAgICAgICAgICAgICAgICAgICAgICBNREVURVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVFJJWi5ERVRFUk0gICAgICAgICAgICAgICAgICAgICAgREVURVJNSU5BTlRNQVQgICAgICAgICAgICAgICBNREVURVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVFIuREVURVJNICAgICAgICAgICAgICAgICAgICAgICAgTURFVEVSTQorICAgIDE2NCAgICAgIDEgICAgICAyICAgICAgICAgIDAgICAgICAgICAgTUlOVkVSU0UgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkVSU0VNQVQgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVkVSU0EgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRSSVouSU5WRVJTTyAgICAgICAgICAgICAgICAgICAgIElOVkVSU0VNQVQgICAgICAgICAgICAgICAgICAgTUvExE5URUlORU4gICAgICAgICAgICAgICAgICAgICAgICBNQVRSLklOVkVSU0EgICAgICAgICAgICAgICAgICAgICAgIE1JTlZFUlQKKyAgICAxNjUgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIE1NVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1VTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9EVUlUTUFUICAgICAgICAgICAgICAgICAgICAgICAgIE1NVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUUklaLk1VTFQgICAgICAgICAgICAgICAgICAgICAgICBQUk9EVUtUTUFUICAgICAgICAgICAgICAgICAgIE1LRVJSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUUi5QUk9ET1RUTyAgICAgICAgICAgICAgICAgICAgICBNTVVMVAorICAgIDE2NyAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgSVBNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaSU5TWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHT0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUEdUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCRVQgICAgICAgICAgICAgICAgICAgICAgICAgSVBNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFUkVTU0kgICAgICAgICAgICAgICAgICAgICAgICAgIFJCRVRBTE5JTkcKKyAgICAxNjggICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFBQTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0FQWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOQ1BFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR09QUklOICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBHVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQkVUICAgICAgICAgICAgICAgICAgICAgICAgIFBQTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUC5SQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTU9SVAorICAgIDE2OSAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgQ09VTlRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTlpBSEwyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEFSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05ULlZBTE9SRVMgICAgICAgICAgICAgICAgICAgICAgIEFBTlRBTEFSRyAgICAgICAgICAgICAgICAgICAgTEFTS0UuQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05UQS5WQUxPUkkgICAgICAgICAgICAgICAgICAgICAgIEFOVEFMVgorICAgIDE4MyAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgUFJPRFVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9EVUtUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0RVSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPRFVDVE8gICAgICAgICAgICAgICAgICAgICAgICAgICBNVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0RVS1QgICAgICAgICAgICAgICAgICAgICAgVFVMTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9ET1RUTyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0RVS1QKKyAgICAxODQgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFLVUxUxFQgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUT1JJQUwgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUNVTFRFSVQgICAgICAgICAgICAgICAgICAgIEtFUlRPTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUVE9SSUFMRSAgICAgICAgICAgICAgICAgICAgICAgICBGQUtVTFRFVAorICAgIDE4OSAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgRFBST0RVQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlBST0RVS1QgICAgICAgICAgICAgICAgICAgICAgICAgIEJEUFJPRFVJVCAgICAgICAgICAgICAgICAgICAgICAgICAgQkRQUk9EVUNUTyAgICAgICAgICAgICAgICAgICAgICAgICBCRE1VTFRJUEwgICAgICAgICAgICAgICAgICAgICAgICAgIERCUFJPRFVLVCAgICAgICAgICAgICAgICAgICAgVFRVTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQi5QUk9ET1RUTyAgICAgICAgICAgICAgICAgICAgICAgIERQUk9EVUtUCisgICAgMTkwICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBJU05PTlRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgIElTVEtURVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUTk9OVEVYVEUgICAgICAgICAgICAgICAgICAgICAgICBFU05PVEVYVE8gICAgICAgICAgICAgICAgICAgICAgICAgIMkuTsNPLlRFWFRPICAgICAgICAgICAgICAgICAgICAgICAgSVNHRUVOVEVLU1QgICAgICAgICAgICAgICAgICBPTkVJX1RFS1NUSSAgICAgICAgICAgICAgICAgICAgICAgIFZBTC5OT04uVEVTVE8gICAgICAgICAgICAgICAgICAgICAgxFJFSlRFWFQKKyAgICAxOTMgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFNUREVWUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBQldOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ0FSVFlQRVAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1ZFU1RQICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVlBBRFAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVERFVlAgICAgICAgICAgICAgICAgICAgICAgIEtFU0tJSEFKT05UQVAgICAgICAgICAgICAgICAgICAgICAgREVWLlNULlBPUCAgICAgICAgICAgICAgICAgICAgICAgICBTVERBVlAKKyAgICAxOTQgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFZBUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSSUFOWkVOICAgICAgICAgICAgICAgICAgICAgICAgICBWQVIuUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJQICAgICAgICAgICAgICAgICAgICAgICAgIFZBUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSLlBPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQU5TUAorICAgIDE5NSAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgRFNUREVWUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlNUREFCV04gICAgICAgICAgICAgICAgICAgICAgICAgIEJERUNBUlRZUEVQICAgICAgICAgICAgICAgICAgICAgICAgQkRERVNWRVNUUCAgICAgICAgICAgICAgICAgICAgICAgICBCRERFU1ZQQSAgICAgICAgICAgICAgICAgICAgICAgICAgIERCU1RERVZQICAgICAgICAgICAgICAgICAgICAgVEtFU0tJSEFKT05UQVAgICAgICAgICAgICAgICAgICAgICBEQi5ERVYuU1QuUE9QICAgICAgICAgICAgICAgICAgICAgIERTVERBVlAKKyAgICAxOTYgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERWQVJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJWQVJJQU5aRU4gICAgICAgICAgICAgICAgICAgICAgICBCRFZBUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVkFSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWQVJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlZBUlAgICAgICAgICAgICAgICAgICAgICAgIFRWQVJJQU5TU0lQICAgICAgICAgICAgICAgICAgICAgICAgREIuVkFSLlBPUCAgICAgICAgICAgICAgICAgICAgICAgICBEVkFSSUFOU1AKKyAgICAxOTcgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRSVU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS9xSWkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUk9OUVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVU5DQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVTkNBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRUhFRUwgICAgICAgICAgICAgICAgICAgICAgIEtBVEtBSVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJPTkNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVktPUlRBCisgICAgMTk4ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBJU0xPR0lDQUwgICAgICAgICAgICAgICAgICAgICAgICAgIElTVExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUTE9HSVFVRSAgICAgICAgICAgICAgICAgICAgICAgICBFU0xPR0lDTyAgICAgICAgICAgICAgICAgICAgICAgICAgIMlM00dJQ08gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNMT0dJU0NIICAgICAgICAgICAgICAgICAgICBPTlRPVFVVUyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTC5MT0dJQ08gICAgICAgICAgICAgICAgICAgICAgICAgxFJMT0dJU0sKKyAgICAxOTkgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERDT1VOVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJBTlpBSEwyICAgICAgICAgICAgICAgICAgICAgICAgICBCRE5CVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEQ09OVEFSQSAgICAgICAgICAgICAgICAgICAgICAgICAgQkRDT05UQVJBICAgICAgICAgICAgICAgICAgICAgICAgICBEQkFBTlRBTEMgICAgICAgICAgICAgICAgICAgIFRMQVNLRUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgREIuQ09OVEEuVkFMT1JJICAgICAgICAgICAgICAgICAgICBEQU5UQUxWCisgICAgMjEyICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBST1VORFVQICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRlJVTkRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgQVJST05ESS5TVVAgICAgICAgICAgICAgICAgICAgICAgICBSRURPTkRFQVIuTUFTICAgICAgICAgICAgICAgICAgICAgIEFSUkVET05EQVIuUEFSQS5DSU1BICAgICAgICAgICAgICAgQUZST05ERU4uTkFBUi5CT1ZFTiAgICAgICAgICBQWdZSSVNUxC5ERVMuWUzWUyAgICAgICAgICAgICAgICAgIEFSUk9UT05EQS5QRVIuRUNDICAgICAgICAgICAgICAgICAgQVZSVU5EQS5VUFDFVAorICAgIDIxMyAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUk9VTkRET1dOICAgICAgICAgICAgICAgICAgICAgICAgICBBQlJVTkRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUk9OREkuSU5GICAgICAgICAgICAgICAgICAgICAgICAgUkVET05ERUFSLk1FTk9TICAgICAgICAgICAgICAgICAgICBBUlJFRE9OREFSLlBBUkEuQkFJWE8gICAgICAgICAgICAgIEFGUk9OREVOLk5BQVIuQkVORURFTiAgICAgICAgUFnWUklTVMQuREVTLkFMQVMgICAgICAgICAgICAgICAgICBBUlJPVE9OREEuUEVSLkRJRiAgICAgICAgICAgICAgICAgIEFWUlVOREEuTkVExVQKKyAgICAyMTYgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFJBTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpFUkFSUVVJQSAgICAgICAgICAgICAgICAgICAgICAgICAgT1JERU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQU5HICAgICAgICAgICAgICAgICAgICAgICAgIEFSVk9OLk1VS0FBTiAgICAgICAgICAgICAgICAgICAgICAgUkFOR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQU5HCisgICAgMjE5ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEUkVTU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURSRVNTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVJFQ0NJT04gICAgICAgICAgICAgICAgICAgICAgICAgIEVOREVSRcdPICAgICAgICAgICAgICAgICAgICAgICAgICAgQURSRVMgICAgICAgICAgICAgICAgICAgICAgICBPU09JVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElSSVpaTyAgICAgICAgICAgICAgICAgICAgICAgICAgQURSRVNTCisgICAgMjIwICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBEQVlTMzYwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBR0UzNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9VUlMzNjAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUFTMzYwICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQVMzNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHRU4zNjAgICAgICAgICAgICAgICAgICAgICBQxElWxFQzNjAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJT1JOTzM2MCAgICAgICAgICAgICAgICAgICAgICAgICAgREFHQVIzNjAKKyAgICAyMjEgICAgICAwICAgICAgMSAgICAgICAgICAxICAgICAgICAgIFRPREFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVUpPVVJESFVJICAgICAgICAgICAgICAgICAgICAgICAgIEhPWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE9KRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQU5EQUFHICAgICAgICAgICAgICAgICAgICAgIFTETcQuUMRJVsQgICAgICAgICAgICAgICAgICAgICAgICAgT0dHSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREFHCisgICAgMjIyICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBWREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkRCICAgICAgICAgICAgICAgICAgICAgICAgICBWREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNTU9SVC5WQVIgICAgICAgICAgICAgICAgICAgICAgICAgVkRFR1JBVlNLUgorICAgIDIyNyAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgTUVESUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBQU4gICAgICAgICAgICAgICAgICAgICAgTUVESUFBTkkgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQU5BICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBTgorICAgIDIyOCAgICAgLTEgICAgICAyICAgICAgICAgIDAgICAgICAgICAgU1VNUFJPRFVDVCAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NRU5QUk9EVUtUICAgICAgICAgICAgICAgICAgICAgIFNPTU1FUFJPRCAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNQVBST0RVQ1RPICAgICAgICAgICAgICAgICAgICAgICBTT01BUlBST0RVVE8gICAgICAgICAgICAgICAgICAgICAgIFNPTVBST0RVS1QgICAgICAgICAgICAgICAgICAgVFVMT0pFTi5TVU1NQSAgICAgICAgICAgICAgICAgICAgICBNQVRSLlNPTU1BLlBST0RPVFRPICAgICAgICAgICAgICAgIFBST0RVS1RTVU1NQQorICAgIDIyOSAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgU0lOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU5IWVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VOT0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTkggICAgICAgICAgICAgICAgICAgICAgICAgU0lOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTkgKKyAgICAyMzAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TSFlQICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1NIICAgICAgICAgICAgICAgICAgICAgICAgIENPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1NICisgICAgMjMxICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTkhZUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICBUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOSAorICAgIDIzMiAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQVNJTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNTSU5IWVAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTSU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNFTk9IICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0VOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0dTSU5IICAgICAgICAgICAgICAgICAgICAgQVNJTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNTRU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1NJTkgKKyAgICAyMzMgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEFDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDQ09TSFlQICAgICAgICAgICAgICAgICAgICAgICAgICBBQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09HQ09TSCAgICAgICAgICAgICAgICAgICAgIEFDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNDT1NICisgICAgMjM0ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTkhZUCAgICAgICAgICAgICAgICAgICAgICAgICAgQVRBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PR1RBTkggICAgICAgICAgICAgICAgICAgICBBVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOSAorICAgIDIzNSAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgREdFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkFVU1pVRyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJETElSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRFWFRSQUVSICAgICAgICAgICAgICAgICAgICAgICAgICBCREVYVFJBSVIgICAgICAgICAgICAgICAgICAgICAgICAgIERCTEVaRU4gICAgICAgICAgICAgICAgICAgICAgVE5PVURBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQi5WQUxPUkkgICAgICAgICAgICAgICAgICAgICAgICAgIERIxE1UQQorICAgIDI0NCAgICAgIDEgICAgICAxICAgICAgICAgIDEgICAgICAgICAgSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUk1Bx8NPICAgICAgICAgICAgICAgICAgICAgICAgIElORk8gICAgICAgICAgICAgICAgICAgICAgICAgS1VWQVVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUJJRU5URS5JTkZPICAgICAgICAgICAgICAgICAgICAgIElORk8KKyAgICAyNDcgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIERCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQiAgICAgICAgICAgICAgICAgICAgICAgICAgIERCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1NT1JULkZJU1NPICAgICAgICAgICAgICAgICAgICAgICBEQgorICAgIDI1MiAgICAgIDIgICAgICAwICAgICAgICAgIDAgICAgICAgICAgRlJFUVVFTkNZICAgICAgICAgICAgICAgICAgICAgICAgICBIxFVGSUdLRUlUICAgICAgICAgICAgICAgICAgICAgICAgIEZSRVFVRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgRlJFQ1VFTkNJQSAgICAgICAgICAgICAgICAgICAgICAgICBGUkVR3MpOQ0lBICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgVEFBSlVVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkVRVUVOWkEgICAgICAgICAgICAgICAgICAgICAgICAgIEZSRUtWRU5TCisgICAgMjYxICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBFUlJPUi5UWVBFICAgICAgICAgICAgICAgICAgICAgICAgIEZFSExFUi5UWVAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRS5FUlJFVVIgICAgICAgICAgICAgICAgICAgICAgICBUSVBPLkRFLkVSUk9SICAgICAgICAgICAgICAgICAgICAgIFRJUE8uRVJSTyAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRS5GT1VUICAgICAgICAgICAgICAgICAgICBWSVJIRUVOLkxBSkkgICAgICAgICAgICAgICAgICAgICAgIEVSUk9SRS5USVBPICAgICAgICAgICAgICAgICAgICAgICAgRkVMLlRZUAorICAgIDI2NyAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUkVHSVNURVIuSUQgICAgICAgICAgICAgICAgICAgICAgICBSRUdJU1RFUi5LRU5OVU1NRVIgICAgICAgICAgICAgICAgIFJFR0lTVFJFLk5VTUVSTyAgICAgICAgICAgICAgICAgICAgSUQuUkVHSVNUUk8gICAgICAgICAgICAgICAgICAgICAgICBJREVOVC5SRUdJU1RSTyAgICAgICAgICAgICAgICAgICAgIFJFR0lTVFJBVElFLklEICAgICAgICAgICAgICAgUkVLSVNURVJJLlRVTk5VUyAgICAgICAgICAgICAgICAgICBJREVOVElGSUNBVE9SRS5SRUdJU1RSTyAgICAgICAgICAgIFJFR0lTVFJFUkEuSUQKKyAgICAyNjkgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIEFWRURFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlUVEVMQUJXICAgICAgICAgICAgICAgICAgICAgICAgICBFQ0FSVC5NT1lFTiAgICAgICAgICAgICAgICAgICAgICAgIERFU1ZQUk9NICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVi5NyURJTyAgICAgICAgICAgICAgICAgICAgICAgICBHRU0uREVWSUFUSUUgICAgICAgICAgICAgICAgIEtFU0tJUE9JS0tFQU1BICAgICAgICAgICAgICAgICAgICAgTUVESUEuREVWICAgICAgICAgICAgICAgICAgICAgICAgICBNRURFTEFWVgorICAgIDI3MCAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQkVUQURJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgIExPSS5CRVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTVFIuQkVUQSAgICAgICAgICAgICAgICAgICAgICAgICBESVNUQkVUQSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEuVkVSRCAgICAgICAgICAgICAgICAgICAgQkVFVEFKQUtBVU1BICAgICAgICAgICAgICAgICAgICAgICBESVNUUklCLkJFVEEgICAgICAgICAgICAgICAgICAgICAgIEJFVEFG1lJECisgICAgMjcxICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBHQU1NQUxOICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBTU1BTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE5HQU1NQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQU1NQS5MTiAgICAgICAgICAgICAgICAgICAgICAgICAgIExOR0FNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUEuTE4gICAgICAgICAgICAgICAgICAgICBHQU1NQUxOICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOLkdBTU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUFMTgorICAgIDI3MiAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQkVUQUlOViAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEuSU5WRVJTRSAgICAgICAgICAgICAgICAgICAgICAgRElTVFIuQkVUQS5JTlYgICAgICAgICAgICAgICAgICAgICBCRVRBLkFDVU0uSU5WICAgICAgICAgICAgICAgICAgICAgIEJFVEEuSU5WICAgICAgICAgICAgICAgICAgICAgQkVFVEFKQUtBVU1BLkvExE5UICAgICAgICAgICAgICAgICBJTlYuQkVUQSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEFJTlYKKyAgICAyNzMgICAgICA0ICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEJJTk9NRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgQklOT01WRVJUICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuQklOT01JQUxFICAgICAgICAgICAgICAgICAgICAgIERJU1RSLkJJTk9NICAgICAgICAgICAgICAgICAgICAgICAgRElTVFJCSU5PTSAgICAgICAgICAgICAgICAgICAgICAgICBCSU5PTUlBTEUuVkVSRCAgICAgICAgICAgICAgIEJJTk9NSUpBS0FVTUEgICAgICAgICAgICAgICAgICAgICAgRElTVFJJQi5CSU5PTSAgICAgICAgICAgICAgICAgICAgICBCSU5PTUbWUkQKKyAgICAyNzQgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENISURJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hJVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuS0hJREVVWCAgICAgICAgICAgICAgICAgICAgICAgIERJU1RSLkNISSAgICAgICAgICAgICAgICAgICAgICAgICAgRElTVC5RVUkgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEkuS1dBRFJBQVQgICAgICAgICAgICAgICAgIENISUpBS0FVTUEgICAgICAgICAgICAgICAgICAgICAgICAgRElTVFJJQi5DSEkgICAgICAgICAgICAgICAgICAgICAgICBDSEkyRtZSRAorICAgIDI3NSAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ0hJSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtISURFVVguSU5WRVJTRSAgICAgICAgICAgICAgICAgICAgUFJVRUJBLkNISS5JTlYgICAgICAgICAgICAgICAgICAgICBJTlYuUVVJICAgICAgICAgICAgICAgICAgICAgICAgICAgIENISS5LV0FEUkFBVC5JTlYgICAgICAgICAgICAgQ0hJSkFLQVVNQS5LxMROVCAgICAgICAgICAgICAgICAgICBJTlYuQ0hJICAgICAgICAgICAgICAgICAgICAgICAgICAgIENISTJJTlYKKyAgICAyNzYgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENPTUJJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS09NQklOQVRJT05FTiAgICAgICAgICAgICAgICAgICAgICBDT01CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTUJJTkFUICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01CSU5BVElFUyAgICAgICAgICAgICAgICAgIEtPTUJJTkFBVElPICAgICAgICAgICAgICAgICAgICAgICAgQ09NQklOQVpJT05FICAgICAgICAgICAgICAgICAgICAgICBLT01CSU4KKyAgICAyNzcgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENPTkZJREVOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgS09ORklERU5aICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFUlZBTExFLkNPTkZJQU5DRSAgICAgICAgICAgICAgIElOVEVSVkFMTy5DT05GSUFOWkEgICAgICAgICAgICAgICAgSU5ULkNPTkZJQU7HQSAgICAgICAgICAgICAgICAgICAgICBCRVRST1VXQkFBUkhFSUQgICAgICAgICAgICAgIExVT1RUQU1VU1bETEkgICAgICAgICAgICAgICAgICAgICAgQ09ORklERU5aQSAgICAgICAgICAgICAgICAgICAgICAgICBLT05GSURFTlMKKyAgICAyNzggICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENSSVRCSU5PTSAgICAgICAgICAgICAgICAgICAgICAgICAgS1JJVEJJTk9NICAgICAgICAgICAgICAgICAgICAgICAgICBDUklURVJFLkxPSS5CSU5PTUlBTEUgICAgICAgICAgICAgIEJJTk9NLkNSSVQgICAgICAgICAgICAgICAgICAgICAgICAgQ1JJVC5CSU5PTSAgICAgICAgICAgICAgICAgICAgICAgICBDUklULkJJTk9NICAgICAgICAgICAgICAgICAgIEJJTk9NSUpBS0FVTUEuS1JJVCAgICAgICAgICAgICAgICAgQ1JJVC5CSU5PTSAgICAgICAgICAgICAgICAgICAgICAgICBLUklUQklOT00KKyAgICAyNzkgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEVWRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VSQURFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUlSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRE9OREVBLlBBUiAgICAgICAgICAgICAgICAgICAgICAgUEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVkVOICAgICAgICAgICAgICAgICAgICAgICAgIFBBUklMTElORU4gICAgICAgICAgICAgICAgICAgICAgICAgUEFSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKxE1OCisgICAgMjgwICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBFWFBPTkRJU1QgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUE9OVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkVYUE9ORU5USUVMTEUgICAgICAgICAgICAgICAgICBESVNUUi5FWFAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU1RFWFBPTiAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQT04uVkVSRCAgICAgICAgICAgICAgICAgICBFS1NQT05FTlRJQUFMSUpBS0FVTUEgICAgICAgICAgICAgIERJU1RSSUIuRVhQICAgICAgICAgICAgICAgICAgICAgICAgRVhQT05G1lJECisgICAgMjgxICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBGRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZWRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNUUi5GICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU1RGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRi5WRVJERUxJTkcgICAgICAgICAgICAgICAgICBGSkFLQVVNQSAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU1RSSUIuRiAgICAgICAgICAgICAgICAgICAgICAgICAgRkbWUkQKKyAgICAyODIgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklOViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZFUlNFLkxPSS5GICAgICAgICAgICAgICAgICAgICAgIERJU1RSLkYuSU5WICAgICAgICAgICAgICAgICAgICAgICAgSU5WRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGLklOVkVSU0UgICAgICAgICAgICAgICAgICAgIEZKQUtBVU1BLkvExE5UICAgICAgICAgICAgICAgICAgICAgSU5WLkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSU5WCisgICAgMjgzICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBGSVNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJU0hFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJU0hFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSICAgICAgICAgICAgICAgICAgICAgICBGSVNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJU0hFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSCisgICAgMjg0ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBGSVNIRVJJTlYgICAgICAgICAgICAgICAgICAgICAgICAgIEZJU0hFUklOViAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSLklOVkVSU0UgICAgICAgICAgICAgICAgICAgICBQUlVFQkEuRklTSEVSLklOViAgICAgICAgICAgICAgICAgIEZJU0hFUklOViAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSLklOViAgICAgICAgICAgICAgICAgICBGSVNIRVIuS8TETlQgICAgICAgICAgICAgICAgICAgICAgIElOVi5GSVNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSSU5WCisgICAgMjg1ICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBGTE9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVEVSR1JFTlpFICAgICAgICAgICAgICAgICAgICAgICAgUExBTkNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICBNVUxUSVBMTy5JTkZFUklPUiAgICAgICAgICAgICAgICAgIEFSUkVETVVMVEIgICAgICAgICAgICAgICAgICAgICAgICAgQUZST05ERU4uQkVORURFTiAgICAgICAgICAgICBQWdZSSVNUxC5LRVJSLkFMQVMgICAgICAgICAgICAgICAgIEFSUk9UT05EQS5ESUZFVFRPICAgICAgICAgICAgICAgICAgUlVOREEuTkVSCisgICAgMjg2ICAgICAgNCAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBHQU1NQURJU1QgICAgICAgICAgICAgICAgICAgICAgICAgIEdBTU1BVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkdBTU1BICAgICAgICAgICAgICAgICAgICAgICAgICBESVNUUi5HQU1NQSAgICAgICAgICAgICAgICAgICAgICAgIERJU1RHQU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUEuVkVSRCAgICAgICAgICAgICAgICAgICBHQU1NQUpBS0FVTUEgICAgICAgICAgICAgICAgICAgICAgIERJU1RSSUIuR0FNTUEgICAgICAgICAgICAgICAgICAgICAgR0FNTUFG1lJECisgICAgMjg3ICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBHQU1NQUlOViAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBTU1BSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkdBTU1BLklOVkVSU0UgICAgICAgICAgICAgICAgICBESVNUUi5HQU1NQS5JTlYgICAgICAgICAgICAgICAgICAgIElOVkdBTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUEuSU5WICAgICAgICAgICAgICAgICAgICBHQU1NQUpBS0FVTUEuS8TETlQgICAgICAgICAgICAgICAgIElOVi5HQU1NQSAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUFJTlYKKyAgICAyODggICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENFSUxJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JFUkdSRU5aRSAgICAgICAgICAgICAgICAgICAgICAgICBQTEFGT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VTFRJUExPLlNVUEVSSU9SICAgICAgICAgICAgICAgICAgVEVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRlJPTkRFTi5CT1ZFTiAgICAgICAgICAgICAgIFBZ1lJJU1TELktFUlIuWUzWUyAgICAgICAgICAgICAgICAgQVJST1RPTkRBLkVDQ0VTU08gICAgICAgICAgICAgICAgICBSVU5EQS5VUFAKKyAgICAyODkgICAgICA0ICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEhZUEdFT01ESVNUICAgICAgICAgICAgICAgICAgICAgICAgSFlQR0VPTVZFUlQgICAgICAgICAgICAgICAgICAgICAgICBMT0kuSFlQRVJHRU9NRVRSSVFVRSAgICAgICAgICAgICAgIERJU1RSLkhJUEVSR0VPTSAgICAgICAgICAgICAgICAgICAgRElTVC5ISVBFUkdFT00gICAgICAgICAgICAgICAgICAgICBIWVBFUkdFTy5WRVJEICAgICAgICAgICAgICAgIEhZUEVSR0VPTS5KQUtBVU1BICAgICAgICAgICAgICAgICAgRElTVFJJQi5JUEVSR0VPTSAgICAgICAgICAgICAgICAgICBIWVBHRU9NRtZSRAorICAgIDI5MCAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTE9HTk9STURJU1QgICAgICAgICAgICAgICAgICAgICAgICBMT0dOT1JNVkVSVCAgICAgICAgICAgICAgICAgICAgICAgIExPSS5MT0dOT1JNQUxFICAgICAgICAgICAgICAgICAgICAgRElTVFIuTE9HLk5PUk0gICAgICAgICAgICAgICAgICAgICBESVNULkxPR05PUk1BTCAgICAgICAgICAgICAgICAgICAgIExPRy5OT1JNLlZFUkQgICAgICAgICAgICAgICAgTE9HTk9STS5KQUtBVU1BICAgICAgICAgICAgICAgICAgICBESVNUUklCLkxPR05PUk0gICAgICAgICAgICAgICAgICAgIExPR05PUk1G1lJECisgICAgMjkxICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBMT0dJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0lOViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkxPR05PUk1BTEUuSU5WRVJTRSAgICAgICAgICAgICBESVNUUi5MT0cuSU5WICAgICAgICAgICAgICAgICAgICAgIElOVkxPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HLk5PUk0uSU5WICAgICAgICAgICAgICAgICBMT0dOT1JNLkpBS0FVTUEuS8TETlQgICAgICAgICAgICAgIElOVi5MT0dOT1JNICAgICAgICAgICAgICAgICAgICAgICAgTE9HSU5WCisgICAgMjkyICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBORUdCSU5PTURJU1QgICAgICAgICAgICAgICAgICAgICAgIE5FR0JJTk9NVkVSVCAgICAgICAgICAgICAgICAgICAgICAgTE9JLkJJTk9NSUFMRS5ORUcgICAgICAgICAgICAgICAgICBORUdCSU5PTURJU1QgICAgICAgICAgICAgICAgICAgICAgIERJU1QuQklOLk5FRyAgICAgICAgICAgICAgICAgICAgICAgTkVHLkJJTk9NLlZFUkQgICAgICAgICAgICAgICBCSU5PTUlKQUtBVU1BLk5FRyAgICAgICAgICAgICAgICAgIERJU1RSSUIuQklOT00uTkVHICAgICAgICAgICAgICAgICAgTkVHQklOT01G1lJECisgICAgMjkzICAgICAgNCAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBOT1JNRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1WRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLk5PUk1BTEUgICAgICAgICAgICAgICAgICAgICAgICBESVNUUi5OT1JNICAgICAgICAgICAgICAgICAgICAgICAgIERJU1QuTk9STSAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STS5WRVJEICAgICAgICAgICAgICAgICAgICBOT1JNLkpBS0FVTUEgICAgICAgICAgICAgICAgICAgICAgIERJU1RSSUIuTk9STSAgICAgICAgICAgICAgICAgICAgICAgTk9STUbWUkQKKyAgICAyOTQgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE5PUk1TRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBTkROT1JNVkVSVCAgICAgICAgICAgICAgICAgICAgICBMT0kuTk9STUFMRS5TVEFOREFSRCAgICAgICAgICAgICAgIERJU1RSLk5PUk0uRVNUQU5EICAgICAgICAgICAgICAgICAgRElTVC5OT1JNUCAgICAgICAgICAgICAgICAgICAgICAgICBTVEFORC5OT1JNLlZFUkQgICAgICAgICAgICAgIE5PUk0uSkFLQVVNQS5OT1JNSVQgICAgICAgICAgICAgICAgRElTVFJJQi5OT1JNLlNUICAgICAgICAgICAgICAgICAgICBOT1JNU0bWUkQKKyAgICAyOTUgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE5PUk1JTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STUlOViAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuTk9STUFMRS5JTlZFUlNFICAgICAgICAgICAgICAgIERJU1RSLk5PUk0uSU5WICAgICAgICAgICAgICAgICAgICAgSU5WLk5PUk0gICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNLklOViAgICAgICAgICAgICAgICAgICAgIE5PUk0uSkFLQVVNQS5LxMROVCAgICAgICAgICAgICAgICAgSU5WLk5PUk0gICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNSU5WCisgICAgMjk2ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBOT1JNU0lOViAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQU5ETk9STUlOViAgICAgICAgICAgICAgICAgICAgICAgTE9JLk5PUk1BTEUuU1RBTkRBUkQuSU5WRVJTRSAgICAgICBESVNUUi5OT1JNLkVTVEFORC5JTlYgICAgICAgICAgICAgIElOVi5OT1JNUCAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBTkQuTk9STS5JTlYgICAgICAgICAgICAgICBOT1JNLkpBS0FVTUEuTk9STUlULkvExE5UICAgICAgICAgIElOVi5OT1JNLlNUICAgICAgICAgICAgICAgICAgICAgICAgTk9STVNJTlYKKyAgICAyOTcgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNUQU5EQVJESVpFICAgICAgICAgICAgICAgICAgICAgICAgU1RBTkRBUkRJU0lFUlVORyAgICAgICAgICAgICAgICAgICBDRU5UUkVFLlJFRFVJVEUgICAgICAgICAgICAgICAgICAgIE5PUk1BTElaQUNJT04gICAgICAgICAgICAgICAgICAgICAgUEFEUk9OSVpBUiAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNQUxJU0VSRU4gICAgICAgICAgICAgICAgIE5PUk1JVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STUFMSVpaQSAgICAgICAgICAgICAgICAgICAgICAgICBTVEFOREFSRElTRVJBCisgICAgMjk4ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBPREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOR0VSQURFICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QQUlSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRURPTkRFQS5JTVBBUiAgICAgICAgICAgICAgICAgICAgIM1NUEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT05FVkVOICAgICAgICAgICAgICAgICAgICAgICBQQVJJVE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU1BBUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUREQQorICAgIDI5OSAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUEVSTVVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQVRJT05FTiAgICAgICAgICAgICAgICAgICAgICAgIFBFUk1VVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgUEVSTVVUQUNJT05FUyAgICAgICAgICAgICAgICAgICAgICBQRVJNVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUk1VVEFUSUVTICAgICAgICAgICAgICAgICAgUEVSTVVUQUFUSU8gICAgICAgICAgICAgICAgICAgICAgICBQRVJNVVRBWklPTkUgICAgICAgICAgICAgICAgICAgICAgIFBFUk1VVAorICAgIDMwMCAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUE9JU1NPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0lTU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPSS5QT0lTU09OICAgICAgICAgICAgICAgICAgICAgICAgUE9JU1NPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0lTU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSVNTT04gICAgICAgICAgICAgICAgICAgICAgUE9JU1NPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0lTU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSVNTT04KKyAgICAzMDEgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRESVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuU1RVREVOVCAgICAgICAgICAgICAgICAgICAgICAgIERJU1RSLlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTVFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULlZFUkQgICAgICAgICAgICAgICAgICAgICAgIFRKQUtBVU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTVFJJQi5UICAgICAgICAgICAgICAgICAgICAgICAgICBURtZSRAorICAgIDMwMiAgICAgIDQgICAgICAxICAgICAgICAgIDAgICAgICAgICAgV0VJQlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPSS5XRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICAgRElTVC5XRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICBXRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFSUJVTEwgICAgICAgICAgICAgICAgICAgICAgV0VJQlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFSUJVTEwKKyAgICAzMDMgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIFNVTVhNWTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUVYTVkyICAgICAgICAgICAgICAgICAgICAgICAgICBTT01NRS5YTVkyICAgICAgICAgICAgICAgICAgICAgICAgIFNVTUFYTUVOT1NZMiAgICAgICAgICAgICAgICAgICAgICAgU09NQVhNWTIgICAgICAgICAgICAgICAgICAgICAgICAgICBTT00uWE1JTlkuMiAgICAgICAgICAgICAgICAgIEVST1RVU1RFTi5ORUxJ1lNVTU1BICAgICAgICAgICAgICAgU09NTUEuUS5ESUZGICAgICAgICAgICAgICAgICAgICAgICBTVU1NQVhNWTIKKyAgICAzMDQgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIFNVTVgyTVkyICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUVYMk1ZMiAgICAgICAgICAgICAgICAgICAgICAgICBTT01NRS5YMk1ZMiAgICAgICAgICAgICAgICAgICAgICAgIFNVTUFYMk1FTk9TWTIgICAgICAgICAgICAgICAgICAgICAgU09NQVgyRFkyICAgICAgICAgICAgICAgICAgICAgICAgICBTT00uWDJNSU5ZMiAgICAgICAgICAgICAgICAgIE5FTEnWU1VNTUlFTi5FUk9UVVMgICAgICAgICAgICAgICAgU09NTUEuRElGRi5RICAgICAgICAgICAgICAgICAgICAgICBTVU1NQVgyTVkyCisgICAgMzA1ICAgICAgMiAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBTVU1YMlBZMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1FWDJQWTIgICAgICAgICAgICAgICAgICAgICAgICAgU09NTUUuWDJQWTIgICAgICAgICAgICAgICAgICAgICAgICBTVU1BWDJNQVNZMiAgICAgICAgICAgICAgICAgICAgICAgIFNPTUFYMlNZMiAgICAgICAgICAgICAgICAgICAgICAgICAgU09NLlgyUExVU1kyICAgICAgICAgICAgICAgICBORUxJ1lNVTU1JRU4uU1VNTUEgICAgICAgICAgICAgICAgIFNPTU1BLlNPTU1BLlEgICAgICAgICAgICAgICAgICAgICAgU1VNTUFYMlBZMgorICAgIDMwNiAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgQ0hJVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1QuS0hJREVVWCAgICAgICAgICAgICAgICAgICAgICAgUFJVRUJBLkNISSAgICAgICAgICAgICAgICAgICAgICAgICBURVNURS5RVUkgICAgICAgICAgICAgICAgICAgICAgICAgIENISS5UT0VUUyAgICAgICAgICAgICAgICAgICAgQ0hJVEVTVEkgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNULkNISSAgICAgICAgICAgICAgICAgICAgICAgICAgIENISTJURVNUCisgICAgMzA3ICAgICAgMiAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBDT1JSRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtPUlJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09FRkZJQ0lFTlQuQ09SUkVMQVRJT04gICAgICAgICAgICBDT0VGLkRFLkNPUlJFTCAgICAgICAgICAgICAgICAgICAgIENPUlJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SUkVMQVRJRSAgICAgICAgICAgICAgICAgICBLT1JSRUxBQVRJTyAgICAgICAgICAgICAgICAgICAgICAgIENPUlJFTEFaSU9ORSAgICAgICAgICAgICAgICAgICAgICAgS09SUkVMCisgICAgMzA4ICAgICAgMiAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBDT1ZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtPVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09WQVJJQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICBDT1ZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09WQVJJQU5USUUgICAgICAgICAgICAgICAgICBLT1ZBUklBTlNTSSAgICAgICAgICAgICAgICAgICAgICAgIENPVkFSSUFOWkEgICAgICAgICAgICAgICAgICAgICAgICAgS09WQVIKKyAgICAzMDkgICAgICAzICAgICAgMiAgICAgICAgICAwICAgICAgICAgIEZPUkVDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIxFRaRVIgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVWSVNJT04gICAgICAgICAgICAgICAgICAgICAgICAgIFBST05PU1RJQ08gICAgICAgICAgICAgICAgICAgICAgICAgUFJFVklTw08gICAgICAgICAgICAgICAgICAgICAgICAgICBWT09SU1BFTExFTiAgICAgICAgICAgICAgICAgIEVOTlVTVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFVklTSU9ORSAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUtUSU9OCisgICAgMzEwICAgICAgMiAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBGVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVC5GICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUlVFQkEuRiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRi5UT0VUUyAgICAgICAgICAgICAgICAgICAgICBGVEVTVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1QuRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRFU1QKKyAgICAzMTEgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIElOVEVSQ0VQVCAgICAgICAgICAgICAgICAgICAgICAgICAgQUNIU0VOQUJTQ0hOSVRUICAgICAgICAgICAgICAgICAgICBPUkRPTk5FRS5PUklHSU5FICAgICAgICAgICAgICAgICAgIElOVEVSU0VDQ0lPTiAgICAgICAgICAgICAgICAgICAgICAgSU5URVJDRVDHw08gICAgICAgICAgICAgICAgICAgICAgICBTTklKUFVOVCAgICAgICAgICAgICAgICAgICAgIExFSUtLQVVTUElTVEUgICAgICAgICAgICAgICAgICAgICAgSU5URVJDRVRUQSAgICAgICAgICAgICAgICAgICAgICAgICBTS8RSTklOR1NQVU5LVAorICAgIDMxMiAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgUEVBUlNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUFSU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFQVJTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVBUlNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUFSU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFQVJTT04gICAgICAgICAgICAgICAgICAgICAgUEVBUlNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUFSU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFQVJTT04KKyAgICAzMTMgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIFJTUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVTVElNTVRIRUlUU01BU1MgICAgICAgICAgICAgICAgICBDT0VGRklDSUVOVC5ERVRFUk1JTkFUSU9OICAgICAgICAgIENPRUZJQ0lFTlRFLlIyICAgICAgICAgICAgICAgICAgICAgUlFVQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLktXQURSQUFUICAgICAgICAgICAgICAgICAgIFBFQVJTT04uTkVMSdYgICAgICAgICAgICAgICAgICAgICAgUlEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSS1YKKyAgICAzMTQgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIFNURVlYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RGRUhMRVJZWCAgICAgICAgICAgICAgICAgICAgICAgICBFUlJFVVIuVFlQRS5YWSAgICAgICAgICAgICAgICAgICAgIEVSUk9SLlRJUElDTy5YWSAgICAgICAgICAgICAgICAgICAgRVBBRFlYICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFORC5GT1VULllYICAgICAgICAgICAgICAgIEtFU0tJVklSSEUgICAgICAgICAgICAgICAgICAgICAgICAgRVJSLlNURC5ZWCAgICAgICAgICAgICAgICAgICAgICAgICBTVERGRUxZWAorICAgIDMxNSAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgU0xPUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEVJR1VORyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFTlRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVORElFTlRFICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMSU5Bx8NPICAgICAgICAgICAgICAgICAgICAgICAgIFJJQ0hUSU5HICAgICAgICAgICAgICAgICAgICAgS1VMTUFLRVJST0lOICAgICAgICAgICAgICAgICAgICAgICBQRU5ERU5aQSAgICAgICAgICAgICAgICAgICAgICAgICAgIExVVE5JTkcKKyAgICAzMTYgICAgICA0ICAgICAgMiAgICAgICAgICAwICAgICAgICAgIFRURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNULlNUVURFTlQgICAgICAgICAgICAgICAgICAgICAgIFBSVUVCQS5UICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVEVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULlRPRVRTICAgICAgICAgICAgICAgICAgICAgIFRURVNUSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVC5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVEVTVAorICAgIDMxNyAgICAgLTEgICAgICAyICAgICAgICAgIDAgICAgICAgICAgUFJPQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQUhSU0NIQkVSRUlDSCAgICAgICAgICAgICAgICAgICAgIFBST0JBQklMSVRFICAgICAgICAgICAgICAgICAgICAgICAgUFJPQkFCSUxJREFEICAgICAgICAgICAgICAgICAgICAgICBQUk9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtBTlMgICAgICAgICAgICAgICAgICAgICAgICAgVE9ERU5OxEvWSVNZWVMgICAgICAgICAgICAgICAgICAgICBQUk9CQUJJTElUwCAgICAgICAgICAgICAgICAgICAgICAgIFNBTk5PTElLSEVUCisgICAgMzE4ICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBERVZTUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTVFVQURBQlcgICAgICAgICAgICAgICAgICAgICAgICAgU09NTUUuQ0FSUkVTLkVDQVJUUyAgICAgICAgICAgICAgICBERVNWSUEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1ZRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWLktXQUQgICAgICAgICAgICAgICAgICAgICBPSUtBSVNUVS5ORUxJ1lNVTU1BICAgICAgICAgICAgICAgIERFVi5RICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1ZBREFWVgorICAgIDMxOSAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgR0VPTUVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU9NSVRURUwgICAgICAgICAgICAgICAgICAgICAgICAgIE1PWUVOTkUuR0VPTUVUUklRVUUgICAgICAgICAgICAgICAgTUVESUEuR0VPTSAgICAgICAgICAgICAgICAgICAgICAgICBNyURJQS5HRU9NyVRSSUNBICAgICAgICAgICAgICAgICAgIE1FRVRLLkdFTSAgICAgICAgICAgICAgICAgICAgS0VTS0lBUlZPLkdFT00gICAgICAgICAgICAgICAgICAgICBNRURJQS5HRU9NRVRSSUNBICAgICAgICAgICAgICAgICAgIEdFT01FREVMCisgICAgMzIwICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBIQVJNRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBUk1JVFRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ZRU5ORS5IQVJNT05JUVVFICAgICAgICAgICAgICAgICBNRURJQS5BUk1PICAgICAgICAgICAgICAgICAgICAgICAgIE3JRElBLkhBUk3UTklDQSAgICAgICAgICAgICAgICAgICAgSEFSTS5HRU0gICAgICAgICAgICAgICAgICAgICBLRVNLSUFSVk8uSEFSTSAgICAgICAgICAgICAgICAgICAgIE1FRElBLkFSTU9OSUNBICAgICAgICAgICAgICAgICAgICAgSEFSTU1FREVMCisgICAgMzIxICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBTVU1TUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQURSQVRFU1VNTUUgICAgICAgICAgICAgICAgICAgICAgU09NTUUuQ0FSUkVTICAgICAgICAgICAgICAgICAgICAgICBTVU1BLkNVQURSQURPUyAgICAgICAgICAgICAgICAgICAgIFNPTUFRVUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgS1dBRFJBVEVOU09NICAgICAgICAgICAgICAgICBORUxJ1lNVTU1BICAgICAgICAgICAgICAgICAgICAgICAgIFNPTU1BLlEgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1ZBRFJBVFNVTU1BCisgICAgMzIyICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBLVVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtVUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1VSVE9TSVMgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJUT1NJUyAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1VSVE9TSVMgICAgICAgICAgICAgICAgICAgICBLVVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUlRPU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9QUElHSEVUCisgICAgMzIzICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBTS0VXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSElFRkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09FRkZJQ0lFTlQuQVNZTUVUUklFICAgICAgICAgICAgICBDT0VGSUNJRU5URS5BU0lNRVRSSUEgICAgICAgICAgICAgIERJU1RPUsfDTyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIRUVGSEVJRCAgICAgICAgICAgICAgICAgICBKQUtBVU1BTi5WSU5PVVMgICAgICAgICAgICAgICAgICAgIEFTSU1NRVRSSUEgICAgICAgICAgICAgICAgICAgICAgICAgU05FREhFVAorICAgIDMyNCAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgWlRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1QuWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJVRUJBLlogICAgICAgICAgICAgICAgICAgICAgICAgICBURVNURVogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFouVE9FVFMgICAgICAgICAgICAgICAgICAgICAgWlRFU1RJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNULlogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpURVNUCisgICAgMzI1ICAgICAgMiAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBMQVJHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtHUtZTU1RFICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTkRFLlZBTEVVUiAgICAgICAgICAgICAgICAgICAgICBLLkVTSU1PLk1BWU9SICAgICAgICAgICAgICAgICAgICAgIE1BSU9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JPT1RTVEUgICAgICAgICAgICAgICAgICAgICBTVVVSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQU5ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1TWUlNUQQorICAgIDMyNiAgICAgIDIgICAgICAwICAgICAgICAgIDAgICAgICAgICAgU01BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLS0xFSU5TVEUgICAgICAgICAgICAgICAgICAgICAgICAgIFBFVElURS5WQUxFVVIgICAgICAgICAgICAgICAgICAgICAgSy5FU0lNTy5NRU5PUiAgICAgICAgICAgICAgICAgICAgICBNRU5PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtMRUlOU1RFICAgICAgICAgICAgICAgICAgICAgUElFTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSUNDT0xPICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlNUQQorICAgIDMyNyAgICAgIDIgICAgICAwICAgICAgICAgIDAgICAgICAgICAgUVVBUlRJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFSVElMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQVJUSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VBUlRJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFSVElMICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtXQVJUSUVMICAgICAgICAgICAgICAgICAgICAgTkVMSsROTkVTICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFSVElMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIEtWQVJUSUwKKyAgICAzMjggICAgICAyICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFBFUkNFTlRJTEUgICAgICAgICAgICAgICAgICAgICAgICAgUVVBTlRJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRU5USUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUkNFTlRJTCAgICAgICAgICAgICAgICAgICAgICAgICAgUEVSQ0VOVElMICAgICAgICAgICAgICAgICAgICAgICAgICBQRVJDRU5USUVMICAgICAgICAgICAgICAgICAgIFBST1NFTlRUSVBJU1RFICAgICAgICAgICAgICAgICAgICAgUEVSQ0VOVElMRSAgICAgICAgICAgICAgICAgICAgICAgICBQRVJDRU5USUwKKyAgICAzMjkgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFBFUkNFTlRSQU5LICAgICAgICAgICAgICAgICAgICAgICAgUVVBTlRJTFNSQU5HICAgICAgICAgICAgICAgICAgICAgICBSQU5HLlBPVVJDRU5UQUdFICAgICAgICAgICAgICAgICAgIFJBTkdPLlBFUkNFTlRJTCAgICAgICAgICAgICAgICAgICAgT1JERU0uUE9SQ0VOVFVBTCAgICAgICAgICAgICAgICAgICBQRVJDRU5ULlJBTkcgICAgICAgICAgICAgICAgIFBST1NFTlRUSUrEUkpFU1RZUyAgICAgICAgICAgICAgICAgUEVSQ0VOVC5SQU5HTyAgICAgICAgICAgICAgICAgICAgICBQUk9DRU5UUkFORworICAgIDMzMCAgICAgLTEgICAgICAyICAgICAgICAgIDAgICAgICAgICAgTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RBTFdFUlQgICAgICAgICAgICAgICAgICAgICAgICAgIE1PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVTICAgICAgICAgICAgICAgICAgICAgICAgTU9PREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUFbEUkRFCisgICAgMzMxICAgICAgMiAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBUUklNTUVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFU1RVVFpUTUlUVEVMICAgICAgICAgICAgICAgICAgICAgTU9ZRU5ORS5SRURVSVRFICAgICAgICAgICAgICAgICAgICBNRURJQS5BQ09UQURBICAgICAgICAgICAgICAgICAgICAgIE3JRElBLklOVEVSTkEgICAgICAgICAgICAgICAgICAgICAgR0VUUklNRC5HRU0gICAgICAgICAgICAgICAgICBLRVNLSUFSVk8uVEFTQVRUVSAgICAgICAgICAgICAgICAgIE1FRElBLlRST05DQVRBICAgICAgICAgICAgICAgICAgICAgVFJJTU1FREVMCisgICAgMzMyICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLlNUVURFTlQuSU5WRVJTRSAgICAgICAgICAgICAgICBESVNUUi5ULklOViAgICAgICAgICAgICAgICAgICAgICAgIElOVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5JTlYgICAgICAgICAgICAgICAgICAgICAgICBUSkFLQVVNQS5LxMROVCAgICAgICAgICAgICAgICAgICAgIElOVi5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElOVgorICAgIDMzNiAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ09OQ0FURU5BVEUgICAgICAgICAgICAgICAgICAgICAgICBWRVJLRVRURU4gICAgICAgICAgICAgICAgICAgICAgICAgIENPTkNBVEVORVIgICAgICAgICAgICAgICAgICAgICAgICAgQ09OQ0FURU5BUiAgICAgICAgICAgICAgICAgICAgICAgICBDT05DQVRFTkFSICAgICAgICAgICAgICAgICAgICAgICAgIFRFS1NULlNBTUVOVk9FR0VOICAgICAgICAgICAgS0VUSlVUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05DQVRFTkEgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTU1BTkZPR0EKKyAgICAzMzcgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFBPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9URU5aICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVUlTU0FOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIFBPVEVOQ0lBICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9Uyk5DSUEgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNIVCAgICAgICAgICAgICAgICAgICAgICAgIFBPVEVOU1NJICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9URU5aQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUFBI1kpULlRJTEwKKyAgICAzNDIgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFJBRElBTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFESUFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQURJQU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBRElBTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFESUFOT1MgICAgICAgICAgICAgICAgICAgICAgICAgICBSQURJQUxFTiAgICAgICAgICAgICAgICAgICAgIFJBRElBQU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgUkFESUFOVEkgICAgICAgICAgICAgICAgICAgICAgICAgICBSQURJQU5FUgorICAgIDM0MyAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgREVHUkVFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFR1JFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBRE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQURFTiAgICAgICAgICAgICAgICAgICAgICAgQVNURUVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQURFUgorICAgIDM0NCAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgU1VCVE9UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICBURUlMRVJHRUJOSVMgICAgICAgICAgICAgICAgICAgICAgIFNPVVMuVE9UQUwgICAgICAgICAgICAgICAgICAgICAgICAgU1VCVE9UQUxFUyAgICAgICAgICAgICAgICAgICAgICAgICBTVUJUT1RBTCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlRPVEFBTCAgICAgICAgICAgICAgICAgICAgVsRMSVNVTU1BICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJUT1RBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIERFTFNVTU1BCisgICAgMzQ1ICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBTVU1JRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1FV0VOTiAgICAgICAgICAgICAgICAgICAgICAgICAgU09NTUUuU0kgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1BUi5TSSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTUFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09NLkFMUyAgICAgICAgICAgICAgICAgICAgICBTVU1NQS5KT1MgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTU1BLlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUEuT00KKyAgICAzNDYgICAgICAyICAgICAgMCAgICAgICAgICAwICAgICAgICAgIENPVU5USUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgWsRITEVOV0VOTiAgICAgICAgICAgICAgICAgICAgICAgICBOQi5TSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRBUi5TSSAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVC5TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQU5UQUwuQUxTICAgICAgICAgICAgICAgICAgIExBU0tFLkpPUyAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEEuU0UgICAgICAgICAgICAgICAgICAgICAgICAgICBBTlRBTC5PTQorICAgIDM0NyAgICAgIDEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgQ09VTlRCTEFOSyAgICAgICAgICAgICAgICAgICAgICAgICBBTlpBSExMRUVSRVpFTExFTiAgICAgICAgICAgICAgICAgIE5CLlZJREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEFSLkJMQU5DTyAgICAgICAgICAgICAgICAgICAgICBDT05UQVIuVkFaSU8gICAgICAgICAgICAgICAgICAgICAgIEFBTlRBTC5MRUdFLkNFTExFTiAgICAgICAgICAgTEFTS0UuVFlISsRUICAgICAgICAgICAgICAgICAgICAgICBDT05UQS5WVU9URSAgICAgICAgICAgICAgICAgICAgICAgIEFOVEFMLlRPTU1BCisgICAgMzU0ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBST01BTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFLWTUlTQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1FUk8uUk9NQU5PICAgICAgICAgICAgICAgICAgICAgIFJPTUFOTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9NRUlOUyAgICAgICAgICAgICAgICAgICAgICBST01BTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPTUFOTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9NRVJTSworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9mdW5jdGlvbl9sb2NhbGUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB3cml0ZUExLnBsCisKKworCitUaGlzIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGV4dGVuZCB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgorCitDb2RlIGlzIGFwcGVuZGVkIHRvIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya3NoZWV0IG1vZHVsZSBieSByZXVzaW5nCit0aGUgcGFja2FnZSBuYW1lLiBUaGUgbmV3IGNvZGUgcHJvdmlkZXMgYSB3cml0ZSgpIG1ldGhvZCB0aGF0IGFsbG93cyB5b3UgdG8KK3VzZSBFeGNlbHMgQTEgc3R5bGUgY2VsbCByZWZlcmVuY2VzLiAgVGhpcyBpcyBub3QgcGFydGljdWxhcmx5IHVzZWZ1bCBidXQgaXQKK3NlcnZlcyBhcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgbW9kdWxlIGNhbiBiZSBleHRlbmRlZCB3aXRob3V0IG1vZGlmeWluZyB0aGUKK2NvZGUgZGlyZWN0bHkuCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gZXh0ZW5kIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuCisgICAgIworICAgICMgQ29kZSBpcyBhcHBlbmRlZCB0byB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldCBtb2R1bGUgYnkgcmV1c2luZworICAgICMgdGhlIHBhY2thZ2UgbmFtZS4gVGhlIG5ldyBjb2RlIHByb3ZpZGVzIGEgd3JpdGUoKSBtZXRob2QgdGhhdCBhbGxvd3MgeW91IHRvCisgICAgIyB1c2UgRXhjZWxzIEExIHN0eWxlIGNlbGwgcmVmZXJlbmNlcy4gIFRoaXMgaXMgbm90IHBhcnRpY3VsYXJseSB1c2VmdWwgYnV0IGl0CisgICAgIyBzZXJ2ZXMgYXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIG1vZHVsZSBjYW4gYmUgZXh0ZW5kZWQgd2l0aG91dCBtb2RpZnlpbmcgdGhlCisgICAgIyBjb2RlIGRpcmVjdGx5LgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGNhbGxlZCBzaW1wbGUueGxzIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygid3JpdGVBMS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBXcml0ZSBudW1iZXJzIG9yIHRleHQKKyAgICAkd29ya3NoZWV0LT53cml0ZSAgKDAsIDAsICJIZWxsbyIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlQTEoIkEzIiwgIkEzIiAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVBMSgiQTUiLCAxLjIzNDUgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya3NoZWV0CisgICAgIyBwYWNrYWdlLgorICAgICMKKyAgICAKKyAgICBwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3Jrc2hlZXQ7CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIHdyaXRlQTEoJGNlbGwsICR0b2tlbiwgJGZvcm1hdCkKKyAgICAjCisgICAgIyBDb252ZXJ0ICRjZWxsIGZyb20gRXhjZWwgQTEgbm90YXRpb24gdG8gJHJvdywgJGNvbCBub3RhdGlvbiBhbmQKKyAgICAjIGNhbGwgd3JpdGUoKSBvbiAkdG9rZW4uCisgICAgIworICAgICMgUmV0dXJuczogcmV0dXJuIHZhbHVlIG9mIGNhbGxlZCBzdWJyb3V0aW5lIG9yIC00IGZvciBpbnZhbGlkIGNlbGwKKyAgICAjIHJlZmVyZW5jZS4KKyAgICAjCisgICAgc3ViIHdyaXRlQTEgeworICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgICAgICBteSAkY29sOworICAgICAgICBteSAkcm93OworICAgIAorICAgICAgICBpZiAoJGNlbGwgPX4gLyhbQS16XSspKFxkKykvKSB7CisgICAgICAgICAgICgkcm93LCAkY29sKSA9IF9jb252ZXJ0QTEoJDIsICQxKTsKKyAgICAgICAgICAgJHNlbGYtPndyaXRlKCRyb3csICRjb2wsIEBfKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtNDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgX2NvbnZlcnRBMSgkcm93LCAkY29sKQorICAgICMKKyAgICAjIENvbnZlcnQgRXhjZWwgQTEgbm90YXRpb24gdG8gJHJvdywgJGNvbCBub3RhdGlvbi4gQ29udmVydCBiYXNlMjYgY29sdW1uCisgICAgIyBzdHJpbmcgdG8gYSBudW1iZXIuCisgICAgIworICAgIHN1YiBfY29udmVydEExIHsKKyAgICAgICAgbXkgJHJvdyAgICA9ICRfWzBdOworICAgICAgICBteSAkY29sICAgID0gJF9bMV07ICMgU3RyaW5nIGluIEFBIG5vdGF0aW9uCisgICAgCisgICAgICAgIG15IEBjaGFycyAgPSBzcGxpdCAvLywgJGNvbDsKKyAgICAgICAgbXkgJGV4cG4gICA9IDA7CisgICAgICAgICRjb2wgICAgICAgPSAwOworICAgIAorICAgICAgICB3aGlsZSAoQGNoYXJzKSB7CisgICAgICAgICAgICBteSAkY2hhciA9IHVjKHBvcChAY2hhcnMpKTsgIyBMUyBjaGFyIGZpcnN0CisgICAgICAgICAgICAkY29sICs9IChvcmQoJGNoYXIpIC1vcmQoJ0EnKSArMSkgKiAoMjYqKiRleHBuKTsKKyAgICAgICAgICAgICRleHBuKys7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgIyBDb252ZXJ0IDEgaW5kZXggdG8gMCBpbmRleAorICAgICAgICAkcm93LS07CisgICAgICAgICRjb2wtLTsKKyAgICAKKyAgICAgICAgcmV0dXJuKCRyb3csICRjb2wpOworICAgIH0KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvd3JpdGVBMS5wbD4KKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCitDb250cmlidXRlZCBleGFtcGxlcyBjb250YWluIHRoZSBvcmlnaW5hbCBhdXRob3IncyBuYW1lLgorCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Gb3JtYXQucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0Zvcm1hdC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjE1ZmYyCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Gb3JtYXQucG0KQEAgLTAsMCArMSw4MTMgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBGb3JtYXQgLSBBIGNsYXNzIGZvciBkZWZpbmluZyBFeGNlbCBmb3JtYXR0aW5nLgorIworIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2UgRXhwb3J0ZXI7Cit1c2Ugc3RyaWN0OwordXNlIENhcnA7CisKKworCisKKworCit1c2UgdmFycyBxdygkQVVUT0xPQUQgJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIyBDb25zdHJ1Y3RvcgorIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgID0gc2hpZnQ7CisKKyAgICBteSAkc2VsZiAgID0geworICAgICAgICAgICAgICAgICAgICBfeGZfaW5kZXggICAgICAgPT4gc2hpZnQgfHwgMCwKKworICAgICAgICAgICAgICAgICAgICBfdHlwZSAgICAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfaW5kZXggICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9mb250ICAgICAgICAgICA9PiAnQXJpYWwnLAorICAgICAgICAgICAgICAgICAgICBfc2l6ZSAgICAgICAgICAgPT4gMTAsCisgICAgICAgICAgICAgICAgICAgIF9ib2xkICAgICAgICAgICA9PiAweDAxOTAsCisgICAgICAgICAgICAgICAgICAgIF9pdGFsaWMgICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfY29sb3IgICAgICAgICAgPT4gMHg3RkZGLAorICAgICAgICAgICAgICAgICAgICBfdW5kZXJsaW5lICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfc3RyaWtlb3V0ID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9mb250X291dGxpbmUgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfZm9udF9zaGFkb3cgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfc2NyaXB0ICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9mb250X2ZhbWlseSAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfZm9udF9jaGFyc2V0ICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfZW5jb2RpbmcgID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgX251bV9mb3JtYXQgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9udW1fZm9ybWF0X2VuYyA9PiAwLAorCisgICAgICAgICAgICAgICAgICAgIF9oaWRkZW4gICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfbG9ja2VkICAgICAgICAgPT4gMSwKKworICAgICAgICAgICAgICAgICAgICBfdGV4dF9oX2FsaWduICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX3RleHRfd3JhcCAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF90ZXh0X3ZfYWxpZ24gICA9PiAyLAorICAgICAgICAgICAgICAgICAgICBfdGV4dF9qdXN0bGFzdCAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX3JvdGF0aW9uICAgICAgID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgX2ZnX2NvbG9yICAgICAgID0+IDB4NDAsCisgICAgICAgICAgICAgICAgICAgIF9iZ19jb2xvciAgICAgICA9PiAweDQxLAorCisgICAgICAgICAgICAgICAgICAgIF9wYXR0ZXJuICAgICAgICA9PiAwLAorCisgICAgICAgICAgICAgICAgICAgIF9ib3R0b20gICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfdG9wICAgICAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2xlZnQgICAgICAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9yaWdodCAgICAgICAgICA9PiAwLAorCisgICAgICAgICAgICAgICAgICAgIF9ib3R0b21fY29sb3IgICA9PiAweDQwLAorICAgICAgICAgICAgICAgICAgICBfdG9wX2NvbG9yICAgICAgPT4gMHg0MCwKKyAgICAgICAgICAgICAgICAgICAgX2xlZnRfY29sb3IgICAgID0+IDB4NDAsCisgICAgICAgICAgICAgICAgICAgIF9yaWdodF9jb2xvciAgICA9PiAweDQwLAorCisgICAgICAgICAgICAgICAgICAgIF9pbmRlbnQgICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfc2hyaW5rICAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX21lcmdlX3JhbmdlICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9yZWFkaW5nX29yZGVyICA9PiAwLAorCisgICAgICAgICAgICAgICAgICAgIF9kaWFnX3R5cGUgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfZGlhZ19jb2xvciAgICAgPT4gMHg0MCwKKyAgICAgICAgICAgICAgICAgICAgX2RpYWdfYm9yZGVyICAgID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfb25seSAgICAgID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgIyBUZW1wIGNvZGUgdG8gcHJldmVudCBtZXJnZWQgZm9ybWF0cyBpbiBub24tbWVyZ2VkIGNlbGxzLgorICAgICAgICAgICAgICAgICAgICBfdXNlZF9tZXJnZSAgICAgPT4gMCwKKworICAgICAgICAgICAgICAgICB9OworCisgICAgYmxlc3MgICRzZWxmLCAkY2xhc3M7CisKKyAgICAjIFNldCBwcm9wZXJ0aWVzIHBhc3NlZCB0byBXb3JrYm9vazo6YWRkX2Zvcm1hdCgpCisgICAgJHNlbGYtPnNldF9mb3JtYXRfcHJvcGVydGllcyhAXykgaWYgQF87CisKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjb3B5KCRmb3JtYXQpCisjCisjIENvcHkgdGhlIGF0dHJpYnV0ZXMgb2YgYW5vdGhlciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0IG9iamVjdC4KKyMKK3N1YiBjb3B5IHsKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkb3RoZXIgPSAkX1swXTsKKworICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkb3RoZXI7CisgICAgcmV0dXJuIHVubGVzcyAocmVmKCRzZWxmKSBlcSByZWYoJG90aGVyKSk7CisKKyAgICAjIFN0b3JlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2UgZG9uJ3Qgd2FudCBvdmVyd3JpdHRlbi4KKyAgICBteSAkeGYgICAgICAgICAgICAgICAgICA9ICRzZWxmLT57X3hmX2luZGV4fTsKKyAgICBteSAkbWVyZ2VfcmFuZ2UgICAgICAgICA9ICRzZWxmLT57X21lcmdlX3JhbmdlfTsKKyAgICBteSAkdXNlZF9tZXJnZSAgICAgICAgICA9ICRzZWxmLT57X3VzZWRfbWVyZ2V9OworCisgICAgJSRzZWxmICAgICAgICAgICAgICAgICAgPSAlJG90aGVyOyAjIENvcHkgcHJvcGVydGllcworCisgICAgIyBSZXN0b3JlIHNhdmVkIHByb3BlcnRpZXMuCisgICAgJHNlbGYtPntfeGZfaW5kZXh9ICAgICAgPSAkeGY7CisgICAgJHNlbGYtPntfbWVyZ2VfcmFuZ2V9ICAgPSAkbWVyZ2VfcmFuZ2U7CisgICAgJHNlbGYtPntfdXNlZF9tZXJnZX0gICAgPSAkdXNlZF9tZXJnZTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF94Zigkc3R5bGUpCisjCisjIEdlbmVyYXRlIGFuIEV4Y2VsIEJJRkYgWEYgcmVjb3JkLgorIworc3ViIGdldF94ZiB7CisKKyAgICB1c2UgaW50ZWdlcjsgICAgIyBBdm9pZCA8PCBzaGlmdCBidWcgaW4gUGVybCA1LjYuMCBvbiBIUC1VWAorCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQ7ICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aDsgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGlmbnQ7ICAgICAgICMgSW5kZXggdG8gRk9OVCByZWNvcmQKKyAgICBteSAkaWZtdDsgICAgICAgIyBJbmRleCB0byBGT1JNQVQgcmVjb3JkCisgICAgbXkgJHN0eWxlOyAgICAgICMgU3R5bGUgYW5kIG90aGVyIG9wdGlvbnMKKyAgICBteSAkYWxpZ247ICAgICAgIyBBbGlnbm1lbnQKKyAgICBteSAkaW5kZW50OyAgICAgIworICAgIG15ICRpY3Y7ICAgICAgICAjIGZnIGFuZCBiZyBwYXR0ZXJuIGNvbG9ycworICAgIG15ICRib3JkZXIxOyAgICAjIEJvcmRlciBsaW5lIG9wdGlvbnMKKyAgICBteSAkYm9yZGVyMjsgICAgIyBCb3JkZXIgbGluZSBvcHRpb25zCisgICAgbXkgJGJvcmRlcjM7ICAgICMgQm9yZGVyIGxpbmUgb3B0aW9ucworCisKKyAgICAjIFNldCB0aGUgdHlwZSBvZiB0aGUgWEYgcmVjb3JkIGFuZCBzb21lIG9mIHRoZSBhdHRyaWJ1dGVzLgorICAgIGlmICgkc2VsZi0+e190eXBlfSA9PSAweEZGRjUpIHsKKyAgICAgICAgJHN0eWxlID0gMHhGRkY1OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHN0eWxlICAgPSAkc2VsZi0+e19sb2NrZWR9OworICAgICAgICAkc3R5bGUgIHw9ICRzZWxmLT57X2hpZGRlbn0gPDwgMTsKKyAgICB9CisKKworICAgICMgRmxhZ3MgdG8gaW5kaWNhdGUgaWYgYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0LgorICAgIG15ICRhdHJfbnVtICAgICA9ICgkc2VsZi0+e19udW1fZm9ybWF0fSAgICAgIT0gMCk7CisKKyAgICBteSAkYXRyX2ZudCAgICAgPSAoJHNlbGYtPntfZm9udF9pbmRleH0gICAgICE9IDApOworCisgICAgbXkgJGF0cl9hbGMgICAgID0gKCRzZWxmLT57X3RleHRfaF9hbGlnbn0gICAhPSAwICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e190ZXh0X3ZfYWxpZ259ICAgIT0gMiAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfc2hyaW5rfSAgICAgICAgICE9IDAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X21lcmdlX3JhbmdlfSAgICAhPSAwICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e190ZXh0X3dyYXB9ICAgICAgIT0gMCAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfaW5kZW50fSAgICAgICAgICE9IDApID8gMSA6IDA7CisKKyAgICBteSAkYXRyX2JkciAgICAgPSAoJHNlbGYtPntfYm90dG9tfSAgICAgICAgICE9IDAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X3RvcH0gICAgICAgICAgICAhPSAwICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19sZWZ0fSAgICAgICAgICAgIT0gMCAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfcmlnaHR9ICAgICAgICAgICE9IDAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X2RpYWdfdHlwZX0gICAgICAhPSAwKSA/IDE6IDA7CisKKyAgICBteSAkYXRyX3BhdCAgICAgPSAoJHNlbGYtPntfZmdfY29sb3J9ICAgICAgICE9IDB4NDAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X2JnX2NvbG9yfSAgICAgICAhPSAweDQxICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19wYXR0ZXJufSAgICAgICAgIT0gMHgwMCkgPyAxIDogMDsKKworICAgIG15ICRhdHJfcHJvdCAgICA9ICgkc2VsZi0+e19oaWRkZW59ICAgICAgICAgIT0gMCAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfbG9ja2VkfSAgICAgICAgICE9IDEpID8gMSA6IDA7CisKKworICAgICMgU2V0IGF0dHJpYnV0ZSBjaGFuZ2VkIGZsYWdzIGZvciB0aGUgc3R5bGUgZm9ybWF0cy4KKyAgICBpZiAoJHNlbGYtPntfeGZfaW5kZXh9ICE9IDAgYW5kICRzZWxmLT57X3R5cGV9ID09IDB4RkZGNSkgeworCisgICAgICAgIGlmICgkc2VsZi0+e194Zl9pbmRleH0gPj0gMTYpIHsKKyAgICAgICAgICAgICRhdHJfbnVtICAgID0gMDsKKyAgICAgICAgICAgICRhdHJfZm50ICAgID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRhdHJfbnVtICAgID0gMTsKKyAgICAgICAgICAgICRhdHJfZm50ICAgID0gMDsKKyAgICAgICAgfQorCisgICAgICAgICRhdHJfYWxjICAgID0gMTsKKyAgICAgICAgJGF0cl9iZHIgICAgPSAxOworICAgICAgICAkYXRyX3BhdCAgICA9IDE7CisgICAgICAgICRhdHJfcHJvdCAgID0gMTsKKyAgICB9CisKKworICAgICMgU2V0IGEgZGVmYXVsdCBkaWFnb25hbCBib3JkZXIgc3R5bGUgaWYgbm9uZSB3YXMgc3BlY2lmaWVkLgorICAgICRzZWxmLT57X2RpYWdfYm9yZGVyfSA9IDEgaWYgISRzZWxmLT57X2RpYWdfYm9yZGVyfSBhbmQgJHNlbGYtPntfZGlhZ190eXBlfTsKKworCisgICAgIyBSZXNldCB0aGUgZGVmYXVsdCBjb2xvdXJzIGZvciB0aGUgbm9uLWZvbnQgcHJvcGVydGllcworICAgICRzZWxmLT57X2ZnX2NvbG9yfSAgICAgPSAweDQwIGlmICRzZWxmLT57X2ZnX2NvbG9yfSAgICAgPT0gMHg3RkZGOworICAgICRzZWxmLT57X2JnX2NvbG9yfSAgICAgPSAweDQxIGlmICRzZWxmLT57X2JnX2NvbG9yfSAgICAgPT0gMHg3RkZGOworICAgICRzZWxmLT57X2JvdHRvbV9jb2xvcn0gPSAweDQwIGlmICRzZWxmLT57X2JvdHRvbV9jb2xvcn0gPT0gMHg3RkZGOworICAgICRzZWxmLT57X3RvcF9jb2xvcn0gICAgPSAweDQwIGlmICRzZWxmLT57X3RvcF9jb2xvcn0gICAgPT0gMHg3RkZGOworICAgICRzZWxmLT57X2xlZnRfY29sb3J9ICAgPSAweDQwIGlmICRzZWxmLT57X2xlZnRfY29sb3J9ICAgPT0gMHg3RkZGOworICAgICRzZWxmLT57X3JpZ2h0X2NvbG9yfSAgPSAweDQwIGlmICRzZWxmLT57X3JpZ2h0X2NvbG9yfSAgPT0gMHg3RkZGOworICAgICRzZWxmLT57X2RpYWdfY29sb3J9ICAgPSAweDQwIGlmICRzZWxmLT57X2RpYWdfY29sb3J9ICAgPT0gMHg3RkZGOworCisKKyAgICAjIFplcm8gdGhlIGRlZmF1bHQgYm9yZGVyIGNvbG91ciBpZiB0aGUgYm9yZGVyIGhhcyBub3QgYmVlbiBzZXQuCisgICAgJHNlbGYtPntfYm90dG9tX2NvbG9yfSA9IDAgaWYgJHNlbGYtPntfYm90dG9tfSAgICA9PSAwOworICAgICRzZWxmLT57X3RvcF9jb2xvcn0gICAgPSAwIGlmICRzZWxmLT57X3RvcH0gICAgICAgPT0gMDsKKyAgICAkc2VsZi0+e19yaWdodF9jb2xvcn0gID0gMCBpZiAkc2VsZi0+e19yaWdodH0gICAgID09IDA7CisgICAgJHNlbGYtPntfbGVmdF9jb2xvcn0gICA9IDAgaWYgJHNlbGYtPntfbGVmdH0gICAgICA9PSAwOworICAgICRzZWxmLT57X2RpYWdfY29sb3J9ICAgPSAwIGlmICRzZWxmLT57X2RpYWdfdHlwZX0gPT0gMDsKKworCisgICAgIyBUaGUgZm9sbG93aW5nIDIgbG9naWNhbCBzdGF0ZW1lbnRzIHRha2UgY2FyZSBvZiBzcGVjaWFsIGNhc2VzIGluIHJlbGF0aW9uCisgICAgIyB0byBjZWxsIGNvbG91cnMgYW5kIHBhdHRlcm5zOgorICAgICMgMS4gRm9yIGEgc29saWQgZmlsbCAoX3BhdHRlcm4gPT0gMSkgRXhjZWwgcmV2ZXJzZXMgdGhlIHJvbGUgb2YgZm9yZWdyb3VuZAorICAgICMgICAgYW5kIGJhY2tncm91bmQgY29sb3Vycy4KKyAgICAjIDIuIElmIHRoZSB1c2VyIHNwZWNpZmllcyBhIGZvcmVncm91bmQgb3IgYmFja2dyb3VuZCBjb2xvdXIgd2l0aG91dCBhCisgICAgIyAgICBwYXR0ZXJuIHRoZXkgcHJvYmFibHkgd2FudGVkIGEgc29saWQgZmlsbCwgc28gd2UgZmlsbCBpbiB0aGUgZGVmYXVsdHMuCisgICAgIworICAgIGlmICgkc2VsZi0+e19wYXR0ZXJufSAgPD0gMHgwMSBhbmQKKyAgICAgICAgJHNlbGYtPntfYmdfY29sb3J9ICE9IDB4NDEgYW5kCisgICAgICAgICRzZWxmLT57X2ZnX2NvbG9yfSA9PSAweDQwICAgICkKKyAgICB7CisgICAgICAgICRzZWxmLT57X2ZnX2NvbG9yfSA9ICRzZWxmLT57X2JnX2NvbG9yfTsKKyAgICAgICAgJHNlbGYtPntfYmdfY29sb3J9ID0gMHg0MDsKKyAgICAgICAgJHNlbGYtPntfcGF0dGVybn0gID0gMTsKKyAgICB9CisKKyAgICBpZiAoJHNlbGYtPntfcGF0dGVybn0gIDw9IDB4MDEgYW5kCisgICAgICAgICRzZWxmLT57X2JnX2NvbG9yfSA9PSAweDQxIGFuZAorICAgICAgICAkc2VsZi0+e19mZ19jb2xvcn0gIT0gMHg0MCAgICApCisgICAgeworICAgICAgICAkc2VsZi0+e19iZ19jb2xvcn0gPSAweDQwOworICAgICAgICAkc2VsZi0+e19wYXR0ZXJufSAgPSAxOworICAgIH0KKworCisgICAgIyBTZXQgZGVmYXVsdCBhbGlnbm1lbnQgaWYgaW5kZW50IGlzIHNldC4KKyAgICAkc2VsZi0+e190ZXh0X2hfYWxpZ259ID0gMSBpZiAkc2VsZi0+e19pbmRlbnR9IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X3RleHRfaF9hbGlnbn0gPT0gMDsKKworCisgICAgJHJlY29yZCAgICAgICAgID0gMHgwMEUwOworICAgICRsZW5ndGggICAgICAgICA9IDB4MDAxNDsKKworICAgICRpZm50ICAgICAgICAgICA9ICRzZWxmLT57X2ZvbnRfaW5kZXh9OworICAgICRpZm10ICAgICAgICAgICA9ICRzZWxmLT57X251bV9mb3JtYXR9OworCisKKyAgICAkYWxpZ24gICAgICAgICAgPSAkc2VsZi0+e190ZXh0X2hfYWxpZ259OworICAgICRhbGlnbiAgICAgICAgIHw9ICRzZWxmLT57X3RleHRfd3JhcH0gICAgIDw8IDM7CisgICAgJGFsaWduICAgICAgICAgfD0gJHNlbGYtPntfdGV4dF92X2FsaWdufSAgPDwgNDsKKyAgICAkYWxpZ24gICAgICAgICB8PSAkc2VsZi0+e190ZXh0X2p1c3RsYXN0fSA8PCA3OworICAgICRhbGlnbiAgICAgICAgIHw9ICRzZWxmLT57X3JvdGF0aW9ufSAgICAgIDw8IDg7CisKKworCisgICAgJGluZGVudCAgICAgICAgID0gJHNlbGYtPntfaW5kZW50fTsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkc2VsZi0+e19zaHJpbmt9ICAgICAgICA8PCA0OworICAgICRpbmRlbnQgICAgICAgIHw9ICRzZWxmLT57X21lcmdlX3JhbmdlfSAgIDw8IDU7CisgICAgJGluZGVudCAgICAgICAgfD0gJHNlbGYtPntfcmVhZGluZ19vcmRlcn0gPDwgNjsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX251bSAgICAgICAgICAgICAgICA8PCAxMDsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX2ZudCAgICAgICAgICAgICAgICA8PCAxMTsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX2FsYyAgICAgICAgICAgICAgICA8PCAxMjsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX2JkciAgICAgICAgICAgICAgICA8PCAxMzsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX3BhdCAgICAgICAgICAgICAgICA8PCAxNDsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX3Byb3QgICAgICAgICAgICAgICA8PCAxNTsKKworCisgICAgJGJvcmRlcjEgICAgICAgID0gJHNlbGYtPntfbGVmdH07CisgICAgJGJvcmRlcjEgICAgICAgfD0gJHNlbGYtPntfcmlnaHR9ICAgICAgICAgPDwgNDsKKyAgICAkYm9yZGVyMSAgICAgICB8PSAkc2VsZi0+e190b3B9ICAgICAgICAgICA8PCA4OworICAgICRib3JkZXIxICAgICAgIHw9ICRzZWxmLT57X2JvdHRvbX0gICAgICAgIDw8IDEyOworCisgICAgJGJvcmRlcjIgICAgICAgID0gJHNlbGYtPntfbGVmdF9jb2xvcn07CisgICAgJGJvcmRlcjIgICAgICAgfD0gJHNlbGYtPntfcmlnaHRfY29sb3J9ICAgPDwgNzsKKyAgICAkYm9yZGVyMiAgICAgICB8PSAkc2VsZi0+e19kaWFnX3R5cGV9ICAgICA8PCAxNDsKKworCisgICAgJGJvcmRlcjMgICAgICAgID0gJHNlbGYtPntfdG9wX2NvbG9yfTsKKyAgICAkYm9yZGVyMyAgICAgICB8PSAkc2VsZi0+e19ib3R0b21fY29sb3J9ICA8PCA3OworICAgICRib3JkZXIzICAgICAgIHw9ICRzZWxmLT57X2RpYWdfY29sb3J9ICAgIDw8IDE0OworICAgICRib3JkZXIzICAgICAgIHw9ICRzZWxmLT57X2RpYWdfYm9yZGVyfSAgIDw8IDIxOworICAgICRib3JkZXIzICAgICAgIHw9ICRzZWxmLT57X3BhdHRlcm59ICAgICAgIDw8IDI2OworCisgICAgJGljdiAgICAgICAgICAgID0gJHNlbGYtPntfZmdfY29sb3J9OworICAgICRpY3YgICAgICAgICAgIHw9ICRzZWxmLT57X2JnX2NvbG9yfSAgICAgIDw8IDc7CisKKworCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidnZ2dnZ2dlZ2IiwgJGlmbnQsICRpZm10LCAkc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFsaWduLCAkaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRib3JkZXIxLCAkYm9yZGVyMiwgJGJvcmRlcjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGljdik7CisKKyAgICByZXR1cm4oJGhlYWRlciAuICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE5vdGUgdG8gcG9ydGVycy4gVGhlIG1ham9yaXR5IG9mIHRoZSBzZXRfcHJvcGVydHkoKSBtZXRob2RzIGFyZSBjcmVhdGVkCisjIGR5bmFtaWNhbGx5IHZpYSBQZXJsJyBBVVRPTE9BRCBzdWIsIHNlZSBiZWxvdy4gWW91IG1heSBwcmVmZXIvaGF2ZSB0byBzcGVjaWZ5CisjIHRoZW0gZXhwbGljaXRseSBpbiBvdGhlciBpbXBsZW1lbnRhdGlvbiBsYW5ndWFnZXMuCisjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfZm9udCgpCisjCisjIEdlbmVyYXRlIGFuIEV4Y2VsIEJJRkYgRk9OVCByZWNvcmQuCisjCitzdWIgZ2V0X2ZvbnQgeworCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZDsgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgIyBSZWNvcmQgbGVuZ3RoCisKKyAgICBteSAkZHlIZWlnaHQ7ICAgIyBIZWlnaHQgb2YgZm9udCAoMS8yMCBvZiBhIHBvaW50KQorICAgIG15ICRncmJpdDsgICAgICAjIEZvbnQgYXR0cmlidXRlcworICAgIG15ICRpY3Y7ICAgICAgICAjIEluZGV4IHRvIGNvbG9yIHBhbGV0dGUKKyAgICBteSAkYmxzOyAgICAgICAgIyBCb2xkIHN0eWxlCisgICAgbXkgJHNzczsgICAgICAgICMgU3VwZXJzY3JpcHQvc3Vic2NyaXB0CisgICAgbXkgJHVsczsgICAgICAgICMgVW5kZXJsaW5lCisgICAgbXkgJGJGYW1pbHk7ICAgICMgRm9udCBmYW1pbHkKKyAgICBteSAkYkNoYXJTZXQ7ICAgIyBDaGFyYWN0ZXIgc2V0CisgICAgbXkgJHJlc2VydmVkOyAgICMgUmVzZXJ2ZWQKKyAgICBteSAkY2NoOyAgICAgICAgIyBMZW5ndGggb2YgZm9udCBuYW1lCisgICAgbXkgJHJnY2g7ICAgICAgICMgRm9udCBuYW1lCisgICAgbXkgJGVuY29kaW5nOyAgICMgRm9udCBuYW1lIGNoYXJhY3RlciBlbmNvZGluZworCisKKyAgICAkZHlIZWlnaHQgICA9ICRzZWxmLT57X3NpemV9ICogMjA7CisgICAgJGljdiAgICAgICAgPSAkc2VsZi0+e19jb2xvcn07CisgICAgJGJscyAgICAgICAgPSAkc2VsZi0+e19ib2xkfTsKKyAgICAkc3NzICAgICAgICA9ICRzZWxmLT57X2ZvbnRfc2NyaXB0fTsKKyAgICAkdWxzICAgICAgICA9ICRzZWxmLT57X3VuZGVybGluZX07CisgICAgJGJGYW1pbHkgICAgPSAkc2VsZi0+e19mb250X2ZhbWlseX07CisgICAgJGJDaGFyU2V0ICAgPSAkc2VsZi0+e19mb250X2NoYXJzZXR9OworICAgICRyZ2NoICAgICAgID0gJHNlbGYtPntfZm9udH07CisgICAgJGVuY29kaW5nICAgPSAkc2VsZi0+e19mb250X2VuY29kaW5nfTsKKworICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7CisKKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkcmdjaCkpIHsKKyAgICAgICAgICAgICRyZ2NoID0gRW5jb2RlOjplbmNvZGUoIlVURi0xNkJFIiwgJHJnY2gpOworICAgICAgICAgICAgJGVuY29kaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgICRjY2ggPSBsZW5ndGggJHJnY2g7CisKKyAgICAjIEhhbmRsZSBVbmljb2RlIGZvbnQgbmFtZXMuCisgICAgaWYgKCRlbmNvZGluZyA9PSAxKSB7CisgICAgICAgIGNyb2FrICJVbmV2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIFVuaWNvZGUgZm9udCBuYW1lIiBpZiAkY2NoICUgMjsKKyAgICAgICAgJGNjaCAgLz0gMiBpZiAkZW5jb2Rpbmc7CisgICAgICAgICRyZ2NoICA9IHBhY2sgJ3YqJywgdW5wYWNrICduKicsICRyZ2NoOworICAgIH0KKworICAgICRyZWNvcmQgICAgID0gMHgzMTsKKyAgICAkbGVuZ3RoICAgICA9IDB4MTAgKyBsZW5ndGggJHJnY2g7CisgICAgJHJlc2VydmVkICAgPSAweDAwOworCisgICAgJGdyYml0ICAgICAgPSAweDAwOworICAgICRncmJpdCAgICAgfD0gMHgwMiBpZiAkc2VsZi0+e19pdGFsaWN9OworICAgICRncmJpdCAgICAgfD0gMHgwOCBpZiAkc2VsZi0+e19mb250X3N0cmlrZW91dH07CisgICAgJGdyYml0ICAgICB8PSAweDEwIGlmICRzZWxmLT57X2ZvbnRfb3V0bGluZX07CisgICAgJGdyYml0ICAgICB8PSAweDIwIGlmICRzZWxmLT57X2ZvbnRfc2hhZG93fTsKKworCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAgICAgICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgID0gcGFjaygidnZ2dnZDQ0NDQ0MiLCAkZHlIZWlnaHQsICRncmJpdCwgJGljdiwgJGJscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNzcywgJHVscywgJGJGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiQ2hhclNldCwgJHJlc2VydmVkLCAkY2NoLCAkZW5jb2RpbmcpOworCisgICAgcmV0dXJuKCRoZWFkZXIgLiAkZGF0YSAuICRyZ2NoKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfZm9udF9rZXkoKQorIworIyBSZXR1cm5zIGEgdW5pcXVlIGhhc2gga2V5IGZvciBhIGZvbnQuIFVzZWQgYnkgV29ya2Jvb2stPl9zdG9yZV9hbGxfZm9udHMoKQorIworc3ViIGdldF9mb250X2tleSB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgIyBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIGFyZSBhcnJhbmdlZCB0byBpbmNyZWFzZSB0aGUgcHJvYmFiaWxpdHkgb2YKKyAgICAjIGdlbmVyYXRpbmcgYSB1bmlxdWUga2V5LiBFbGVtZW50cyB0aGF0IGhvbGQgYSBsYXJnZSByYW5nZSBvZiBudW1iZXJzCisgICAgIyBlLmcuIF9jb2xvciBhcmUgcGxhY2VkIGJldHdlZW4gdHdvIGJpbmFyeSBlbGVtZW50cyBzdWNoIGFzIF9pdGFsaWMKKyAgICAjCisgICAgbXkgJGtleSA9ICIkc2VsZi0+e19mb250fSRzZWxmLT57X3NpemV9IjsKKyAgICAka2V5ICAgLj0gIiRzZWxmLT57X2ZvbnRfc2NyaXB0fSRzZWxmLT57X3VuZGVybGluZX0iOworICAgICRrZXkgICAuPSAiJHNlbGYtPntfZm9udF9zdHJpa2VvdXR9JHNlbGYtPntfYm9sZH0kc2VsZi0+e19mb250X291dGxpbmV9IjsKKyAgICAka2V5ICAgLj0gIiRzZWxmLT57X2ZvbnRfZmFtaWx5fSRzZWxmLT57X2ZvbnRfY2hhcnNldH0iOworICAgICRrZXkgICAuPSAiJHNlbGYtPntfZm9udF9zaGFkb3d9JHNlbGYtPntfY29sb3J9JHNlbGYtPntfaXRhbGljfSI7CisgICAgJGtleSAgIC49ICIkc2VsZi0+e19mb250X2VuY29kaW5nfSI7CisgICAgJGtleSAgICA9fiBzLyAvXy9nOyAjIENvbnZlcnQgdGhlIGtleSB0byBhIHNpbmdsZSB3b3JkCisKKyAgICByZXR1cm4gJGtleTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF94Zl9pbmRleCgpCisjCisjIFJldHVybnMgdGhlIHVzZWQgYnkgV29ya3NoZWV0LT5fWEYoKQorIworc3ViIGdldF94Zl9pbmRleCB7CisgICAgbXkgJHNlbGYgICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57X3hmX2luZGV4fTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfY29sb3IoKQorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHNldF94eHhfY29sb3IgbWV0aG9kcyB0byBjb252ZXJ0IGEgY29sb3IKKyMgc3RyaW5nIGludG8gYSBudW1iZXIuIENvbG9yIHJhbmdlIGlzIDAuLjYzIGJ1dCB3ZSB3aWxsIHJlc3RyaWN0IGl0CisjIHRvIDguLjYzIHRvIGNvbXBseSB3aXRoIEdudW1lcmljLiBDb2xvcnMgMC4uNyBhcmUgcmVwZWF0ZWQgaW4gOC4uMTUuCisjCitzdWIgX2dldF9jb2xvciB7CisKKyAgICBteSAlY29sb3JzID0gKAorICAgICAgICAgICAgICAgICAgICBhcXVhICAgID0+IDB4MEYsCisgICAgICAgICAgICAgICAgICAgIGN5YW4gICAgPT4gMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgYmxhY2sgICA9PiAweDA4LAorICAgICAgICAgICAgICAgICAgICBibHVlICAgID0+IDB4MEMsCisgICAgICAgICAgICAgICAgICAgIGJyb3duICAgPT4gMHgxMCwKKyAgICAgICAgICAgICAgICAgICAgbWFnZW50YSA9PiAweDBFLAorICAgICAgICAgICAgICAgICAgICBmdWNoc2lhID0+IDB4MEUsCisgICAgICAgICAgICAgICAgICAgIGdyYXkgICAgPT4gMHgxNywKKyAgICAgICAgICAgICAgICAgICAgZ3JleSAgICA9PiAweDE3LAorICAgICAgICAgICAgICAgICAgICBncmVlbiAgID0+IDB4MTEsCisgICAgICAgICAgICAgICAgICAgIGxpbWUgICAgPT4gMHgwQiwKKyAgICAgICAgICAgICAgICAgICAgbmF2eSAgICA9PiAweDEyLAorICAgICAgICAgICAgICAgICAgICBvcmFuZ2UgID0+IDB4MzUsCisgICAgICAgICAgICAgICAgICAgIHBpbmsgICAgPT4gMHgyMSwKKyAgICAgICAgICAgICAgICAgICAgcHVycGxlICA9PiAweDE0LAorICAgICAgICAgICAgICAgICAgICByZWQgICAgID0+IDB4MEEsCisgICAgICAgICAgICAgICAgICAgIHNpbHZlciAgPT4gMHgxNiwKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUgICA9PiAweDA5LAorICAgICAgICAgICAgICAgICAgICB5ZWxsb3cgID0+IDB4MEQsCisgICAgICAgICAgICAgICAgICk7CisKKyAgICAjIFJldHVybiB0aGUgZGVmYXVsdCBjb2xvciwgMHg3RkZGLCBpZiB1bmRlZiwKKyAgICByZXR1cm4gMHg3RkZGIHVubGVzcyBkZWZpbmVkICRfWzBdOworCisgICAgIyBvciB0aGUgY29sb3Igc3RyaW5nIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyLAorICAgIHJldHVybiAkY29sb3Jze2xjKCRfWzBdKX0gaWYgZXhpc3RzICRjb2xvcnN7bGMoJF9bMF0pfTsKKworICAgICMgb3IgdGhlIGRlZmF1bHQgY29sb3IgaWYgc3RyaW5nIGlzIHVucmVjb2duaXNlZCwKKyAgICByZXR1cm4gMHg3RkZGIGlmICgkX1swXSA9fiBtL1xELyk7CisKKyAgICAjIG9yIGFuIGluZGV4IDwgOCBtYXBwZWQgaW50byB0aGUgY29ycmVjdCByYW5nZSwKKyAgICByZXR1cm4gJF9bMF0gKyA4IGlmICRfWzBdIDwgODsKKworICAgICMgb3IgdGhlIGRlZmF1bHQgY29sb3IgaWYgYXJnIGlzIG91dHNpZGUgcmFuZ2UsCisgICAgcmV0dXJuIDB4N0ZGRiBpZiAkX1swXSA+IDYzOworCisgICAgIyBvciBhbiBpbnRlZ2VyIGluIHRoZSB2YWxpZCByYW5nZQorICAgIHJldHVybiAkX1swXTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF90eXBlKCkKKyMKKyMgU2V0IHRoZSBYRiBvYmplY3QgdHlwZSBhcyAwID0gY2VsbCBYRiBvciAweEZGRjUgPSBzdHlsZSBYRi4KKyMKK3N1YiBzZXRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICR0eXBlID0gJF9bMF07CisKKyAgICBpZiAoZGVmaW5lZCAkX1swXSBhbmQgJF9bMF0gZXEgMCkgeworICAgICAgICAkc2VsZi0+e190eXBlfSA9IDB4MDAwMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT57X3R5cGV9ID0gMHhGRkY1OworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9hbGlnbigpCisjCisjIFNldCBjZWxsIGFsaWdubWVudC4KKyMKK3N1YiBzZXRfYWxpZ24geworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJGxvY2F0aW9uID0gJF9bMF07CisKKyAgICByZXR1cm4gaWYgbm90IGRlZmluZWQgJGxvY2F0aW9uOyAgIyBObyBkZWZhdWx0CisgICAgcmV0dXJuIGlmICRsb2NhdGlvbiA9fiBtL1xkLzsgICAgICMgSWdub3JlIG51bWJlcnMKKworICAgICRsb2NhdGlvbiA9IGxjKCRsb2NhdGlvbik7CisKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbigxKSBpZiAoJGxvY2F0aW9uIGVxICdsZWZ0Jyk7CisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oMikgaWYgKCRsb2NhdGlvbiBlcSAnY2VudHJlJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oMikgaWYgKCRsb2NhdGlvbiBlcSAnY2VudGVyJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oMykgaWYgKCRsb2NhdGlvbiBlcSAncmlnaHQnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbig0KSBpZiAoJGxvY2F0aW9uIGVxICdmaWxsJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oNSkgaWYgKCRsb2NhdGlvbiBlcSAnanVzdGlmeScpOworICAgICRzZWxmLT5zZXRfdGV4dF9oX2FsaWduKDYpIGlmICgkbG9jYXRpb24gZXEgJ2NlbnRlcl9hY3Jvc3MnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbig2KSBpZiAoJGxvY2F0aW9uIGVxICdjZW50cmVfYWNyb3NzJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oNikgaWYgKCRsb2NhdGlvbiBlcSAnbWVyZ2UnKTsgICAgICAgICMgUzpXRSBuYW1lCisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oNykgaWYgKCRsb2NhdGlvbiBlcSAnZGlzdHJpYnV0ZWQnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbig3KSBpZiAoJGxvY2F0aW9uIGVxICdlcXVhbF9zcGFjZScpOyAgIyBQYXJzZUV4Y2VsCisKKworICAgICRzZWxmLT5zZXRfdGV4dF92X2FsaWduKDApIGlmICgkbG9jYXRpb24gZXEgJ3RvcCcpOworICAgICRzZWxmLT5zZXRfdGV4dF92X2FsaWduKDEpIGlmICgkbG9jYXRpb24gZXEgJ3ZjZW50cmUnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfdl9hbGlnbigxKSBpZiAoJGxvY2F0aW9uIGVxICd2Y2VudGVyJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X3ZfYWxpZ24oMikgaWYgKCRsb2NhdGlvbiBlcSAnYm90dG9tJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X3ZfYWxpZ24oMykgaWYgKCRsb2NhdGlvbiBlcSAndmp1c3RpZnknKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfdl9hbGlnbig0KSBpZiAoJGxvY2F0aW9uIGVxICd2ZGlzdHJpYnV0ZWQnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfdl9hbGlnbig0KSBpZiAoJGxvY2F0aW9uIGVxICd2ZXF1YWxfc3BhY2UnKTsgIyBQYXJzZUV4Y2VsCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfdmFsaWduKCkKKyMKKyMgU2V0IHZlcnRpY2FsIGNlbGwgYWxpZ25tZW50LiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzZXRfZm9ybWF0X3Byb3BlcnRpZXMoKQorIyBtZXRob2QgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBwcm9wZXJ0aWVzLgorIworc3ViIHNldF92YWxpZ24geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICAkc2VsZi0+c2V0X2FsaWduKEBfKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9jZW50ZXJfYWNyb3NzKCkKKyMKKyMgSW1wbGVtZW50cyB0aGUgRXhjZWw1IHN0eWxlICJtZXJnZSIuCisjCitzdWIgc2V0X2NlbnRlcl9hY3Jvc3MgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbig2KTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9tZXJnZSgpCisjCisjIFRoaXMgd2FzIHRoZSB3YXkgdG8gaW1wbGVtZW50IGEgbWVyZ2UgaW4gRXhjZWw1LiBIb3dldmVyIGl0IHNob3VsZCBoYXZlIGJlZW4KKyMgY2FsbGVkICJjZW50ZXJfYWNyb3NzIiBhbmQgbm90ICJtZXJnZSIuCisjIFRoaXMgaXMgbm93IGRlcHJlY2F0ZWQuIFVzZSBzZXRfY2VudGVyX2Fjcm9zcygpIG9yIGJldHRlciBtZXJnZV9yYW5nZSgpLgorIworIworc3ViIHNldF9tZXJnZSB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKworICAgICRzZWxmLT5zZXRfdGV4dF9oX2FsaWduKDYpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2JvbGQoKQorIworIyBCb2xkIGhhcyBhIHJhbmdlIDB4NjQuLjB4M0U4LgorIyAweDE5MCBpcyBub3JtYWwuIDB4MkJDIGlzIGJvbGQuIFNvIGlzIGFuIGV4Y2Vzc2l2ZSB1c2Ugb2YgQVVUT0xPQUQuCisjCitzdWIgc2V0X2JvbGQgeworCisgICAgbXkgJHNlbGYgICA9IHNoaWZ0OworICAgIG15ICR3ZWlnaHQgPSAkX1swXTsKKworICAgICR3ZWlnaHQgPSAweDJCQyBpZiBub3QgZGVmaW5lZCAkd2VpZ2h0OyAjIEJvbGQgdGV4dAorICAgICR3ZWlnaHQgPSAweDJCQyBpZiAkd2VpZ2h0ID09IDE7ICAgICAgICAjIEJvbGQgdGV4dAorICAgICR3ZWlnaHQgPSAweDE5MCBpZiAkd2VpZ2h0ID09IDA7ICAgICAgICAjIE5vcm1hbCB0ZXh0CisgICAgJHdlaWdodCA9IDB4MTkwIGlmICR3ZWlnaHQgPCAgMHgwNjQ7ICAgICMgTG93ZXIgYm91bmQKKyAgICAkd2VpZ2h0ID0gMHgxOTAgaWYgJHdlaWdodCA+ICAweDNFODsgICAgIyBVcHBlciBib3VuZAorCisgICAgJHNlbGYtPntfYm9sZH0gPSAkd2VpZ2h0OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2JvcmRlcigkc3R5bGUpCisjCisjIFNldCBjZWxscyBib3JkZXJzIHRvIHRoZSBzYW1lIHN0eWxlCisjCitzdWIgc2V0X2JvcmRlciB7CisKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkc3R5bGUgPSAkX1swXTsKKworICAgICRzZWxmLT5zZXRfYm90dG9tKCRzdHlsZSk7CisgICAgJHNlbGYtPnNldF90b3AoJHN0eWxlKTsKKyAgICAkc2VsZi0+c2V0X2xlZnQoJHN0eWxlKTsKKyAgICAkc2VsZi0+c2V0X3JpZ2h0KCRzdHlsZSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfYm9yZGVyX2NvbG9yKCRjb2xvcikKKyMKKyMgU2V0IGNlbGxzIGJvcmRlciB0byB0aGUgc2FtZSBjb2xvcgorIworc3ViIHNldF9ib3JkZXJfY29sb3IgeworCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJGNvbG9yID0gJF9bMF07CisKKyAgICAkc2VsZi0+c2V0X2JvdHRvbV9jb2xvcigkY29sb3IpOworICAgICRzZWxmLT5zZXRfdG9wX2NvbG9yKCRjb2xvcik7CisgICAgJHNlbGYtPnNldF9sZWZ0X2NvbG9yKCRjb2xvcik7CisgICAgJHNlbGYtPnNldF9yaWdodF9jb2xvcigkY29sb3IpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3JvdGF0aW9uKCRhbmdsZSkKKyMKKyMgU2V0IHRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgdGV4dC4gQW4gYWxpZ25tZW50IHByb3BlcnR5LgorIworc3ViIHNldF9yb3RhdGlvbiB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkcm90YXRpb24gPSAkX1swXTsKKworICAgICMgQXJndW1lbnQgc2hvdWxkIGJlIGEgbnVtYmVyCisgICAgcmV0dXJuIGlmICRyb3RhdGlvbiAhfiAvXihbKy1dPykoPz1cZHxcLlxkKVxkKihcLlxkKik/KFtFZV0oWystXT9cZCspKT8kLzsKKworICAgICMgVGhlIGFyZyB0eXBlIGNhbiBiZSBhIGRvdWJsZSBidXQgdGhlIEV4Y2VsIGRpYWxvZyBvbmx5IGFsbG93cyBpbnRlZ2Vycy4KKyAgICAkcm90YXRpb24gPSBpbnQgJHJvdGF0aW9uOworCisgICAgaWYgKCRyb3RhdGlvbiA9PSAyNzApIHsKKyAgICAgICAgJHJvdGF0aW9uID0gMjU1OworICAgIH0KKyAgICBlbHNpZiAoJHJvdGF0aW9uID49IC05MCBvciAkcm90YXRpb24gPD0gOTApIHsKKyAgICAgICAgJHJvdGF0aW9uID0gLSRyb3RhdGlvbiArOTAgaWYgJHJvdGF0aW9uIDwgMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNhcnAgIlJvdGF0aW9uICRyb3RhdGlvbiBvdXRzaWRlIHJhbmdlOiAtOTAgPD0gYW5nbGUgPD0gOTAiOworICAgICAgICAkcm90YXRpb24gPSAwOworICAgIH0KKworICAgICRzZWxmLT57X3JvdGF0aW9ufSA9ICRyb3RhdGlvbjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9mb3JtYXRfcHJvcGVydGllcygpCisjCisjIENvbnZlcnQgaGFzaGVzIG9mIHByb3BlcnRpZXMgdG8gbWV0aG9kIGNhbGxzLgorIworc3ViIHNldF9mb3JtYXRfcHJvcGVydGllcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJXByb3BlcnRpZXMgPSBAXzsgIyBNZXJnZSBtdWx0aXBsZSBoYXNoZXMgaW50byBvbmUKKworICAgIHdoaWxlIChteSgka2V5LCAkdmFsdWUpID0gZWFjaCglcHJvcGVydGllcykpIHsKKworICAgICAgICAjIFN0cmlwIGxlYWRpbmcgIi0iIGZyb20gVGsgc3R5bGUgcHJvcGVydGllcyBlLmcuIC1jb2xvciA9PiAncmVkJy4KKyAgICAgICAgJGtleSA9fiBzL14tLy87CisKKyAgICAgICAgIyBDcmVhdGUgYSBzdWIgdG8gc2V0IHRoZSBwcm9wZXJ0eS4KKyAgICAgICAgbXkgJHN1YiA9IFwmeyJzZXRfJGtleSJ9OworICAgICAgICAkc3ViLT4oJHNlbGYsICR2YWx1ZSk7CisgICB9Cit9CisKKyMgUmVuYW1lZCByYXJlbHkgdXNlZCBzZXRfcHJvcGVydGllcygpIHRvIHNldF9mb3JtYXRfcHJvcGVydGllcygpIHRvIGF2b2lkCisjIGNvbmZ1c2lvbiB3aXRoIFdvcmtib29rIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLiBUaGUgZm9sbG93aW5nIGFjdHMgYXMgYW4KKyMgYWxpYXMgZm9yIGFueSBjb2RlIHRoYXQgdXNlcyB0aGUgb2xkIG5hbWUuCisqc2V0X3Byb3BlcnRpZXMgPSAqc2V0X2Zvcm1hdF9wcm9wZXJ0aWVzOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQVVUT0xPQUQuIERldXMgZXggbWFjaGluYS4KKyMKKyMgRHluYW1pY2FsbHkgY3JlYXRlIHNldCBtZXRob2RzIHRoYXQgYXJlbid0IGFscmVhZHkgZGVmaW5lZC4KKyMKK3N1YiBBVVRPTE9BRCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBJZ25vcmUgY2FsbHMgdG8gREVTVFJPWQorICAgIHJldHVybiBpZiAkQVVUT0xPQUQgPX4gLzo6REVTVFJPWSQvOworCisgICAgIyBDaGVjayBmb3IgYSB2YWxpZCBtZXRob2QgbmFtZXMsIGkuZS4gInNldF94eHhfeXl5Ii4KKyAgICAkQVVUT0xPQUQgPX4gLy4qOjpzZXQoXHcrKS8gb3IgZGllICJVbmtub3duIG1ldGhvZDogJEFVVE9MT0FEXG4iOworCisgICAgIyBNYXRjaCB0aGUgYXR0cmlidXRlLCBpLmUuICJfeHh4X3l5eSIuCisgICAgbXkgJGF0dHJpYnV0ZSA9ICQxOworCisgICAgIyBDaGVjayB0aGF0IHRoZSBhdHRyaWJ1dGUgZXhpc3RzCisgICAgZXhpc3RzICRzZWxmLT57JGF0dHJpYnV0ZX0gIG9yIGRpZSAiVW5rbm93biBtZXRob2Q6ICRBVVRPTE9BRFxuIjsKKworICAgICMgVGhlIGF0dHJpYnV0ZSB2YWx1ZQorICAgIG15ICR2YWx1ZTsKKworCisgICAgIyBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHNldCBtZXRob2RzOiBzZXRfcHJvcGVydHkoKSBhbmQKKyAgICAjIHNldF9wcm9wZXJ0eV9jb2xvcigpLiBXaGVuIGEgbWV0aG9kIGlzIEFVVE9MT0FERUQgd2Ugc3RvcmUgYSBuZXcgYW5vbnltb3VzCisgICAgIyBzdWIgaW4gdGhlIGFwcHJvcHJpYXRlIHNsb3QgaW4gdGhlIHN5bWJvbCB0YWJsZS4gVGhlIHNwZWVkcyB1cCBzdWJzZXF1ZW50CisgICAgIyBjYWxscyB0byB0aGUgc2FtZSBtZXRob2QuCisgICAgIworICAgIG5vIHN0cmljdCAncmVmcyc7ICMgVG8gYWxsb3cgc3ltYm9sIHRhYmxlIGhhY2tlcnkKKworICAgIGlmICgkQVVUT0xPQUQgPX4gLy4qOjpzZXRcdytjb2xvciQvKSB7CisgICAgICAgICMgRm9yICJzZXRfcHJvcGVydHlfY29sb3IiIG1ldGhvZHMKKyAgICAgICAgJHZhbHVlID0gIF9nZXRfY29sb3IoJF9bMF0pOworCisgICAgICAgICp7JEFVVE9MT0FEfSA9IHN1YiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRzZWxmICA9IHNoaWZ0OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57JGF0dHJpYnV0ZX0gPSBfZ2V0X2NvbG9yKCRfWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgICR2YWx1ZSA9ICRfWzBdOworICAgICAgICAkdmFsdWUgPSAxIGlmIG5vdCBkZWZpbmVkICR2YWx1ZTsgIyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbHdheXMgMQorCisgICAgICAgICp7JEFVVE9MT0FEfSA9IHN1YiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkdmFsdWUgPSBzaGlmdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAxIGlmIG5vdCBkZWZpbmVkICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPnskYXR0cmlidXRlfSA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgIH0KKworCisgICAgJHNlbGYtPnskYXR0cmlidXRlfSA9ICR2YWx1ZTsKK30KKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitGb3JtYXQgLSBBIGNsYXNzIGZvciBkZWZpbmluZyBFeGNlbCBmb3JtYXR0aW5nLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworqSBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvRm9ybXVsYS5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvRm9ybXVsYS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDk4MzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Gb3JtdWxhLnBtCkBAIC0wLDAgKzEsMTQ4NSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybXVsYTsNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgRm9ybXVsYSAtIEEgY2xhc3MgZm9yIGdlbmVyYXRpbmcgRXhjZWwgZm9ybXVsYXMuDQorIw0KKyMNCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbA0KKyMNCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZw0KKyMNCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXw0KKyMNCisNCit1c2UgRXhwb3J0ZXI7DQordXNlIHN0cmljdDsNCit1c2UgQ2FycDsNCisNCisNCisNCisNCisNCisNCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsNCitASVNBID0gcXcoRXhwb3J0ZXIpOw0KKw0KKyRWRVJTSU9OID0gJzIuMzcnOw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBDbGFzcyBkYXRhLg0KKyMNCitteSAkcGFyc2VyOw0KK215ICVwdGc7DQorbXkgJWZ1bmN0aW9uczsNCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgRm9yIGRlYnVnZ2luZy4NCisjDQorbXkgJF9kZWJ1ZyA9IDA7DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIG5ldygpDQorIw0KKyMgQ29uc3RydWN0b3INCisjDQorc3ViIG5ldyB7DQorDQorICAgIG15ICRjbGFzcyAgPSAkX1swXTsNCisNCisgICAgbXkgJHNlbGYgICA9IHsNCisgICAgICAgICAgICAgICAgICAgIF9ieXRlX29yZGVyICAgICA9PiAkX1sxXSwNCisgICAgICAgICAgICAgICAgICAgIF93b3JrYm9vayAgICAgICA9PiAiIiwNCisgICAgICAgICAgICAgICAgICAgIF9leHRfc2hlZXRzICAgICA9PiB7fSwNCisgICAgICAgICAgICAgICAgICAgIF9leHRfcmVmcyAgICAgICA9PiB7fSwNCisgICAgICAgICAgICAgICAgICAgIF9leHRfcmVmX2NvdW50ICA9PiAwLA0KKyAgICAgICAgICAgICAgICAgICAgX2V4dF9uYW1lcyAgICAgID0+IHt9LA0KKyAgICAgICAgICAgICAgICAgfTsNCisNCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsNCisgICAgcmV0dXJuICRzZWxmOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2luaXRfcGFyc2VyKCkNCisjDQorIyBUaGVyZSBpcyBhIHNtYWxsIG92ZXJoZWFkIGludm9sdmVkIGluIGdlbmVyYXRpbmcgdGhlIHBhcnNlci4gVGhlcmVmb3JlLCB0aGUNCisjIGluaXRpYWxpc2F0aW9uIGlzIGRlbGF5ZWQgdW50aWwgYSBmb3JtdWxhIGlzIHJlcXVpcmVkLg0KKyMgVE9ETzogdXNlIGEgcHJlLWNvbXBpbGVkIGdyYW1tYXIuDQorIw0KKyMgUG9ydGVycyB0YWtlIG5vdGUsIGEgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyIGlzbid0IG1hbmRhdG9yeS4gQSBmdXR1cmUNCisjIHZlcnNpb24gb2YgdGhpcyBtb2R1bGUgbWF5IHVzZSBhIFlBQ0MgYmFzZWQgcGFyc2VyIGluc3RlYWQuDQorIw0KK3N1YiBfaW5pdF9wYXJzZXIgew0KKw0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKw0KKyAgICAjIERlbGF5IGxvYWRpbmcgUGFyc2U6OlJlY0Rlc2NlbnQgdG8gcmVkdWNlIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzLg0KKyAgICBldmFsIHsgcmVxdWlyZSBQYXJzZTo6UmVjRGVzY2VudCB9Ow0KKyAgICBkaWUgICJUaGUgUGFyc2U6OlJlY0Rlc2NlbnQgbW9kdWxlIG11c3QgYmUgaW5zdGFsbGVkIGluIG9yZGVyICIuDQorICAgICAgICAgInRvIHdyaXRlIGFuIEV4Y2VsIGZvcm11bGFcbiIgaWYgJEA7DQorDQorICAgICRzZWxmLT5faW5pdGlhbGl6ZV9oYXNoZXMoKTsNCisNCisgICAgIyBUaGUgcGFyc2luZyBncmFtbWFyLg0KKyAgICAjDQorICAgICMgVE9ETzogQWRkIHN1cHBvcnQgZm9yIGludGVybmF0aW9uYWwgdmVyc2lvbnMgb2YgRXhjZWwNCisgICAgIw0KKyAgICAkcGFyc2VyID0gUGFyc2U6OlJlY0Rlc2NlbnQtPm5ldyg8PCdFbmRHcmFtbWFyJyk7DQorDQorICAgICAgICBleHByOiAgICAgICAgICAgbGlzdA0KKw0KKyAgICAgICAgIyBNYXRjaCBhcmcgbGlzdHMgc3VjaCBhcyBTVU0oMSwyLCAzKQ0KKyAgICAgICAgbGlzdDogICAgICAgICAgIDxsZWZ0b3A6IGFkZGl0aW9uICcsJyBhZGRpdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsgJGl0ZW1bMV0sICdfYXJnJywgc2NhbGFyIEB7JGl0ZW1bMV19IF0gfQ0KKw0KKyAgICAgICAgYWRkaXRpb246ICAgICAgIDxsZWZ0b3A6IG11bHRpcGxpY2F0aW9uIGFkZF9vcCBtdWx0aXBsaWNhdGlvbj4NCisNCisgICAgICAgICMgVE9ETzogVGhlIGFkZF9vcCBvcGVyYXRvcnMgZG9uJ3QgaGF2ZSBlcXVhbCBwcmVjZWRlbmNlLg0KKyAgICAgICAgYWRkX29wOiAgICAgICAgIGFkZCB8ICBzdWIgfCBjb25jYXQNCisgICAgICAgICAgICAgICAgICAgICAgICB8IGVxIHwgbmUgfCBsZSB8IGdlIHwgbHQgfCBndCAgICMgT3JkZXIgaXMgaW1wb3J0YW50DQorDQorICAgICAgICBhZGQ6ICAgICAgICAgICAgJysnICB7ICdwdGdBZGQnICAgIH0NCisgICAgICAgIHN1YjogICAgICAgICAgICAnLScgIHsgJ3B0Z1N1YicgICAgfQ0KKyAgICAgICAgY29uY2F0OiAgICAgICAgICcmJyAgeyAncHRnQ29uY2F0JyB9DQorICAgICAgICBlcTogICAgICAgICAgICAgJz0nICB7ICdwdGdFUScgICAgIH0NCisgICAgICAgIG5lOiAgICAgICAgICAgICAnPD4nIHsgJ3B0Z05FJyAgICAgfQ0KKyAgICAgICAgbGU6ICAgICAgICAgICAgICc8PScgeyAncHRnTEUnICAgICB9DQorICAgICAgICBnZTogICAgICAgICAgICAgJz49JyB7ICdwdGdHRScgICAgIH0NCisgICAgICAgIGx0OiAgICAgICAgICAgICAnPCcgIHsgJ3B0Z0xUJyAgICAgfQ0KKyAgICAgICAgZ3Q6ICAgICAgICAgICAgICc+JyAgeyAncHRnR1QnICAgICB9DQorDQorDQorICAgICAgICBtdWx0aXBsaWNhdGlvbjogPGxlZnRvcDogZXhwb25lbnRpb24gbXVsdF9vcCBleHBvbmVudGlvbj4NCisNCisgICAgICAgIG11bHRfb3A6ICAgICAgICBtdWx0ICB8IGRpdg0KKyAgICAgICAgbXVsdDogICAgICAgICAgICcqJyB7ICdwdGdNdWwnIH0NCisgICAgICAgIGRpdjogICAgICAgICAgICAnLycgeyAncHRnRGl2JyB9DQorDQorICAgICAgICAjIExlZnQgYXNzb2NpYXRpdmUgKGFwcGFyZW50bHkpDQorICAgICAgICBleHBvbmVudGlvbjogICAgPGxlZnRvcDogZmFjdG9yIGV4cF9vcCBmYWN0b3I+DQorDQorICAgICAgICBleHBfb3A6ICAgICAgICAgJ14nIHsgJ3B0Z1Bvd2VyJyB9DQorDQorICAgICAgICBmYWN0b3I6ICAgICAgICAgbnVtYmVyICAgICAgICMgT3JkZXIgaXMgaW1wb3J0YW50DQorICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcNCisgICAgICAgICAgICAgICAgICAgICAgICB8IHJhbmdlMmQNCisgICAgICAgICAgICAgICAgICAgICAgICB8IHJhbmdlM2QNCisgICAgICAgICAgICAgICAgICAgICAgICB8IHRydWUNCisgICAgICAgICAgICAgICAgICAgICAgICB8IGZhbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgfCByZWYyZA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVmM2QNCisgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uDQorICAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lDQorICAgICAgICAgICAgICAgICAgICAgICAgfCAnKCcgZXhwciAnKScgIHsgWyRpdGVtWzJdLCAncHRnUGFyZW4nXSB9DQorDQorICAgICAgICAjIE1hdGNoIGEgc3RyaW5nLg0KKyAgICAgICAgIyBSZWdleCBieSBtZXJseW4uIFNlZSBodHRwOi8vd3d3LnBlcmxtb25rcy5vcmcvaW5kZXgucGw/bm9kZV9pZD0zMzAyODANCisgICAgICAgICMNCisgICAgICAgIHN0cmluZzogICAgICAgICAgIC8iKFteIl18IiIpKiIvICAgICAjIiBGb3IgZWRpdG9ycw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgWyAnX3N0cicsICRpdGVtWzFdXSB9DQorDQorICAgICAgICAjIE1hdGNoIGZsb2F0IG9yIGludGVnZXINCisgICAgICAgIG51bWJlcjogICAgICAgICAgIC8oWystXT8pKD89XGR8XC5cZClcZCooXC5cZCopPyhbRWVdKFsrLV0/XGQrKSk/Lw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgWydfbnVtJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTm90ZTogVGhlIGhpZ2hlc3QgY29sdW1uIHZhbHVlcyBpcyBJVi4gVGhlIGZvbGxvd2luZyByZWdleGVzIG1hdGNoDQorICAgICAgICAjIHVwIHRvIElaLiBPdXQgb2YgcmFuZ2UgdmFsdWVzIGFyZSBjYXVnaHQgaW4gdGhlIGNvZGUuDQorICAgICAgICAjDQorICAgICAgICAjIE5vdGU6IHNoZWV0bmFtZXMgd2l0aCB3aGl0ZXNwYWNlLCBjb21tYXMsIG9yIHBhcmVudGhlc2VzIG11c3QgYmUgaW4NCisgICAgICAgICMgc2luZ2xlIHF1b3Rlcy4gQXBwbGllcyB0byByZWYzZCBhbmQgcmFuZ2UzZA0KKyAgICAgICAgIw0KKw0KKyAgICAgICAgIyBNYXRjaCBBMSwgJEExLCBBJDEgb3IgJEEkMS4NCisgICAgICAgIHJlZjJkOiAgICAgICAgICAgIC9cJD9bQS1JXT9bQS1aXVwkP1xkKy8NCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX3JlZjJkJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTWF0Y2ggYW4gZXh0ZXJuYWwgc2hlZXQgcmVmZXJlbmNlOiBTaGVldDEhQTEgb3IgJ1NoZWV0ICgxKSchQTENCisgICAgICAgIHJlZjNkOiAgICAgICAgICAgIC9bXiEoLF0rIVwkP1tBLUldP1tBLVpdXCQ/XGQrLw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgWydfcmVmM2QnLCAkaXRlbVsxXV0gfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgLydbXiddKychXCQ/W0EtSV0/W0EtWl1cJD9cZCsvDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19yZWYzZCcsICRpdGVtWzFdXSB9DQorDQorICAgICAgICAjIE1hdGNoIEExOkM1LCAkQTE6JEM1IG9yIEE6QyBldGMuDQorICAgICAgICByYW5nZTJkOiAgICAgICAgICAvXCQ/W0EtSV0/W0EtWl1cJD8oXGQrKT86XCQ/W0EtSV0/W0EtWl1cJD8oXGQrKT8vDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19yYW5nZTJkJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTWF0Y2ggYW4gZXh0ZXJuYWwgc2hlZXQgcmFuZ2UuICdTaGVldCAxOlNoZWV0IDInIUIyOkM1DQorICAgICAgICByYW5nZTNkOiAgICAgICAgICAvW14hKCxdKyFcJD9bQS1JXT9bQS1aXVwkPyhcZCspPzpcJD9bQS1JXT9bQS1aXVwkPyhcZCspPy8NCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX3JhbmdlM2QnLCAkaXRlbVsxXV0gfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgLydbXiddKychXCQ/W0EtSV0/W0EtWl1cJD8oXGQrKT86XCQ/W0EtSV0/W0EtWl1cJD8oXGQrKT8vDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19yYW5nZTNkJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTWF0Y2ggYSBmdW5jdGlvbiBuYW1lLg0KKyAgICAgICAgZnVuY3Rpb246ICAgICAgICAgL1tBLVowLTnALdxfLl0rLyAnKCknDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19mdW5jJywgJGl0ZW1bMV1dIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB8IC9bQS1aMC05wC3cXy5dKy8gJygnIGV4cHIgJyknDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19jbGFzcycsICRpdGVtWzFdLCAkaXRlbVszXSwgJ19mdW5jJywgJGl0ZW1bMV1dIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB8IC9bQS1aMC05wC3cXy5dKy8gJygnIGxpc3QgJyknDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19jbGFzcycsICRpdGVtWzFdLCAkaXRlbVszXSwgJ19mdW5jJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTWF0Y2ggYSBkZWZpbmVkIG5hbWUuDQorICAgICAgICBuYW1lOiAgICAgICAgICAgL1tBLVphLXpfXVx3Ky8NCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX25hbWUnLCAkaXRlbVsxXV0gfQ0KKw0KKyAgICAgICAgIyBCb29sZWFuIHZhbHVlcy4NCisgICAgICAgIHRydWU6ICAgICAgICAgICAnVFJVRScgIHsgWyAncHRnQm9vbCcsIDEgXSB9DQorDQorICAgICAgICBmYWxzZTogICAgICAgICAgJ0ZBTFNFJyB7IFsgJ3B0Z0Jvb2wnLCAwIF0gfQ0KKw0KK0VuZEdyYW1tYXINCisNCitwcmludCAiSW5pdF9wYXJzZXIuXG5cbiIgaWYgJF9kZWJ1ZzsNCit9DQorDQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIHBhcnNlX2Zvcm11bGEoKQ0KKyMNCisjIFRha2VzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhIGZvcm11bGEgYW5kIHJldHVybnMgYSBSUE4gZW5jb2RlZCBieXRlDQorIyBzdHJpbmcuDQorIw0KK3N1YiBwYXJzZV9mb3JtdWxhIHsNCisNCisgICAgbXkgJHNlbGY9IHNoaWZ0Ow0KKw0KKyAgICAjIEluaXRpYWxpc2UgdGhlIHBhcnNlciBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsDQorICAgICRzZWxmLT5faW5pdF9wYXJzZXIoKSBpZiBub3QgZGVmaW5lZCAkcGFyc2VyOw0KKw0KKyAgICBteSAkZm9ybXVsYSA9IHNoaWZ0IEBfOw0KKyAgICBteSAkdG9rZW5zOw0KKw0KKyAgICBwcmludCAkZm9ybXVsYSwgIlxuIiBpZiAkX2RlYnVnOw0KKw0KKyAgICAjIEJ1aWxkIHRoZSBwYXJzZSB0cmVlIGZvciB0aGUgZm9ybXVsYQ0KKyAgICBteSAkcGFyc2V0cmVlID0kcGFyc2VyLT5leHByKCRmb3JtdWxhKTsNCisNCisgICAgIyBDaGVjayBpZiBwYXJzaW5nIHdvcmtlZC4NCisgICAgaWYgKGRlZmluZWQgJHBhcnNldHJlZSkgew0KKyAgICAgICAgbXkgQHRva2VucyA9ICRzZWxmLT5fcmV2ZXJzZV90cmVlKEAkcGFyc2V0cmVlKTsNCisNCisgICAgICAgICMgQWRkIGEgdm9sYXRpbGUgdG9rZW4gaWYgdGhlIGZvcm11bGEgY29udGFpbnMgYSB2b2xhdGlsZSBmdW5jdGlvbi4NCisgICAgICAgICMgVGhpcyBtdXN0IGJlIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgbGlzdA0KKyAgICAgICAgIw0KKyAgICAgICAgdW5zaGlmdCBAdG9rZW5zLCAnX3ZvbCcgaWYgJHNlbGYtPl9jaGVja192b2xhdGlsZShAdG9rZW5zKTsNCisNCisgICAgICAgICMgVGhlIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIHdoaWNoIFdvcmtzaGVldC5wbSBtZXRob2QgaXMgdGhlIGNhbGxlcg0KKyAgICAgICAgaWYgKHdhbnRhcnJheSkgew0KKyAgICAgICAgICAgICMgUGFyc2UgZm9ybXVsYSB0byBzZWUgaWYgaXQgdGhyb3dzIGFueSBlcnJvcnMgYW5kIHRoZW4NCisgICAgICAgICAgICAjIHJldHVybiByYXcgdG9rZW5zIHRvIFdvcmtzaGVldDo6c3RvcmVfZm9ybXVsYSgpDQorICAgICAgICAgICAgIw0KKyAgICAgICAgICAgICRzZWxmLT5wYXJzZV90b2tlbnMoQHRva2Vucyk7DQorICAgICAgICAgICAgcmV0dXJuIEB0b2tlbnM7DQorICAgICAgICB9DQorICAgICAgICBlbHNlew0KKyAgICAgICAgICAgICMgUmV0dXJuIGJ5dGUgc3RyZWFtIHRvIFdvcmtzaGVldDo6d3JpdGVfZm9ybXVsYSgpDQorICAgICAgICAgICAgcmV0dXJuICRzZWxmLT5wYXJzZV90b2tlbnMoQHRva2Vucyk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgICBkaWUgIkNvdWxkbid0IHBhcnNlIGZvcm11bGE6ID0kZm9ybXVsYVxuIjsNCisgICAgfQ0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgcGFyc2VfdG9rZW5zKCkNCisjDQorIyBDb252ZXJ0IGVhY2ggdG9rZW4gb3IgdG9rZW4gcGFpciB0byBpdHMgRXhjZWwgJ3B0ZycgZXF1aXZhbGVudC4NCisjDQorc3ViIHBhcnNlX3Rva2VucyB7DQorDQorICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkcGFyc2Vfc3RyICAgPSAnJzsNCisgICAgbXkgJGxhc3RfdHlwZSAgID0gJyc7DQorICAgIG15ICRtb2RpZmllciAgICA9ICcnOw0KKyAgICBteSAkbnVtX2FyZ3MgICAgPSAwOw0KKyAgICBteSAkY2xhc3MgICAgICAgPSAwOw0KKyAgICBteSBAY2xhc3MgICAgICAgPSAxOw0KKyAgICBteSBAdG9rZW5zICAgICAgPSBAXzsNCisNCisNCisgICAgIyBBIG5vdGUgYWJvdXQgdGhlIGNsYXNzIG1vZGlmaWVycyB1c2VkIGJlbG93LiBJbiBnZW5lcmFsIHRoZSBjbGFzcywNCisgICAgIyAicmVmZXJlbmNlIiBvciAidmFsdWUiLCBvZiBhIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIG9mIGl0cyBvcGVyYW5kcy4NCisgICAgIyBIb3dldmVyLCBpbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgdGhlIG9wZXJhbmRzIGNhbiBoYXZlIG1peGVkIGNsYXNzZXMsDQorICAgICMgZS5nLiA9VkxPT0tVUCB3aXRoIGV4dGVybmFsIHJlZmVyZW5jZXMuIFRoZXNlIHdpbGwgZXZlbnR1YWxseSBiZSBkZWFsdA0KKyAgICAjIHdpdGggYnkgdGhlIHBhcnNlci4gSG93ZXZlciwgYXMgYSB3b3JrYXJvdW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgdG9rZW4NCisgICAgIyBjYW4gYmUgY2hhbmdlZCB2aWEgdGhlIHJlcGVhdF9mb3JtdWxhIGludGVyZmFjZS4gVGh1cywgYSBfcmVmMmQgdG9rZW4gY2FuDQorICAgICMgYmUgY2hhbmdlZCBieSB0aGUgdXNlciB0byBfcmVmMmRBIG9yIF9yZWYyZFIgdG8gY2hhbmdlIGl0cyB0b2tlbiBjbGFzcy4NCisgICAgIw0KKyAgICB3aGlsZSAoQF8pIHsNCisgICAgICAgIG15ICR0b2tlbiA9IHNoaWZ0IEBfOw0KKw0KKyAgICAgICAgaWYgKCR0b2tlbiBlcSAnX2FyZycpIHsNCisgICAgICAgICAgICAkbnVtX2FyZ3MgPSBzaGlmdCBAXzsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gZXEgJ19jbGFzcycpIHsNCisgICAgICAgICAgICAkdG9rZW4gPSBzaGlmdCBAXzsNCisgICAgICAgICAgICAkY2xhc3MgPSAkZnVuY3Rpb25zeyR0b2tlbn1bMl07DQorICAgICAgICAgICAgIyBJZiAkY2xhc3MgaXMgdW5kZWYgdGhlbiBpdCBtZWFucyB0aGF0IHRoZSBmdW5jdGlvbiBpc24ndCB2YWxpZC4NCisgICAgICAgICAgICBkaWUgIlVua25vd24gZnVuY3Rpb24gJHRva2VuKCkgaW4gZm9ybXVsYVxuIiB1bmxlc3MgZGVmaW5lZCAkY2xhc3M7DQorICAgICAgICAgICAgcHVzaCBAY2xhc3MsICRjbGFzczsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gZXEgJ192b2wnKSB7DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAgLj0gJHNlbGYtPl9jb252ZXJ0X3ZvbGF0aWxlKCk7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuIGVxICdwdGdCb29sJykgew0KKyAgICAgICAgICAgICR0b2tlbiA9IHNoaWZ0IEBfOw0KKyAgICAgICAgICAgICRwYXJzZV9zdHIgLj0gJHNlbGYtPl9jb252ZXJ0X2Jvb2woJHRva2VuKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gZXEgJ19udW0nKSB7DQorICAgICAgICAgICAgJHRva2VuID0gc2hpZnQgQF87DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAuPSAkc2VsZi0+X2NvbnZlcnRfbnVtYmVyKCR0b2tlbik7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuIGVxICdfc3RyJykgew0KKyAgICAgICAgICAgICR0b2tlbiA9IHNoaWZ0IEBfOw0KKyAgICAgICAgICAgICRwYXJzZV9zdHIgLj0gJHNlbGYtPl9jb252ZXJ0X3N0cmluZygkdG9rZW4pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzaWYgKCR0b2tlbiA9fiAvXl9yZWYyZC8pIHsNCisgICAgICAgICAgICAoJG1vZGlmaWVyICA9ICR0b2tlbikgPX4gcy9fcmVmMmQvLzsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9ICRjbGFzc1stMV07DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAwIGlmICRtb2RpZmllciBlcSAnUic7DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAxIGlmICRtb2RpZmllciBlcSAnVic7DQorICAgICAgICAgICAgJHRva2VuICAgICAgPSBzaGlmdCBAXzsNCisgICAgICAgICAgICAkcGFyc2Vfc3RyIC49ICRzZWxmLT5fY29udmVydF9yZWYyZCgkdG9rZW4sICRjbGFzcyk7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuID1+IC9eX3JlZjNkLykgew0KKyAgICAgICAgICAgICgkbW9kaWZpZXIgID0gJHRva2VuKSA9fiBzL19yZWYzZC8vOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gJGNsYXNzWy0xXTsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDAgaWYgJG1vZGlmaWVyIGVxICdSJzsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDEgaWYgJG1vZGlmaWVyIGVxICdWJzsNCisgICAgICAgICAgICAkdG9rZW4gICAgICA9IHNoaWZ0IEBfOw0KKyAgICAgICAgICAgICRwYXJzZV9zdHIgLj0gJHNlbGYtPl9jb252ZXJ0X3JlZjNkKCR0b2tlbiwgJGNsYXNzKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gPX4gL15fcmFuZ2UyZC8pIHsNCisgICAgICAgICAgICAoJG1vZGlmaWVyICA9ICR0b2tlbikgPX4gcy9fcmFuZ2UyZC8vOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gJGNsYXNzWy0xXTsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDAgaWYgJG1vZGlmaWVyIGVxICdSJzsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDEgaWYgJG1vZGlmaWVyIGVxICdWJzsNCisgICAgICAgICAgICAkdG9rZW4gICAgICA9IHNoaWZ0IEBfOw0KKyAgICAgICAgICAgICRwYXJzZV9zdHIgLj0gJHNlbGYtPl9jb252ZXJ0X3JhbmdlMmQoJHRva2VuLCAkY2xhc3MpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzaWYgKCR0b2tlbiA9fiAvXl9yYW5nZTNkLykgew0KKyAgICAgICAgICAgICgkbW9kaWZpZXIgID0gJHRva2VuKSA9fiBzL19yYW5nZTNkLy87DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAkY2xhc3NbLTFdOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gMCBpZiAkbW9kaWZpZXIgZXEgJ1InOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gMSBpZiAkbW9kaWZpZXIgZXEgJ1YnOw0KKyAgICAgICAgICAgICR0b2tlbiAgICAgID0gc2hpZnQgQF87DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAuPSAkc2VsZi0+X2NvbnZlcnRfcmFuZ2UzZCgkdG9rZW4sICRjbGFzcyk7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuID1+IC9eX25hbWUvKSB7DQorICAgICAgICAgICAgKCRtb2RpZmllciAgPSAkdG9rZW4pID1+IHMvX25hbWUvLzsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9ICRjbGFzc1stMV07DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAwIGlmICRtb2RpZmllciBlcSAnUic7DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAxIGlmICRtb2RpZmllciBlcSAnVic7DQorICAgICAgICAgICAgJHRva2VuID0gc2hpZnQgQF87DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAuPSAkc2VsZi0+X2NvbnZlcnRfbmFtZSgkdG9rZW4sICRjbGFzcyk7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuIGVxICdfZnVuYycpIHsNCisgICAgICAgICAgICAkdG9rZW4gPSBzaGlmdCBAXzsNCisgICAgICAgICAgICAkcGFyc2Vfc3RyIC49ICRzZWxmLT5fY29udmVydF9mdW5jdGlvbigkdG9rZW4sICRudW1fYXJncyk7DQorICAgICAgICAgICAgcG9wIEBjbGFzczsNCisgICAgICAgICAgICAkbnVtX2FyZ3MgPSAwOyAjIFJlc2V0IGFmdGVyIHVzZQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzaWYgKGV4aXN0cyAkcHRneyR0b2tlbn0pIHsNCisgICAgICAgICAgICAkcGFyc2Vfc3RyIC49IHBhY2soIkMiLCAkcHRneyR0b2tlbn0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgIyBVbnJlY29nbmlzZWQgdG9rZW4NCisgICAgICAgICAgICByZXR1cm4gdW5kZWY7DQorICAgICAgICB9DQorICAgIH0NCisNCisNCisgICAgaWYgKCRfZGVidWcpIHsNCisgICAgICAgIHByaW50IGpvaW4oIiAiLCBtYXAgeyBzcHJpbnRmICIlMDJYIiwgJF8gfSB1bnBhY2soIkMqIiwkcGFyc2Vfc3RyKSk7DQorICAgICAgICBwcmludCAiXG5cbiI7DQorICAgICAgICBwcmludCBqb2luKCIgIiwgQHRva2VucyksICJcblxuIjsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gJHBhcnNlX3N0cjsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjICBfcmV2ZXJzZV90cmVlKCkNCisjDQorIyBUaGlzIGZ1bmN0aW9uIGRlc2NlbmRzIHJlY3Vyc2l2ZWx5IHRocm91Z2ggdGhlIHBhcnNlIHRyZWUuIEF0IGVhY2ggbGV2ZWwgaXQNCisjIHN3YXBzIHRoZSBvcmRlciBvZiBhbiBvcGVyYXRvciBmb2xsb3dlZCBieSBhbiBvcGVyYW5kLg0KKyMgRm9yIGV4YW1wbGUsIDErMiozIHdvdWxkIGJlIGNvbnZlcnRlZCBpbiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlOg0KKyMgICAgICAgICAgICAgICAxICsgMiAqIDMNCisjICAgICAgICAgICAgICAgMSArICgyICogMykNCisjICAgICAgICAgICAgICAgMSArICgyIDMgKikNCisjICAgICAgICAgICAgICAgMSAoMiAzICopICsNCisjICAgICAgICAgICAgICAgMSAyIDMgKiArDQorIw0KK3N1YiBfcmV2ZXJzZV90cmVlDQorew0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKw0KKyAgICBteSBAdG9rZW5zOw0KKyAgICBteSBAZXhwcmVzc2lvbiA9IEBfOw0KKyAgICBteSBAc3RhY2s7DQorDQorICAgIHdoaWxlIChAZXhwcmVzc2lvbikgew0KKyAgICAgICAgbXkgJHRva2VuID0gc2hpZnQgQGV4cHJlc3Npb247DQorDQorICAgICAgICAjIElmIHRoZSB0b2tlbiBpcyBhbiBvcGVyYXRvciBzd2FwIGl0IHdpdGggdGhlIGZvbGxvd2luZyBvcGVyYW5kDQorICAgICAgICBpZiAoICAgICR0b2tlbiBlcSAncHRnQWRkJyAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnU3ViJyAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnQ29uY2F0JyAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnTXVsJyAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnRGl2JyAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnUG93ZXInICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnRVEnICAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnTkUnICAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnTEUnICAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnR0UnICAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnTFQnICAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnR1QnKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG15ICRvcGVyYW5kID0gc2hpZnQgQGV4cHJlc3Npb247DQorICAgICAgICAgICAgcHVzaCBAc3RhY2ssICRvcGVyYW5kOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVzaCBAc3RhY2ssICR0b2tlbjsNCisgICAgfQ0KKw0KKyAgICAjIFJlY3Vyc2UgdGhyb3VnaCB0aGUgcGFyc2UgdHJlZQ0KKyAgICBmb3JlYWNoIG15ICR0b2tlbiAoQHN0YWNrKSB7DQorICAgICAgICBpZiAocmVmKCR0b2tlbikpIHsNCisgICAgICAgICAgICBwdXNoIEB0b2tlbnMsICRzZWxmLT5fcmV2ZXJzZV90cmVlKEAkdG9rZW4pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgcHVzaCBAdG9rZW5zLCAkdG9rZW47DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuICBAdG9rZW5zOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgIF9jaGVja192b2xhdGlsZSgpDQorIw0KKyMgQ2hlY2sgaWYgdGhlIGZvcm11bGEgY29udGFpbnMgYSB2b2xhdGlsZSBmdW5jdGlvbiwgaS5lLiBhIGZ1bmN0aW9uIHRoYXQgbXVzdA0KKyMgYmUgcmVjYWxjdWxhdGVkIGVhY2ggdGltZSBhIGNlbGwgaXMgdXBkYXRlZC4gVGhlc2UgZm9ybXVsYXMgcmVxdWlyZSBhIHB0Z0F0dHINCisjIHdpdGggdGhlIHZvbGF0aWxlIGZsYWcgc2V0IGFzIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgcGFyc2VkIGV4cHJlc3Npb24uDQorIw0KKyMgRXhhbXBsZXMgb2Ygdm9sYXRpbGUgZnVuY3Rpb25zOiBSQU5EKCksIE5PVygpLCBUT0RBWSgpDQorIw0KK3N1YiBfY2hlY2tfdm9sYXRpbGUgew0KKw0KKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsNCisgICAgbXkgQHRva2VucyAgID0gQF87DQorICAgIG15ICR2b2xhdGlsZSA9IDA7DQorDQorICAgIGZvciBteSAkaSAoMC4uQHRva2Vucy0xKSB7DQorICAgICAgICAjIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgZnVuY3Rpb24gY2hlY2sgaWYgaXQgaXMgdm9sYXRpbGUuDQorICAgICAgICBpZiAoJHRva2Vuc1skaV0gZXEgJ19mdW5jJyBhbmQgJGZ1bmN0aW9uc3skdG9rZW5zWyRpKzFdfVszXSkgew0KKyAgICAgICAgICAgICR2b2xhdGlsZSA9IDE7DQorICAgICAgICAgICAgbGFzdDsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gJHZvbGF0aWxlOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2NvbnZlcnRfdm9sYXRpbGUoKQ0KKyMNCisjIENvbnZlcnQgX3ZvbCB0byBhIHB0Z0F0dHIgdGFnIGZvcm1hdHRlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmb3JtdWxhIGNvbnRhaW5zDQorIyBhIHZvbGF0aWxlIGZ1bmN0aW9uLiBTZWUgX2NoZWNrX3ZvbGF0aWxlKCkNCisjDQorc3ViIF9jb252ZXJ0X3ZvbGF0aWxlIHsNCisNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisNCisgICAgIyBTZXQgYml0RmF0dHJTZW1pIGZsYWcgdG8gaW5kaWNhdGUgdm9sYXRpbGUgZnVuY3Rpb24sICJ3IiBpcyBzZXQgdG8gemVyby4NCisgICAgcmV0dXJuIHBhY2soIkNDdiIsICRwdGd7cHRnQXR0cn0sIDB4MSwgMHgwKTsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X2Jvb2woKQ0KKyMNCisjIENvbnZlcnQgYSBib29sZWFuIHRva2VuIHRvIHB0Z0Jvb2wNCisjDQorc3ViIF9jb252ZXJ0X2Jvb2wgew0KKw0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKyAgICBteSAkYm9vbCA9IHNoaWZ0Ow0KKw0KKyAgICByZXR1cm4gcGFjaygiQ0MiLCAkcHRne3B0Z0Jvb2x9LCAkYm9vbCk7DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfY29udmVydF9udW1iZXIoKQ0KKyMNCisjIENvbnZlcnQgYSBudW1iZXIgdG9rZW4gdG8gcHRnSW50IG9yIHB0Z051bQ0KKyMNCitzdWIgX2NvbnZlcnRfbnVtYmVyIHsNCisNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisgICAgbXkgJG51bSAgPSBzaGlmdDsNCisNCisgICAgIyBJbnRlZ2VyIGluIHRoZSByYW5nZSAwLi4yKioxNi0xDQorICAgIGlmICgoJG51bSA9fiAvXlxkKyQvKSAmJiAoJG51bSA8PSA2NTUzNSkpIHsNCisgICAgICAgIHJldHVybiBwYWNrKCJDdiIsICRwdGd7cHRnSW50fSwgJG51bSk7DQorICAgIH0NCisgICAgZWxzZSB7ICMgQSBmbG9hdA0KKyAgICAgICAgJG51bSA9IHBhY2soImQiLCAkbnVtKTsNCisgICAgICAgICRudW0gPSByZXZlcnNlICRudW0gaWYgJHNlbGYtPntfYnl0ZV9vcmRlcn07DQorICAgICAgICByZXR1cm4gcGFjaygiQyIsICRwdGd7cHRnTnVtfSkgLiAkbnVtOw0KKyAgICB9DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfY29udmVydF9zdHJpbmcoKQ0KKyMNCisjIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBwdGcgU3RyLg0KKyMNCitzdWIgX2NvbnZlcnRfc3RyaW5nIHsNCisNCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7DQorICAgIG15ICRzdHIgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkZW5jb2RpbmcgPSAwOw0KKw0KKyAgICAkc3RyID1+IHMvXiIvLzsgICAjIFJlbW92ZSBsZWFkaW5nICAiDQorICAgICRzdHIgPX4gcy8iJC8vOyAgICMgUmVtb3ZlIHRyYWlsaW5nICINCisgICAgJHN0ciA9fiBzLyIiLyIvZzsgIyBTdWJzdGl0dXRlIEV4Y2VsJ3MgZXNjYXBlZCBkb3VibGUgcXVvdGUgIiIgZm9yICINCisNCisgICAgbXkgJGxlbmd0aCA9IGxlbmd0aCgkc3RyKTsNCisNCisgICAgIyBIYW5kbGUgdXRmOCBzdHJpbmdzIGluIHBlcmwgNS44Lg0KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsNCisgICAgICAgIHJlcXVpcmUgRW5jb2RlOw0KKw0KKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkc3RyKSkgew0KKyAgICAgICAgICAgICRzdHIgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkc3RyKTsNCisgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIGRpZSAiU3RyaW5nIGluIGZvcm11bGEgaGFzIG1vcmUgdGhhbiAyNTUgY2hhcnNcbiIgaWYgJGxlbmd0aCA+IDI1NTsNCisNCisgICAgcmV0dXJuIHBhY2soIkNDQyIsICRwdGd7cHRnU3RyfSwgJGxlbmd0aCwgJGVuY29kaW5nKSAuICRzdHI7DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfY29udmVydF9yZWYyZCgpDQorIw0KKyMgQ29udmVydCBhbiBFeGNlbCByZWZlcmVuY2Ugc3VjaCBhcyBBMSwgJEIyLCBDJDMgb3IgJEQkNCB0byBhIHB0Z1JlZlYuDQorIw0KK3N1YiBfY29udmVydF9yZWYyZCB7DQorDQorICAgIG15ICRzZWxmICA9IHNoaWZ0Ow0KKyAgICBteSAkY2VsbCAgPSBzaGlmdDsNCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7DQorICAgIG15ICRwdGdSZWY7DQorDQorICAgICMgQ29udmVydCB0aGUgY2VsbCByZWZlcmVuY2UNCisgICAgbXkgKCRyb3csICRjb2wpID0gJHNlbGYtPl9jZWxsX3RvX3BhY2tlZF9yb3djb2woJGNlbGwpOw0KKw0KKyAgICAjIFRoZSBwdGcgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY2xhc3Mgb2YgdGhlIHB0Zy4NCisgICAgaWYgICAgKCRjbGFzcyA9PSAwKSB7DQorICAgICAgICAkcHRnUmVmID0gcGFjaygiQyIsICRwdGd7cHRnUmVmfSk7DQorICAgIH0NCisgICAgZWxzaWYgKCRjbGFzcyA9PSAxKSB7DQorICAgICAgICAkcHRnUmVmID0gcGFjaygiQyIsICRwdGd7cHRnUmVmVn0pOw0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMikgew0KKyAgICAgICAgJHB0Z1JlZiA9IHBhY2soIkMiLCAkcHRne3B0Z1JlZkF9KTsNCisgICAgfQ0KKyAgICBlbHNlew0KKyAgICAgICAgZGllICJVbmtub3duIGZ1bmN0aW9uIGNsYXNzIGluIGZvcm11bGFcbiI7DQorICAgIH0NCisNCisgICAgcmV0dXJuICRwdGdSZWYgLiAkcm93IC4gJGNvbDsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X3JlZjNkDQorIw0KKyMgQ29udmVydCBhbiBFeGNlbCAzZCByZWZlcmVuY2Ugc3VjaCBhcyAiU2hlZXQxIUExIiBvciAiU2hlZXQxOlNoZWV0MiFBMSIgdG8gYQ0KKyMgcHRnUmVmM2RWLg0KKyMNCitzdWIgX2NvbnZlcnRfcmVmM2Qgew0KKw0KKyAgICBteSAkc2VsZiAgPSBzaGlmdDsNCisgICAgbXkgJHRva2VuID0gc2hpZnQ7DQorICAgIG15ICRjbGFzcyA9IHNoaWZ0Ow0KKyAgICBteSAkcHRnUmVmOw0KKw0KKyAgICAjIFNwbGl0IHRoZSByZWYgYXQgdGhlICEgc3ltYm9sDQorICAgIG15ICgkZXh0X3JlZiwgJGNlbGwpID0gc3BsaXQgJyEnLCAkdG9rZW47DQorDQorICAgICMgQ29udmVydCB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlIHBhcnQNCisgICAgJGV4dF9yZWYgPSAkc2VsZi0+X3BhY2tfZXh0X3JlZigkZXh0X3JlZik7DQorDQorICAgICMgQ29udmVydCB0aGUgY2VsbCByZWZlcmVuY2UgcGFydA0KKyAgICBteSAoJHJvdywgJGNvbCkgPSAkc2VsZi0+X2NlbGxfdG9fcGFja2VkX3Jvd2NvbCgkY2VsbCk7DQorDQorICAgICMgVGhlIHB0ZyB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjbGFzcyBvZiB0aGUgcHRnLg0KKyAgICBpZiAgICAoJGNsYXNzID09IDApIHsNCisgICAgICAgICRwdGdSZWYgPSBwYWNrKCJDIiwgJHB0Z3twdGdSZWYzZH0pOw0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMSkgew0KKyAgICAgICAgJHB0Z1JlZiA9IHBhY2soIkMiLCAkcHRne3B0Z1JlZjNkVn0pOw0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMikgew0KKyAgICAgICAgJHB0Z1JlZiA9IHBhY2soIkMiLCAkcHRne3B0Z1JlZjNkQX0pOw0KKyAgICB9DQorICAgIGVsc2V7DQorICAgICAgICBkaWUgIlVua25vd24gZnVuY3Rpb24gY2xhc3MgaW4gZm9ybXVsYVxuIjsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gJHB0Z1JlZiAuICRleHRfcmVmLiAkcm93IC4gJGNvbDsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X3JhbmdlMmQoKQ0KKyMNCisjIENvbnZlcnQgYW4gRXhjZWwgcmFuZ2Ugc3VjaCBhcyBBMTpENCBvciBBOkQgdG8gYSBwdGdSZWZWLg0KKyMNCitzdWIgX2NvbnZlcnRfcmFuZ2UyZCB7DQorDQorICAgIG15ICRzZWxmICA9IHNoaWZ0Ow0KKyAgICBteSAkcmFuZ2UgPSBzaGlmdDsNCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7DQorICAgIG15ICRwdGdBcmVhOw0KKw0KKyAgICAjIFNwbGl0IHRoZSByYW5nZSBpbnRvIDIgY2VsbCByZWZzDQorICAgIG15ICgkY2VsbDEsICRjZWxsMikgPSBzcGxpdCAnOicsICRyYW5nZTsNCisNCisgICAgIyBBIHJhbmdlIHN1Y2ggYXMgQTpEIGlzIGVxdWl2YWxlbnQgdG8gQTE6RDY1NTM2LCBzbyBhZGQgcm93cyBhcyByZXF1aXJlZA0KKyAgICAkY2VsbDEgLj0gJzEnICAgICBpZiAkY2VsbDEgIX4gL1xkLzsNCisgICAgJGNlbGwyIC49ICc2NTUzNicgaWYgJGNlbGwyICF+IC9cZC87DQorDQorICAgICMgQ29udmVydCB0aGUgY2VsbCByZWZlcmVuY2VzDQorICAgIG15ICgkcm93MSwgJGNvbDEpID0gJHNlbGYtPl9jZWxsX3RvX3BhY2tlZF9yb3djb2woJGNlbGwxKTsNCisgICAgbXkgKCRyb3cyLCAkY29sMikgPSAkc2VsZi0+X2NlbGxfdG9fcGFja2VkX3Jvd2NvbCgkY2VsbDIpOw0KKw0KKyAgICAjIFRoZSBwdGcgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY2xhc3Mgb2YgdGhlIHB0Zy4NCisgICAgaWYgICAgKCRjbGFzcyA9PSAwKSB7DQorICAgICAgICAkcHRnQXJlYSA9IHBhY2soIkMiLCAkcHRne3B0Z0FyZWF9KTsNCisgICAgfQ0KKyAgICBlbHNpZiAoJGNsYXNzID09IDEpIHsNCisgICAgICAgICRwdGdBcmVhID0gcGFjaygiQyIsICRwdGd7cHRnQXJlYVZ9KTsNCisgICAgfQ0KKyAgICBlbHNpZiAoJGNsYXNzID09IDIpIHsNCisgICAgICAgICRwdGdBcmVhID0gcGFjaygiQyIsICRwdGd7cHRnQXJlYUF9KTsNCisgICAgfQ0KKyAgICBlbHNlew0KKyAgICAgICAgZGllICJVbmtub3duIGZ1bmN0aW9uIGNsYXNzIGluIGZvcm11bGFcbiI7DQorICAgIH0NCisNCisgICAgcmV0dXJuICRwdGdBcmVhIC4gJHJvdzEgLiAkcm93MiAuICRjb2wxLiAkY29sMjsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X3JhbmdlM2QNCisjDQorIyBDb252ZXJ0IGFuIEV4Y2VsIDNkIHJhbmdlIHN1Y2ggYXMgIlNoZWV0MSFBMTpENCIgb3IgIlNoZWV0MTpTaGVldDIhQTE6RDQiIHRvDQorIyBhIHB0Z0FyZWEzZFYuDQorIw0KK3N1YiBfY29udmVydF9yYW5nZTNkIHsNCisNCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkdG9rZW4gICAgID0gc2hpZnQ7DQorICAgIG15ICRjbGFzcyA9IHNoaWZ0Ow0KKyAgICBteSAkcHRnQXJlYTsNCisNCisgICAgIyBTcGxpdCB0aGUgcmVmIGF0IHRoZSAhIHN5bWJvbA0KKyAgICBteSAoJGV4dF9yZWYsICRyYW5nZSkgPSBzcGxpdCAnIScsICR0b2tlbjsNCisNCisgICAgIyBDb252ZXJ0IHRoZSBleHRlcm5hbCByZWZlcmVuY2UgcGFydA0KKyAgICAkZXh0X3JlZiA9ICRzZWxmLT5fcGFja19leHRfcmVmKCRleHRfcmVmKTsNCisNCisgICAgIyBTcGxpdCB0aGUgcmFuZ2UgaW50byAyIGNlbGwgcmVmcw0KKyAgICBteSAoJGNlbGwxLCAkY2VsbDIpID0gc3BsaXQgJzonLCAkcmFuZ2U7DQorDQorICAgICMgQSByYW5nZSBzdWNoIGFzIEE6RCBpcyBlcXVpdmFsZW50IHRvIEExOkQ2NTUzNiwgc28gYWRkIHJvd3MgYXMgcmVxdWlyZWQNCisgICAgJGNlbGwxIC49ICcxJyAgICAgaWYgJGNlbGwxICF+IC9cZC87DQorICAgICRjZWxsMiAuPSAnNjU1MzYnIGlmICRjZWxsMiAhfiAvXGQvOw0KKw0KKyAgICAjIENvbnZlcnQgdGhlIGNlbGwgcmVmZXJlbmNlcw0KKyAgICBteSAoJHJvdzEsICRjb2wxKSA9ICRzZWxmLT5fY2VsbF90b19wYWNrZWRfcm93Y29sKCRjZWxsMSk7DQorICAgIG15ICgkcm93MiwgJGNvbDIpID0gJHNlbGYtPl9jZWxsX3RvX3BhY2tlZF9yb3djb2woJGNlbGwyKTsNCisNCisgICAgIyBUaGUgcHRnIHZhbHVlIGRlcGVuZHMgb24gdGhlIGNsYXNzIG9mIHRoZSBwdGcuDQorICAgIGlmICAgICgkY2xhc3MgPT0gMCkgew0KKyAgICAgICAgJHB0Z0FyZWEgPSBwYWNrKCJDIiwgJHB0Z3twdGdBcmVhM2R9KTsNCisgICAgfQ0KKyAgICBlbHNpZiAoJGNsYXNzID09IDEpIHsNCisgICAgICAgICRwdGdBcmVhID0gcGFjaygiQyIsICRwdGd7cHRnQXJlYTNkVn0pOw0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMikgew0KKyAgICAgICAgJHB0Z0FyZWEgPSBwYWNrKCJDIiwgJHB0Z3twdGdBcmVhM2RBfSk7DQorICAgIH0NCisgICAgZWxzZXsNCisgICAgICAgIGRpZSAiVW5rbm93biBmdW5jdGlvbiBjbGFzcyBpbiBmb3JtdWxhXG4iOw0KKyAgICB9DQorDQorICAgIHJldHVybiAkcHRnQXJlYSAuICRleHRfcmVmIC4gJHJvdzEgLiAkcm93MiAuICRjb2wxLiAkY29sMjsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9wYWNrX2V4dF9yZWYoKQ0KKyMNCisjIENvbnZlcnQgdGhlIHNoZWV0IG5hbWUgcGFydCBvZiBhbiBleHRlcm5hbCByZWZlcmVuY2UsIGZvciBleGFtcGxlICJTaGVldDEiIG9yDQorIyAiU2hlZXQxOlNoZWV0MiIsIHRvIGEgcGFja2VkIHN0cnVjdHVyZS4NCisjDQorc3ViIF9wYWNrX2V4dF9yZWYgew0KKw0KKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0Ow0KKyAgICBteSAkZXh0X3JlZiA9IHNoaWZ0Ow0KKyAgICBteSAkc2hlZXQxOw0KKyAgICBteSAkc2hlZXQyOw0KKw0KKyAgICAkZXh0X3JlZiA9fiBzL14nLy87ICAgIyBSZW1vdmUgbGVhZGluZyAgJyBpZiBhbnkuDQorICAgICRleHRfcmVmID1+IHMvJyQvLzsgICAjIFJlbW92ZSB0cmFpbGluZyAnIGlmIGFueS4NCisNCisgICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhIHNoZWV0IHJhbmdlIGVnLiwgU2hlZXQxOlNoZWV0Mi4NCisgICAgaWYgKCRleHRfcmVmID1+IC86Lykgew0KKyAgICAgICAgKCRzaGVldDEsICRzaGVldDIpID0gc3BsaXQgJzonLCAkZXh0X3JlZjsNCisNCisgICAgICAgICRzaGVldDEgPSAkc2VsZi0+X2dldF9zaGVldF9pbmRleCgkc2hlZXQxKTsNCisgICAgICAgICRzaGVldDIgPSAkc2VsZi0+X2dldF9zaGVldF9pbmRleCgkc2hlZXQyKTsNCisNCisgICAgICAgICMgUmV2ZXJzZSBtYXggYW5kIG1pbiBzaGVldCBudW1iZXJzIGlmIG5lY2Vzc2FyeQ0KKyAgICAgICAgaWYgKCRzaGVldDEgPiAkc2hlZXQyKSB7DQorICAgICAgICAgICAgKCRzaGVldDEsICRzaGVldDIpID0gKCRzaGVldDIsICRzaGVldDEpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgICAgIyBTaW5nbGUgc2hlZXQgbmFtZSBvbmx5Lg0KKyAgICAgICAgKCRzaGVldDEsICRzaGVldDIpID0gKCRleHRfcmVmLCAkZXh0X3JlZik7DQorDQorICAgICAgICAkc2hlZXQxID0gJHNlbGYtPl9nZXRfc2hlZXRfaW5kZXgoJHNoZWV0MSk7DQorICAgICAgICAkc2hlZXQyID0gJHNoZWV0MTsNCisgICAgfQ0KKw0KKyAgICBteSAka2V5ID0gIiRzaGVldDE6JHNoZWV0MiI7DQorICAgIG15ICRpbmRleDsNCisNCisgICAgaWYgKGV4aXN0cyAkc2VsZi0+e19leHRfcmVmc30tPnska2V5fSkgew0KKyAgICAgICAgJGluZGV4ID0gJHNlbGYtPntfZXh0X3JlZnN9LT57JGtleX07DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgICAkaW5kZXggPSAkc2VsZi0+e19leHRfcmVmX2NvdW50fTsNCisgICAgICAgICRzZWxmLT57X2V4dF9yZWZzfS0+eyRrZXl9ID0gJGluZGV4Ow0KKyAgICAgICAgJHNlbGYtPntfZXh0X3JlZl9jb3VudH0rKzsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gcGFjaygidiIsJGluZGV4KTsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9nZXRfc2hlZXRfaW5kZXgoKQ0KKyMNCisjIExvb2sgdXAgdGhlIGluZGV4IHRoYXQgY29ycmVzcG9uZHMgdG8gYW4gZXh0ZXJuYWwgc2hlZXQgbmFtZS4gVGhlIGhhc2ggb2YNCisjIHNoZWV0IG5hbWVzIGlzIHVwZGF0ZWQgYnkgdGhlIGFkZF93b3Jrc2hlZXQoKSBtZXRob2Qgb2YgdGhlIFdvcmtib29rIGNsYXNzLg0KKyMNCitzdWIgX2dldF9zaGVldF9pbmRleCB7DQorDQorICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkc2hlZXRfbmFtZSAgPSBzaGlmdDsNCisNCisgICAgIyBIYW5kbGUgdXRmOCBzaGVldG5hbWVzIGluIHBlcmwgNS44Lg0KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsNCisgICAgICAgIHJlcXVpcmUgRW5jb2RlOw0KKw0KKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkc2hlZXRfbmFtZSkpIHsNCisgICAgICAgICAgICAkc2hlZXRfbmFtZSA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZCRSIsICRzaGVldF9uYW1lKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKw0KKyAgICBpZiAobm90IGV4aXN0cyAkc2VsZi0+e19leHRfc2hlZXRzfS0+eyRzaGVldF9uYW1lfSkgew0KKyAgICAgICAgZGllICJVbmtub3duIHNoZWV0IG5hbWUgJHNoZWV0X25hbWUgaW4gZm9ybXVsYVxuIjsNCisgICAgfQ0KKyAgICBlbHNlIHsNCisgICAgICAgIHJldHVybiAkc2VsZi0+e19leHRfc2hlZXRzfS0+eyRzaGVldF9uYW1lfTsNCisgICAgfQ0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgc2V0X2V4dF9zaGVldHMoKQ0KKyMNCisjIFRoaXMgc2VtaS1wdWJsaWMgbWV0aG9kIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBoYXNoIG9mIHNoZWV0IG5hbWVzLiBJdCBpcw0KKyMgdXBkYXRlZCBieSB0aGUgYWRkX3dvcmtzaGVldCgpIG1ldGhvZCBvZiB0aGUgV29ya2Jvb2sgY2xhc3MuDQorIw0KK3N1YiBzZXRfZXh0X3NoZWV0cyB7DQorDQorICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkd29ya3NoZWV0ICAgPSBzaGlmdDsNCisgICAgbXkgJGluZGV4ICAgICAgID0gc2hpZnQ7DQorDQorICAgICMgVGhlIF9leHRfc2hlZXRzIGhhc2ggaXMgdXNlZCB0byB0cmFuc2xhdGUgYmV0d2VlbiB3b3Jrc2hlZXQgbmFtZXMNCisgICAgIyBhbmQgdGhlaXIgaW5kZXgNCisgICAgJHNlbGYtPntfZXh0X3NoZWV0c30tPnskd29ya3NoZWV0fSA9ICRpbmRleDsNCisNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIGdldF9leHRfc2hlZXRzKCkNCisjDQorIyBUaGlzIHNlbWktcHVibGljIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgd29ya3NoZWV0IHJlZmVyZW5jZXMgdGhhdCB3ZXJlDQorIyB1c2VkIGluIGZvcm11bGFzIGZvciBpbmNsdXNpb24gaW4gdGhlIEVYVEVSTlNIRUVUIFdvcmtib29rIHJlY29yZC4NCisjDQorc3ViIGdldF9leHRfc2hlZXRzIHsNCisNCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7DQorDQorICAgIHJldHVybiAleyRzZWxmLT57X2V4dF9yZWZzfX07DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBnZXRfZXh0X3JlZl9jb3VudCgpDQorIw0KKyMgVGhpcyBzZW1pLXB1YmxpYyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGhhc2ggb2Ygc2hlZXQgbmFtZXMuIEl0IGlzDQorIyB1cGRhdGVkIGJ5IHRoZSBhZGRfd29ya3NoZWV0KCkgbWV0aG9kIG9mIHRoZSBXb3JrYm9vayBjbGFzcy4NCisjDQorc3ViIGdldF9leHRfcmVmX2NvdW50IHsNCisNCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7DQorDQorICAgIHJldHVybiAkc2VsZi0+e19leHRfcmVmX2NvdW50fTsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9nZXRfbmFtZV9pbmRleCgpDQorIw0KKyMgTG9vayB1cCB0aGUgaW5kZXggdGhhdCBjb3JyZXNwb25kcyB0byBhbiBleHRlcm5hbCBkZWZpbmVkIG5hbWUuIFRoZSBoYXNoIG9mDQorIyBkZWZpbmVkIG5hbWVzIGlzIHVwZGF0ZWQgYnkgdGhlIGRlZmluZV9uYW1lKCkgbWV0aG9kIGluIHRoZSBXb3JrYm9vayBjbGFzcy4NCisjDQorc3ViIF9nZXRfbmFtZV9pbmRleCB7DQorDQorICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkbmFtZSAgICAgICAgPSBzaGlmdDsNCisNCisgICAgaWYgKG5vdCBleGlzdHMgJHNlbGYtPntfZXh0X25hbWVzfS0+eyRuYW1lfSkgew0KKyAgICAgICAgZGllICJVbmtub3duIGRlZmluZWQgbmFtZSAkbmFtZSBpbiBmb3JtdWxhXG4iOw0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgICAgcmV0dXJuICRzZWxmLT57X2V4dF9uYW1lc30tPnskbmFtZX07DQorICAgIH0NCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIHNldF9leHRfbmFtZSgpDQorIw0KKyMgVGhpcyBzZW1pLXB1YmxpYyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGhhc2ggb2YgZGVmaW5lZCBuYW1lcy4NCisjDQorc3ViIHNldF9leHRfbmFtZSB7DQorDQorICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkbmFtZSAgICAgICAgPSBzaGlmdDsNCisgICAgbXkgJGluZGV4ICAgICAgID0gc2hpZnQ7DQorDQorICAgICRzZWxmLT57X2V4dF9uYW1lc30tPnskbmFtZX0gPSAkaW5kZXg7DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfY29udmVydF9mdW5jdGlvbigpDQorIw0KKyMgQ29udmVydCBhIGZ1bmN0aW9uIHRvIGEgcHRnRnVuYyBvciBwdGdGdW5jVmFyViBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZg0KKyMgYXJncyB0aGF0IGl0IHRha2VzLg0KKyMNCitzdWIgX2NvbnZlcnRfZnVuY3Rpb24gew0KKw0KKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsNCisgICAgbXkgJHRva2VuICAgID0gc2hpZnQ7DQorICAgIG15ICRudW1fYXJncyA9IHNoaWZ0Ow0KKw0KKyAgICBkaWUgIlVua25vd24gZnVuY3Rpb24gJHRva2VuKCkgaW4gZm9ybXVsYVxuIg0KKyAgICAgICAgdW5sZXNzIGRlZmluZWQgJGZ1bmN0aW9uc3skdG9rZW59WzBdOw0KKw0KKyAgICBteSAkYXJncyA9ICRmdW5jdGlvbnN7JHRva2VufVsxXTsNCisNCisgICAgIyBGaXhlZCBudW1iZXIgb2YgYXJncyBlZy4gVElNRSgkaSwkaiwkaykuDQorICAgIGlmICgkYXJncyA+PSAwKSB7DQorICAgICAgICAjIENoZWNrIHRoYXQgdGhlIG51bWJlciBvZiBhcmdzIGlzIHZhbGlkLg0KKyAgICAgICAgaWYgKCRhcmdzICE9ICRudW1fYXJncykgew0KKyAgICAgICAgICAgIGRpZSAiSW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgZm9yICR0b2tlbigpIGluIGZvcm11bGFcbiI7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gcGFjaygiQ3YiLCAkcHRne3B0Z0Z1bmNWfSwgJGZ1bmN0aW9uc3skdG9rZW59WzBdKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAjIFZhcmlhYmxlIG51bWJlciBvZiBhcmdzIGVnLiBTVU0oJGksJGosJGssIC4uKS4NCisgICAgaWYgKCRhcmdzID09IC0xKSB7DQorICAgICAgICByZXR1cm4gcGFjayAiQ0N2IiwgJHB0Z3twdGdGdW5jVmFyVn0sICRudW1fYXJncywgJGZ1bmN0aW9uc3skdG9rZW59WzBdOw0KKyAgICB9DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfY29udmVydF9uYW1lKCkNCisjDQorIyBDb252ZXJ0IGEgc3ltYm9saWMgbmFtZSBpbnRvIGEgbmFtZSByZWZlcmVuY2UuDQorIw0KK3N1YiBfY29udmVydF9uYW1lIHsNCisNCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7DQorICAgIG15ICRuYW1lICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkY2xhc3MgICAgPSBzaGlmdDsNCisNCisgICAgbXkgJHB0Z05hbWU7DQorDQorICAgIG15ICRuYW1lX2luZGV4ID0gJHNlbGYtPl9nZXRfbmFtZV9pbmRleCgkbmFtZSk7DQorDQorICAgICMgVGhlIHB0ZyB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjbGFzcyBvZiB0aGUgcHRnLg0KKyAgICBpZiAgICAoJGNsYXNzID09IDApIHsNCisgICAgICAgICRwdGdOYW1lID0gJHB0Z3twdGdOYW1lfTsNCisgICAgfQ0KKyAgICBlbHNpZiAoJGNsYXNzID09IDEpIHsNCisgICAgICAgICRwdGdOYW1lID0gJHB0Z3twdGdOYW1lVn07DQorICAgIH0NCisgICAgZWxzaWYgKCRjbGFzcyA9PSAyKSB7DQorICAgICAgICAkcHRnTmFtZSA9ICRwdGd7cHRnTmFtZUF9Ow0KKyAgICB9DQorDQorDQorICAgIHJldHVybiBwYWNrICdDVicsICRwdGdOYW1lLCAkbmFtZV9pbmRleDsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jZWxsX3RvX3Jvd2NvbCgkY2VsbF9yZWYpDQorIw0KKyMgQ29udmVydCBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBzdWNoIGFzIEExIG9yICRCMiBvciBDJDMgb3IgJEQkNCB0byBhIHplcm8NCisjIGluZGV4ZWQgcm93IGFuZCBjb2x1bW4gbnVtYmVyLiBBbHNvIHJldHVybnMgdHdvIGJvb2xlYW4gdmFsdWVzIHRvIGluZGljYXRlDQorIyB3aGV0aGVyIHRoZSByb3cgb3IgY29sdW1uIGFyZSByZWxhdGl2ZSByZWZlcmVuY2VzLg0KKyMgVE9ETyB1c2UgZnVuY3Rpb24gaW4gVXRpbGl0eS5wbQ0KKyMNCitzdWIgX2NlbGxfdG9fcm93Y29sIHsNCisNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisgICAgbXkgJGNlbGwgPSBzaGlmdDsNCisNCisgICAgJGNlbGwgPX4gLyhcJD8pKFtBLUldP1tBLVpdKShcJD8pKFxkKykvOw0KKw0KKyAgICBteSAkY29sX3JlbCA9ICQxIGVxICIiID8gMSA6IDA7DQorICAgIG15ICRjb2wgICAgID0gJDI7DQorICAgIG15ICRyb3dfcmVsID0gJDMgZXEgIiIgPyAxIDogMDsNCisgICAgbXkgJHJvdyAgICAgPSAkNDsNCisNCisgICAgIyBDb252ZXJ0IGJhc2UyNiBjb2x1bW4gc3RyaW5nIHRvIGEgbnVtYmVyLg0KKyAgICAjIEFsbCB5b3VyIEJhc2UgYXJlIGJlbG9uZyB0byB1cy4NCisgICAgbXkgQGNoYXJzICA9IHNwbGl0IC8vLCAkY29sOw0KKyAgICBteSAkZXhwbiAgID0gMDsNCisgICAgJGNvbCAgICAgICA9IDA7DQorDQorICAgIHdoaWxlIChAY2hhcnMpIHsNCisgICAgICAgIG15ICRjaGFyID0gcG9wKEBjaGFycyk7ICMgTFMgY2hhciBmaXJzdA0KKyAgICAgICAgJGNvbCArPSAob3JkKCRjaGFyKSAtIG9yZCgnQScpICsgMSkgKiAoMjYqKiRleHBuKTsNCisgICAgICAgICRleHBuKys7DQorICAgIH0NCisNCisgICAgIyBDb252ZXJ0IDEtaW5kZXggdG8gemVyby1pbmRleA0KKyAgICAkcm93LS07DQorICAgICRjb2wtLTsNCisNCisgICAgcmV0dXJuICRyb3csICRjb2wsICRyb3dfcmVsLCAkY29sX3JlbDsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jZWxsX3RvX3BhY2tlZF9yb3djb2woJHJvdywgJGNvbCwgJHJvd19yZWwsICRjb2xfcmVsKQ0KKyMNCisjIHBhY2soKSByb3cgYW5kIGNvbHVtbiBpbnRvIHRoZSByZXF1aXJlZCAzIGJ5dGUgZm9ybWF0Lg0KKyMNCitzdWIgX2NlbGxfdG9fcGFja2VkX3Jvd2NvbCB7DQorDQorICAgIHVzZSBpbnRlZ2VyOyAgICAjIEF2b2lkIDw8IHNoaWZ0IGJ1ZyBpbiBQZXJsIDUuNi4wIG9uIEhQLVVYDQorDQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgIG15ICRjZWxsID0gc2hpZnQ7DQorDQorICAgIG15ICgkcm93LCAkY29sLCAkcm93X3JlbCwgJGNvbF9yZWwpID0gJHNlbGYtPl9jZWxsX3RvX3Jvd2NvbCgkY2VsbCk7DQorDQorICAgIGRpZSAiQ29sdW1uICRjZWxsIGdyZWF0ZXIgdGhhbiBJViBpbiBmb3JtdWxhXG4iIGlmICRjb2wgPj0gMjU2Ow0KKyAgICBkaWUgIlJvdyAkY2VsbCBncmVhdGVyIHRoYW4gNjU1MzYgaW4gZm9ybXVsYVxuIiBpZiAkcm93ID49IDY1NTM2Ow0KKw0KKyAgICAjIFNldCB0aGUgaGlnaCBiaXRzIHRvIGluZGljYXRlIGlmIHJvdyBvciBjb2wgYXJlIHJlbGF0aXZlLg0KKyAgICAkY29sICAgIHw9ICRjb2xfcmVsIDw8IDE0Ow0KKyAgICAkY29sICAgIHw9ICRyb3dfcmVsIDw8IDE1Ow0KKw0KKyAgICAkcm93ICAgICA9IHBhY2soJ3YnLCAkcm93KTsNCisgICAgJGNvbCAgICAgPSBwYWNrKCd2JywgJGNvbCk7DQorDQorICAgIHJldHVybiAoJHJvdywgJGNvbCk7DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfaW5pdGlhbGl6ZV9oYXNoZXMoKQ0KKyMNCitzdWIgX2luaXRpYWxpemVfaGFzaGVzIHsNCisNCisgICAgIyBUaGUgRXhjZWwgcHRnIGluZGljZXMNCisgICAgJXB0ZyA9ICgNCisgICAgICAgICdwdGdFeHAnICAgICAgICAgICAgPT4gMHgwMSwNCisgICAgICAgICdwdGdUYmwnICAgICAgICAgICAgPT4gMHgwMiwNCisgICAgICAgICdwdGdBZGQnICAgICAgICAgICAgPT4gMHgwMywNCisgICAgICAgICdwdGdTdWInICAgICAgICAgICAgPT4gMHgwNCwNCisgICAgICAgICdwdGdNdWwnICAgICAgICAgICAgPT4gMHgwNSwNCisgICAgICAgICdwdGdEaXYnICAgICAgICAgICAgPT4gMHgwNiwNCisgICAgICAgICdwdGdQb3dlcicgICAgICAgICAgPT4gMHgwNywNCisgICAgICAgICdwdGdDb25jYXQnICAgICAgICAgPT4gMHgwOCwNCisgICAgICAgICdwdGdMVCcgICAgICAgICAgICAgPT4gMHgwOSwNCisgICAgICAgICdwdGdMRScgICAgICAgICAgICAgPT4gMHgwQSwNCisgICAgICAgICdwdGdFUScgICAgICAgICAgICAgPT4gMHgwQiwNCisgICAgICAgICdwdGdHRScgICAgICAgICAgICAgPT4gMHgwQywNCisgICAgICAgICdwdGdHVCcgICAgICAgICAgICAgPT4gMHgwRCwNCisgICAgICAgICdwdGdORScgICAgICAgICAgICAgPT4gMHgwRSwNCisgICAgICAgICdwdGdJc2VjdCcgICAgICAgICAgPT4gMHgwRiwNCisgICAgICAgICdwdGdVbmlvbicgICAgICAgICAgPT4gMHgxMCwNCisgICAgICAgICdwdGdSYW5nZScgICAgICAgICAgPT4gMHgxMSwNCisgICAgICAgICdwdGdVcGx1cycgICAgICAgICAgPT4gMHgxMiwNCisgICAgICAgICdwdGdVbWludXMnICAgICAgICAgPT4gMHgxMywNCisgICAgICAgICdwdGdQZXJjZW50JyAgICAgICAgPT4gMHgxNCwNCisgICAgICAgICdwdGdQYXJlbicgICAgICAgICAgPT4gMHgxNSwNCisgICAgICAgICdwdGdNaXNzQXJnJyAgICAgICAgPT4gMHgxNiwNCisgICAgICAgICdwdGdTdHInICAgICAgICAgICAgPT4gMHgxNywNCisgICAgICAgICdwdGdBdHRyJyAgICAgICAgICAgPT4gMHgxOSwNCisgICAgICAgICdwdGdTaGVldCcgICAgICAgICAgPT4gMHgxQSwNCisgICAgICAgICdwdGdFbmRTaGVldCcgICAgICAgPT4gMHgxQiwNCisgICAgICAgICdwdGdFcnInICAgICAgICAgICAgPT4gMHgxQywNCisgICAgICAgICdwdGdCb29sJyAgICAgICAgICAgPT4gMHgxRCwNCisgICAgICAgICdwdGdJbnQnICAgICAgICAgICAgPT4gMHgxRSwNCisgICAgICAgICdwdGdOdW0nICAgICAgICAgICAgPT4gMHgxRiwNCisgICAgICAgICdwdGdBcnJheScgICAgICAgICAgPT4gMHgyMCwNCisgICAgICAgICdwdGdGdW5jJyAgICAgICAgICAgPT4gMHgyMSwNCisgICAgICAgICdwdGdGdW5jVmFyJyAgICAgICAgPT4gMHgyMiwNCisgICAgICAgICdwdGdOYW1lJyAgICAgICAgICAgPT4gMHgyMywNCisgICAgICAgICdwdGdSZWYnICAgICAgICAgICAgPT4gMHgyNCwNCisgICAgICAgICdwdGdBcmVhJyAgICAgICAgICAgPT4gMHgyNSwNCisgICAgICAgICdwdGdNZW1BcmVhJyAgICAgICAgPT4gMHgyNiwNCisgICAgICAgICdwdGdNZW1FcnInICAgICAgICAgPT4gMHgyNywNCisgICAgICAgICdwdGdNZW1Ob01lbScgICAgICAgPT4gMHgyOCwNCisgICAgICAgICdwdGdNZW1GdW5jJyAgICAgICAgPT4gMHgyOSwNCisgICAgICAgICdwdGdSZWZFcnInICAgICAgICAgPT4gMHgyQSwNCisgICAgICAgICdwdGdBcmVhRXJyJyAgICAgICAgPT4gMHgyQiwNCisgICAgICAgICdwdGdSZWZOJyAgICAgICAgICAgPT4gMHgyQywNCisgICAgICAgICdwdGdBcmVhTicgICAgICAgICAgPT4gMHgyRCwNCisgICAgICAgICdwdGdNZW1BcmVhTicgICAgICAgPT4gMHgyRSwNCisgICAgICAgICdwdGdNZW1Ob01lbU4nICAgICAgPT4gMHgyRiwNCisgICAgICAgICdwdGdOYW1lWCcgICAgICAgICAgPT4gMHgzOSwNCisgICAgICAgICdwdGdSZWYzZCcgICAgICAgICAgPT4gMHgzQSwNCisgICAgICAgICdwdGdBcmVhM2QnICAgICAgICAgPT4gMHgzQiwNCisgICAgICAgICdwdGdSZWZFcnIzZCcgICAgICAgPT4gMHgzQywNCisgICAgICAgICdwdGdBcmVhRXJyM2QnICAgICAgPT4gMHgzRCwNCisgICAgICAgICdwdGdBcnJheVYnICAgICAgICAgPT4gMHg0MCwNCisgICAgICAgICdwdGdGdW5jVicgICAgICAgICAgPT4gMHg0MSwNCisgICAgICAgICdwdGdGdW5jVmFyVicgICAgICAgPT4gMHg0MiwNCisgICAgICAgICdwdGdOYW1lVicgICAgICAgICAgPT4gMHg0MywNCisgICAgICAgICdwdGdSZWZWJyAgICAgICAgICAgPT4gMHg0NCwNCisgICAgICAgICdwdGdBcmVhVicgICAgICAgICAgPT4gMHg0NSwNCisgICAgICAgICdwdGdNZW1BcmVhVicgICAgICAgPT4gMHg0NiwNCisgICAgICAgICdwdGdNZW1FcnJWJyAgICAgICAgPT4gMHg0NywNCisgICAgICAgICdwdGdNZW1Ob01lbVYnICAgICAgPT4gMHg0OCwNCisgICAgICAgICdwdGdNZW1GdW5jVicgICAgICAgPT4gMHg0OSwNCisgICAgICAgICdwdGdSZWZFcnJWJyAgICAgICAgPT4gMHg0QSwNCisgICAgICAgICdwdGdBcmVhRXJyVicgICAgICAgPT4gMHg0QiwNCisgICAgICAgICdwdGdSZWZOVicgICAgICAgICAgPT4gMHg0QywNCisgICAgICAgICdwdGdBcmVhTlYnICAgICAgICAgPT4gMHg0RCwNCisgICAgICAgICdwdGdNZW1BcmVhTlYnICAgICAgPT4gMHg0RSwNCisgICAgICAgICdwdGdNZW1Ob01lbU4nICAgICAgPT4gMHg0RiwNCisgICAgICAgICdwdGdGdW5jQ0VWJyAgICAgICAgPT4gMHg1OCwNCisgICAgICAgICdwdGdOYW1lWFYnICAgICAgICAgPT4gMHg1OSwNCisgICAgICAgICdwdGdSZWYzZFYnICAgICAgICAgPT4gMHg1QSwNCisgICAgICAgICdwdGdBcmVhM2RWJyAgICAgICAgPT4gMHg1QiwNCisgICAgICAgICdwdGdSZWZFcnIzZFYnICAgICAgPT4gMHg1QywNCisgICAgICAgICdwdGdBcmVhRXJyM2QnICAgICAgPT4gMHg1RCwNCisgICAgICAgICdwdGdBcnJheUEnICAgICAgICAgPT4gMHg2MCwNCisgICAgICAgICdwdGdGdW5jQScgICAgICAgICAgPT4gMHg2MSwNCisgICAgICAgICdwdGdGdW5jVmFyQScgICAgICAgPT4gMHg2MiwNCisgICAgICAgICdwdGdOYW1lQScgICAgICAgICAgPT4gMHg2MywNCisgICAgICAgICdwdGdSZWZBJyAgICAgICAgICAgPT4gMHg2NCwNCisgICAgICAgICdwdGdBcmVhQScgICAgICAgICAgPT4gMHg2NSwNCisgICAgICAgICdwdGdNZW1BcmVhQScgICAgICAgPT4gMHg2NiwNCisgICAgICAgICdwdGdNZW1FcnJBJyAgICAgICAgPT4gMHg2NywNCisgICAgICAgICdwdGdNZW1Ob01lbUEnICAgICAgPT4gMHg2OCwNCisgICAgICAgICdwdGdNZW1GdW5jQScgICAgICAgPT4gMHg2OSwNCisgICAgICAgICdwdGdSZWZFcnJBJyAgICAgICAgPT4gMHg2QSwNCisgICAgICAgICdwdGdBcmVhRXJyQScgICAgICAgPT4gMHg2QiwNCisgICAgICAgICdwdGdSZWZOQScgICAgICAgICAgPT4gMHg2QywNCisgICAgICAgICdwdGdBcmVhTkEnICAgICAgICAgPT4gMHg2RCwNCisgICAgICAgICdwdGdNZW1BcmVhTkEnICAgICAgPT4gMHg2RSwNCisgICAgICAgICdwdGdNZW1Ob01lbU4nICAgICAgPT4gMHg2RiwNCisgICAgICAgICdwdGdGdW5jQ0VBJyAgICAgICAgPT4gMHg3OCwNCisgICAgICAgICdwdGdOYW1lWEEnICAgICAgICAgPT4gMHg3OSwNCisgICAgICAgICdwdGdSZWYzZEEnICAgICAgICAgPT4gMHg3QSwNCisgICAgICAgICdwdGdBcmVhM2RBJyAgICAgICAgPT4gMHg3QiwNCisgICAgICAgICdwdGdSZWZFcnIzZEEnICAgICAgPT4gMHg3QywNCisgICAgICAgICdwdGdBcmVhRXJyM2QnICAgICAgPT4gMHg3RCwNCisgICAgKTsNCisNCisgICAgIyBUaGFua3MgdG8gTWljaGFlbCBNZWVrcyBhbmQgR251bWVyaWMgZm9yIHRoZSBpbml0aWFsIGFyZyB2YWx1ZXMuDQorICAgICMNCisgICAgIyBUaGUgZm9sbG93aW5nIGhhc2ggd2FzIGdlbmVyYXRlZCBieSAiZnVuY3Rpb25fbG9jYWxlLnBsIiBpbiB0aGUgZGlzdHJvLg0KKyAgICAjIFJlZmVyIHRvIGZ1bmN0aW9uX2xvY2FsZS5wbCBmb3Igbm9uLUVuZ2xpc2ggZnVuY3Rpb24gbmFtZXMuDQorICAgICMNCisgICAgIyBUaGUgYXJyYXkgZWxlbWVudHMgYXJlIGFzIGZvbGxvdzoNCisgICAgIyBwdGc6ICAgVGhlIEV4Y2VsIGZ1bmN0aW9uIHB0ZyBjb2RlLg0KKyAgICAjIGFyZ3M6ICBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IHRoZSBmdW5jdGlvbiB0YWtlczoNCisgICAgIyAgICAgICAgICAgPj0wIGlzIGEgZml4ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cy4NCisgICAgIyAgICAgICAgICAgLTEgIGlzIGEgdmFyaWFibGUgIG51bWJlciBvZiBhcmd1bWVudHMuDQorICAgICMgY2xhc3M6IFRoZSByZWZlcmVuY2UsIHZhbHVlIG9yIGFycmF5IGNsYXNzIG9mIHRoZSBmdW5jdGlvbiBhcmdzLg0KKyAgICAjIHZvbDogICBUaGUgZnVuY3Rpb24gaXMgdm9sYXRpbGUuDQorICAgICMNCisgICAgJWZ1bmN0aW9ucyAgPSAoDQorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZyAgYXJncyAgY2xhc3MgIHZvbA0KKyAgICAgICAgJ0NPVU5UJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgMCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lGJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgMSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTTkEnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgMiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTRVJST1InICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgMywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NVTScgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgNCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0FWRVJBR0UnICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgNSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ01JTicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgNiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ01BWCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgNywgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1JPVycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgOCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0NPTFVNTicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgOSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ05BJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxMCwgICAgMCwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ05QVicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxMSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NUREVWJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxMiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RPTExBUicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxMywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZJWEVEJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxNCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NJTicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxNSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPUycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxNiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RBTicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxNywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FUQU4nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxOCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BJJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxOSwgICAgMCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NRUlQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyMCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0VYUCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyMSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xOJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyMiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xPRzEwJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyMywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FCUycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyNCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lOVCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyNSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NJR04nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyNiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JPVU5EJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyNywgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xPT0tVUCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyOCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lOREVYJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyOSwgICAtMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ1JFUFQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzMCwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01JRCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzMSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xFTicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzMiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1ZBTFVFJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzMywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RSVUUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzNCwgICAgMCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZBTFNFJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzNSwgICAgMCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FORCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzNiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ09SJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzNywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PVCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzOCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01PRCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzOSwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RDT1VOVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0MCwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RTVU0nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0MSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RBVkVSQUdFJyAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0MiwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RNSU4nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0MywgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RNQVgnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0NCwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RTVERFVicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0NSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1ZBUicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0NiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RWQVInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0NywgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1RFWFQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0OCwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xJTkVTVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0OSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1RSRU5EJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1MCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0xPR0VTVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1MSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0dST1dUSCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1MiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1BWJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1NiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZWJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1NywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05QRVInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1OCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BNVCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1OSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JBVEUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2MCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01JUlInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2MSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lSUicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2MiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1JBTkQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2MywgICAgMCwgICAgMSwgICAgMSBdLA0KKyAgICAgICAgJ01BVENIJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2NCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RBVEUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2NSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RJTUUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2NiwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RBWScgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2NywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01PTlRIJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2OCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1lFQVInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2OSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1dFRUtEQVknICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3MCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0hPVVInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3MSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01JTlVURScgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3MiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NFQ09ORCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3MywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PVycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3NCwgICAgMCwgICAgMSwgICAgMSBdLA0KKyAgICAgICAgJ0FSRUFTJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3NSwgICAgMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ1JPV1MnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3NiwgICAgMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ0NPTFVNTlMnICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3NywgICAgMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ09GRlNFVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3OCwgICAtMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ1NFQVJDSCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA4MiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RSQU5TUE9TRScgICAgICAgICAgICAgICAgICAgICA9PiBbICA4MywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RZUEUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA4NiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FUQU4yJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA5NywgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FTSU4nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA5OCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FDT1MnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA5OSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NIT09TRScgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEwMCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0hMT09LVVAnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEwMSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1ZMT09LVVAnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEwMiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lTUkVGJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEwNSwgICAgMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0xPRycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEwOSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NIQVInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExMSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xPV0VSJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExMiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1VQUEVSJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExMywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BST1BFUicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExNCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xFRlQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExNSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JJR0hUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExNiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0VYQUNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExNywgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RSSU0nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExOCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JFUExBQ0UnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExOSwgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NVQlNUSVRVVEUnICAgICAgICAgICAgICAgICAgICA9PiBbIDEyMCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPREUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyMSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZJTkQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyNCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NFTEwnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyNSwgICAtMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ0lTRVJSJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyNiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTVEVYVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyNywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTTlVNQkVSJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyOCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTQkxBTksnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyOSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1QnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEzMCwgICAgMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ04nICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEzMSwgICAgMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RBVEVWQUxVRScgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0MCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RJTUVWQUxVRScgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0MSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NMTicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0MiwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NZRCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0MywgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0REQicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0NCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lORElSRUNUJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0OCwgICAtMSwgICAgMSwgICAgMSBdLA0KKyAgICAgICAgJ0NBTEwnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE1MCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NMRUFOJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2MiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01ERVRFUk0nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2MywgICAgMSwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ01JTlZFUlNFJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2NCwgICAgMSwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ01NVUxUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2NSwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0lQTVQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2NywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BQTVQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2OCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPVU5UQScgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2OSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1BST0RVQ1QnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE4MywgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0ZBQ1QnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE4NCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RQUk9EVUNUJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE4OSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lTTk9OVEVYVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5MCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NUREVWUCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5MywgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1ZBUlAnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5NCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RTVERFVlAnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5NSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RWQVJQJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5NiwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1RSVU5DJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5NywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTTE9HSUNBTCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5OCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RDT1VOVEEnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5OSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1JPVU5EVVAnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIxMiwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JPVU5ERE9XTicgICAgICAgICAgICAgICAgICAgICA9PiBbIDIxMywgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JBTksnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIxNiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0FERFJFU1MnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIxOSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RBWVMzNjAnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIyMCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RPREFZJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIyMSwgICAgMCwgICAgMSwgICAgMSBdLA0KKyAgICAgICAgJ1ZEQicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIyMiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01FRElBTicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIyNywgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1NVTVBST0RVQ1QnICAgICAgICAgICAgICAgICAgICA9PiBbIDIyOCwgICAtMSwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1NJTkgnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIyOSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPU0gnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzMCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RBTkgnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzMSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FTSU5IJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzMiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FDT1NIJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzMywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FUQU5IJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzNCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RHRVQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzNSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lORk8nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI0NCwgICAgMSwgICAgMSwgICAgMSBdLA0KKyAgICAgICAgJ0RCJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI0NywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZSRVFVRU5DWScgICAgICAgICAgICAgICAgICAgICA9PiBbIDI1MiwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0VSUk9SLlRZUEUnICAgICAgICAgICAgICAgICAgICA9PiBbIDI2MSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JFR0lTVEVSLklEJyAgICAgICAgICAgICAgICAgICA9PiBbIDI2NywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FWRURFVicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI2OSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0JFVEFESVNUJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3MCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0dBTU1BTE4nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3MSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0JFVEFJTlYnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3MiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0JJTk9NRElTVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3MywgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NISURJU1QnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3NCwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NISUlOVicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3NSwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPTUJJTicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3NiwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPTkZJREVOQ0UnICAgICAgICAgICAgICAgICAgICA9PiBbIDI3NywgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NSSVRCSU5PTScgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3OCwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0VWRU4nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3OSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0VYUE9ORElTVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4MCwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZESVNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4MSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZJTlYnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4MiwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZJU0hFUicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4MywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZJU0hFUklOVicgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4NCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZMT09SJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4NSwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0dBTU1BRElTVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4NiwgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0dBTU1BSU5WJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4NywgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NFSUxJTkcnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4OCwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0hZUEdFT01ESVNUJyAgICAgICAgICAgICAgICAgICA9PiBbIDI4OSwgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xPR05PUk1ESVNUJyAgICAgICAgICAgICAgICAgICA9PiBbIDI5MCwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xPR0lOVicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5MSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05FR0JJTk9NRElTVCcgICAgICAgICAgICAgICAgICA9PiBbIDI5MiwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PUk1ESVNUJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5MywgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PUk1TRElTVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5NCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PUk1JTlYnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5NSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PUk1TSU5WJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5NiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NUQU5EQVJESVpFJyAgICAgICAgICAgICAgICAgICA9PiBbIDI5NywgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ09ERCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5OCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BFUk1VVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5OSwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BPSVNTT04nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwMCwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RESVNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwMSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1dFSUJVTEwnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwMiwgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NVTVhNWTInICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwMywgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1NVTVgyTVkyJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwNCwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1NVTVgyUFkyJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwNSwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0NISVRFU1QnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwNiwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0NPUlJFTCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwNywgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0NPVkFSJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwOCwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0ZPUkVDQVNUJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwOSwgICAgMywgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0ZURVNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxMCwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0lOVEVSQ0VQVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxMSwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1BFQVJTT04nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxMiwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1JTUScgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxMywgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1NURVlYJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxNCwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1NMT1BFJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxNSwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1RURVNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxNiwgICAgNCwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1BST0InICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxNywgICAtMSwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0RFVlNRJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxOCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0dFT01FQU4nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxOSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0hBUk1FQU4nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyMCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1NVTVNRJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyMSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0tVUlQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyMiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1NLRVcnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyMywgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1pURVNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyNCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0xBUkdFJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyNSwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1NNQUxMJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyNiwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1FVQVJUSUxFJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyNywgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1BFUkNFTlRJTEUnICAgICAgICAgICAgICAgICAgICA9PiBbIDMyOCwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1BFUkNFTlRSQU5LJyAgICAgICAgICAgICAgICAgICA9PiBbIDMyOSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ01PREUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMzMCwgICAtMSwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1RSSU1NRUFOJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMzMSwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1RJTlYnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMzMiwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPTkNBVEVOQVRFJyAgICAgICAgICAgICAgICAgICA9PiBbIDMzNiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BPV0VSJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMzNywgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JBRElBTlMnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM0MiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RFR1JFRVMnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM0MywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NVQlRPVEFMJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM0NCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1NVTUlGJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM0NSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0NPVU5USUYnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM0NiwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0NPVU5UQkxBTksnICAgICAgICAgICAgICAgICAgICA9PiBbIDM0NywgICAgMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1JPTUFOJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM1NCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICApOw0KKw0KK30NCisNCisNCisNCisNCisxOw0KKw0KKw0KK19fRU5EX18NCisNCisNCis9aGVhZDEgTkFNRQ0KKw0KK0Zvcm11bGEgLSBBIGNsYXNzIGZvciBnZW5lcmF0aW5nIEV4Y2VsIGZvcm11bGFzDQorDQorPWhlYWQxIFNZTk9QU0lTDQorDQorU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbA0KKw0KKz1oZWFkMSBERVNDUklQVElPTg0KKw0KK1RoaXMgbW9kdWxlIGlzIHVzZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuIFlvdSBkbyBub3QgbmVlZCB0byB1c2UgaXQgZGlyZWN0bHkuDQorDQorDQorPWhlYWQxIE5PVEVTDQorDQorVGhlIGZvbGxvd2luZyBub3RlcyBhcmUgdG8gaGVscCBkZXZlbG9wZXJzIGFuZCBtYWludGFpbmVycyB1bmRlcnN0YW5kIHRoZSBzZXF1ZW5jZSBvZiBvcGVyYXRpb24uIFRoZXkgYXJlIGFsc28gaW50ZW5kZWQgYXMgYSBwcm8tbWVtb3JpYSBmb3IgdGhlIGF1dGhvci4gOy0pDQorDQorU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm11bGEgY29udmVydHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgZm9ybXVsYSBpbnRvIHRoZSBwcmUtcGFyc2VkIGJpbmFyeSBmb3JtYXQgdGhhdCBFeGNlbCB1c2VzIHRvIHN0b3JlIGZvcm11bGFzLiBGb3IgZXhhbXBsZSBDPDErMiozPiBpcyBzdG9yZWQgYXMgZm9sbG93czogQzwxRSAwMSAwMCAxRSAwMiAwMCAxRSAwMyAwMCAwNSAwMz4uDQorDQorVGhpcyBzdHJpbmcgaXMgY29tcHJpc2VkIG9mIG9wZXJhdG9ycyBhbmQgb3BlcmFuZHMgYXJyYW5nZWQgaW4gYSByZXZlcnNlLVBvbGlzaCBmb3JtYXQuIFRoZSBtZWFuaW5nIG9mIHRoZSB0b2tlbnMgaW4gdGhlIGFib3ZlIGV4YW1wbGUgaXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZToNCisNCisgICAgVG9rZW4gICBOYW1lICAgICAgICBWYWx1ZQ0KKyAgICAxRSAgICAgIHB0Z0ludCAgICAgIDAwMDEgICAoc3RvcmVkIGFzIDAxIDAwKQ0KKyAgICAxRSAgICAgIHB0Z0ludCAgICAgIDAwMDIgICAoc3RvcmVkIGFzIDAyIDAwKQ0KKyAgICAxRSAgICAgIHB0Z0ludCAgICAgIDAwMDMgICAoc3RvcmVkIGFzIDAzIDAwKQ0KKyAgICAwNSAgICAgIHB0Z011bA0KKyAgICAwMyAgICAgIHB0Z0FkZA0KKw0KK1RoZSB0b2tlbnMgYW5kIHRva2VuIG5hbWVzIGFyZSBkZWZpbmVkIGluIHRoZSAiRXhjZWwgRGV2ZWxvcGVyJ3MgS2l0IiBmcm9tIE1pY3Jvc29mdCBQcmVzcy4gQzxwdGc+IHN0YW5kcyBmb3IgUGFyc2UgVGhpbkcgKGFzIGluICJUaGF0IGxleGVyIGNhbid0IGdyb2sgaXQsIGl0J3MgYSBwYXJzZSB0aGFuZy4iKQ0KKw0KK0luIGdlbmVyYWwgdGhlIHRva2VucyBmYWxsIGludG8gdHdvIGNhdGVnb3JpZXM6IG9wZXJhdG9ycyBzdWNoIGFzIEM8cHRnTXVsPiBhbmQgb3BlcmFuZHMgc3VjaCBhcyBDPHB0Z0ludD4uIFdoZW4gdGhlIGZvcm11bGEgaXMgZXZhbHVhdGVkIGJ5IEV4Y2VsIHRoZSBvcGVyYW5kIHRva2VucyBwdXNoIHZhbHVlcyBvbnRvIGEgc3RhY2suIFRoZSBvcGVyYXRvciB0b2tlbnMgdGhlbiBwb3AgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBvcGVyYW5kcyBvZmYgb2YgdGhlIHN0YWNrLCBwZXJmb3JtIGFuIG9wZXJhdGlvbiBhbmQgcHVzaCB0aGUgcmVzdWx0aW5nIHZhbHVlIGJhY2sgb250byB0aGUgc3RhY2suIFRoaXMgbWV0aG9kb2xvZ3kgaXMgc2ltaWxhciB0byB0aGUgYmFzaWMgb3BlcmF0aW9uIG9mIGEgcmV2ZXJzZS1Qb2xpc2ggKFJQTikgY2FsY3VsYXRvci4NCisNCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybXVsYSBwYXJzZXMgYSBmb3JtdWxhIHVzaW5nIGEgQzxQYXJzZTo6UmVjRGVzY2VudD4gcGFyc2VyIChhdCBhIGxhdGVyIHN0YWdlIGl0IG1heSB1c2UgYSBDPFBhcnNlOjpZYXBwPiBwYXJzZXIgb3IgQzxQYXJzZTo6RmFzdERlc2NlbnQ+KS4NCisNCitUaGUgcGFyc2VyIGNvbnZlcnRzIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgZm9ybXVsYSBpbnRvIGEgcGFyc2UgdHJlZS4gVGh1cywgQzwxKzIqMz4gaXMgY29udmVydGVkIGludG8gc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgQzxlPiBzdGFuZHMgZm9yIGV4cHJlc3Npb246DQorDQorICAgICAgICAgICAgIGUNCisgICAgICAgICAgIC8gfCBcDQorICAgICAgICAgMSAgICsgICBlDQorICAgICAgICAgICAgICAgLyB8IFwNCisgICAgICAgICAgICAgMiAgICogICAzDQorDQorDQorVGhlIGZ1bmN0aW9uIEM8X3JldmVyc2VfdHJlZSgpPiByZWN1cnNlcyBkb3duIHRocm91Z2ggdGhpcyBzdHJ1Y3R1cmUgc3dhcHBpbmcgdGhlIG9yZGVyIG9mIG9wZXJhdG9ycyBmb2xsb3dlZCBieSBvcGVyYW5kcyB0byBwcm9kdWNlIGEgcmV2ZXJzZS1Qb2xpc2ggdHJlZS4gSW4gb3RoZXIgd29yZHMgdGhlIGZvcm11bGEgaXMgY29udmVydGVkIGZyb20gaW4tZml4IG5vdGF0aW9uIHRvIHBvc3QtZml4LiBGb2xsb3dpbmcgdGhlIGFib3ZlIGV4YW1wbGUgdGhlIHJlc3VsdGluZyB0cmVlIHdvdWxkIGxvb2sgbGlrZSB0aGlzOg0KKw0KKw0KKyAgICAgICAgICAgICBlDQorICAgICAgICAgICAvIHwgXA0KKyAgICAgICAgIDEgICBlICAgKw0KKyAgICAgICAgICAgLyB8IFwNCisgICAgICAgICAyICAgMyAgICoNCisNCitUaGUgcmVzdWx0IG9mIHRoZSByZWN1cnNpb24gaXMgYSBzaW5nbGUgYXJyYXkgb2YgdG9rZW5zLiBJbiBvdXIgZXhhbXBsZSB0aGUgc2ltcGxpZmllZCBmb3JtIHdvdWxkIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOg0KKw0KKyAgICAoMSwgMiwgMywgKiwgKykNCisNCitUaGUgYWN0dWFsIHJldHVybiB2YWx1ZSBjb250YWlucyBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gaGVscCBpbiB0aGUgc2Vjb25kYXJ5IHBhcnNpbmcgc3RhZ2U6DQorDQorICAgIChfbnVtLCAxLCBfbnVtLCAyLCBfbnVtLCAzLCBwdGdNdWwsIHB0Z0FkZCwgX2FyZywgMSkNCisNCitUaGUgYWRkaXRpb25hbCB0b2tlbnMgYXJlOg0KKw0KKyAgICBUb2tlbiAgICAgICBNZWFuaW5nDQorICAgIF9udW0gICAgICAgIFRoZSBuZXh0IHRva2VuIGlzIGEgbnVtYmVyDQorICAgIF9zdHIgICAgICAgIFRoZSBuZXh0IHRva2VuIGlzIGEgc3RyaW5nDQorICAgIF9yZWYyZCAgICAgIFRoZSBuZXh0IHRva2VuIGlzIGEgMmQgY2VsbCByZWZlcmVuY2UNCisgICAgX3JlZjNkICAgICAgVGhlIG5leHQgdG9rZW4gaXMgYSAzZCBjZWxsIHJlZmVyZW5jZQ0KKyAgICBfcmFuZ2UyZCAgICBUaGUgbmV4dCB0b2tlbiBpcyBhIDJkIHJhbmdlDQorICAgIF9yYW5nZTNkICAgIFRoZSBuZXh0IHRva2VuIGlzIGEgM2QgcmFuZ2UNCisgICAgX2Z1bmMgICAgICAgVGhlIG5leHQgdG9rZW4gaXMgYSBmdW5jdGlvbg0KKyAgICBfYXJnICAgICAgICBUaGUgbmV4dCB0b2tlbiBpcyB0aGUgbnVtYmVyIG9mIGFyZ3MgZm9yIGEgZnVuY3Rpb24NCisgICAgX2NsYXNzICAgICAgVGhlIG5leHQgdG9rZW4gaXMgYSBmdW5jdGlvbiBuYW1lDQorICAgIF92b2wgICAgICAgIFRoZSBmb3JtdWxhIGNvbnRhaW5zIGEgdm9sdGlsZSBmdW5jdGlvbg0KKw0KK1RoZSBDPF9hcmc+IHRva2VuIGlzIGdlbmVyYXRlZCBmb3IgYWxsIGxpc3RzIGJ1dCBpcyBvbmx5IHVzZWQgZm9yIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLg0KKw0KK1RoZSBDPF9jbGFzcz4gdG9rZW4gaW5kaWNhdGVzIHRoZSBzdGFydCBvZiB0aGUgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24uIFRoaXMgYWxsb3dzIHRoZSBwb3N0LXByb2Nlc3NvciB0byBkZWNpZGUgdGhlICJjbGFzcyIgb2YgdGhlIHJlZiBhbmQgcmFuZ2UgYXJndW1lbnRzIHRoYXQgdGhlIGZ1bmN0aW9uIHRha2VzLiBUaGUgY2xhc3MgY2FuIGJlIHJlZmVyZW5jZSwgdmFsdWUgb3IgYXJyYXkuIFNpbmNlIGZ1bmN0aW9uIGNhbGxzIGNhbiBiZSBuZXN0ZWQsIHRoZSBjbGFzcyB2YXJpYWJsZSBpcyBzdG9yZWQgb24gYSBzdGFjayBpbiB0aGUgQzxAY2xhc3M+IGFycmF5LiBUaGUgY2xhc3Mgb2YgdGhlIHJlZiBvciByYW5nZSBpcyB0aGVuIHJlYWQgYXMgdGhlIHRvcCBlbGVtZW50IG9mIHRoZSBzdGFjayBDPCRjbGFzc1stMV0+LiBXaGVuIGEgQzxfZnVuYz4gaXMgcmVhZCBpdCBwb3BzIHRoZSBjbGFzcyB2YWx1ZS4NCisNCitDZXJ0YWluIEV4Y2VsIGZ1bmN0aW9ucyBzdWNoIGFzIFJBTkQoKSBhbmQgTk9XKCkgYXJlIGRlc2lnbmF0ZWQgYXMgdm9sYXRpbGUgYW5kIG11c3QgYmUgcmVjYWxjdWxhdGVkIGJ5IEV4Y2VsIGV2ZXJ5IHRpbWUgdGhhdCBhIGNlbGwgaXMgdXBkYXRlZC4gQW55IGZvcm11bGFzIHRoYXQgY29udGFpbiBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zIGhhcyBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgQzxwdGdBdHRyPiB0YWcgcHJlcGVuZGVkIHRvIGl0IHRvIGluZGljYXRlIHRoYXQgaXQgaXMgdm9sYXRpbGUuDQorDQorQSBzZWNvbmRhcnkgcGFyc2luZyBzdGFnZSBpcyBjYXJyaWVkIG91dCBieSBDPHBhcnNlX3Rva2VucygpPiB3aGljaCBjb252ZXJ0cyB0aGVzZSB0b2tlbnMgaW50byBhIGJpbmFyeSBzdHJpbmcuIEZvciB0aGUgQzwxKzIqMz4gZXhhbXBsZSB0aGlzIHdvdWxkIGdpdmU6DQorDQorICAgIDFFIDAxIDAwIDFFIDAyIDAwIDFFIDAzIDAwIDA1IDAzDQorDQorVGhpcyB0d28tcGFzcyBtZXRob2QgY291bGQgcHJvYmFibHkgaGF2ZSBiZWVuIHJlZHVjZWQgdG8gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHRoZSBDPFBhcnNlOjpSZWNEZXNjZW50PiBwYXJzZXIuIEhvd2V2ZXIsIGl0IHdhcyBlYXNpZXIgdG8gZGV2ZWxvcCBhbmQgZGVidWcgdGhpcyB3YXkuDQorDQorVGhlIHRva2VuIHZhbHVlcyBhbmQgZm9ybXVsYSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgQzwlcHRnPiBhbmQgQzwlZnVuY3Rpb25zPiBoYXNoZXMuIFRoZXNlIGhhc2hlcyBhbmQgdGhlIHBhcnNlciBvYmplY3QgQzwkcGFyc2VyPiBhcmUgZXhwb3NlZCBhcyBnbG9iYWwgZGF0YS4gVGhpcyBicmVha3MgdGhlIE9PIGVuY2Fwc3VsYXRpb24sIGJ1dCBtZWFucyB0aGF0IHRoZXkgY2FuIGJlIHNoYXJlZCBieSBzZXZlcmFsIGluc3RhbmNlcyBvZiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBjYWxsZWQgZnJvbSB0aGUgc2FtZSBwcm9ncmFtLg0KKw0KK05vbi1FbmdsaXNoIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBhZGRlZCB0byB0aGUgQzwlZnVuY3Rpb25zPiBoYXNoIHVzaW5nIHRoZSBDPGZ1bmN0aW9uX2xvY2FsZS5wbD4gcHJvZ3JhbSBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uIFRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZTogR2VybWFuLCBGcmVuY2gsIFNwYW5pc2gsIFBvcnR1Z3Vlc2UsIER1dGNoLCBGaW5uaXNoLCBJdGFsaWFuIGFuZCBTd2VkaXNoLiBUaGVzZSBsYW5ndWFnZXMgYXJlIG5vdCBhZGRlZCBieSBkZWZhdWx0IGJlY2F1c2UgdGhlcmUgYXJlIGNvbmZsaWN0cyBiZXR3ZWVuIGZ1bmN0aW9ucyBuYW1lcyBpbiBkaWZmZXJlbnQgbGFuZ3VhZ2VzLg0KKw0KK1RoZSBwYXJzZXIgaXMgaW5pdGlhbGlzZWQgYnkgQzxfaW5pdF9wYXJzZXIoKT4uIFRoZSBpbml0aWFsaXNhdGlvbiBpcyBkZWxheWVkIHVudGlsIHRoZSBmaXJzdCBmb3JtdWxhIGlzIHBhcnNlZC4gVGhpcyBlbGltaW5hdGVzIHRoZSBvdmVyaGVhZCBvZiBnZW5lcmF0aW5nIHRoZSBwYXJzZXIgaW4gcHJvZ3JhbXMgdGhhdCBhcmUgbm90IHByb2Nlc3NpbmcgZm9ybXVsYXMuIChUaGUgcGFyc2VyIHNob3VsZCByZWFsbHkgYmUgcHJlLWNvbXBpbGVkLCB0aGlzIGlzIHRvLWRvIHdoZW4gdGhlIGdyYW1tYXIgc3RhYmlsaXNlcykuDQorDQorDQorDQorDQorPWhlYWQxIEFVVEhPUg0KKw0KK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnDQorDQorPWhlYWQxIENPUFlSSUdIVA0KKw0KK6kgTU0tTU1YLCBKb2huIE1jTmFtYXJhLg0KKw0KK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4NCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL09MRXdyaXRlci5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvT0xFd3JpdGVyLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmI0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL09MRXdyaXRlci5wbQpAQCAtMCwwICsxLDQ0OSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6T0xFd3JpdGVyOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE9MRXdyaXRlciAtIEEgd3JpdGVyIGNsYXNzIHRvIHN0b3JlIEJJRkYgZGF0YSBpbiBhIE9MRSBjb21wb3VuZCBzdG9yYWdlIGZpbGUuCisjCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3VzZSBFeHBvcnRlcjsKK3VzZSBzdHJpY3Q7Cit1c2UgQ2FycDsKK3VzZSBGaWxlSGFuZGxlOworCisKKworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KEV4cG9ydGVyKTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMgQ29uc3RydWN0b3IKKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzICA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgPSB7CisgICAgICAgICAgICAgICAgICAgIF9vbGVmaWxlbmFtZSAgID0+ICRfWzBdLAorICAgICAgICAgICAgICAgICAgICBfZmlsZWhhbmRsZSAgICA9PiAiIiwKKyAgICAgICAgICAgICAgICAgICAgX2ZpbGVjbG9zZWQgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ludGVybmFsX2ZoICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2JpZmZfb25seSAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX3NpemVfYWxsb3dlZCAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2JpZmZzaXplICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2Jvb2tzaXplICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2JpZ19ibG9ja3MgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2xpc3RfYmxvY2tzICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX3Jvb3Rfc3RhcnQgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2Jsb2NrX2NvdW50ICAgPT4gNCwKKyAgICAgICAgICAgICAgICAgfTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgJHNlbGYtPl9pbml0aWFsaXplKCk7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2luaXRpYWxpemUoKQorIworIyBDcmVhdGUgYSBuZXcgZmlsZWhhbmRsZSBvciB1c2UgdGhlIHByb3ZpZGVkIGZpbGVoYW5kbGUuCisjCitzdWIgX2luaXRpYWxpemUgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkb2xlZmlsZSA9ICRzZWxmLT57X29sZWZpbGVuYW1lfTsKKyAgICBteSAkZmg7CisKKyAgICAjIElmIHRoZSBmaWxlbmFtZSBpcyBhIHJlZmVyZW5jZSBpdCBpcyBhc3N1bWVkIHRoYXQgaXQgaXMgYSB2YWxpZAorICAgICMgZmlsZWhhbmRsZSwgaWYgbm90IHdlIGNyZWF0ZSBhIGZpbGVoYW5kbGUuCisgICAgIworICAgIGlmIChyZWYoJG9sZWZpbGUpKSB7CisgICAgICAgICRmaCA9ICRvbGVmaWxlOworICAgIH0KKyAgICBlbHNleworCisgICAgICAgICMgQ3JlYXRlIGEgbmV3IGZpbGUsIG9wZW4gZm9yIHdyaXRpbmcKKyAgICAgICAgJGZoID0gRmlsZUhhbmRsZS0+bmV3KCI+ICRvbGVmaWxlIik7CisKKyAgICAgICAgIyBXb3JrYm9vay5wbSBhbHNvIGNoZWNrcyB0aGlzIGJ1dCBzb21ldGhpbmcgbWF5IGhhdmUgaGFwcGVuZWQgc2luY2UKKyAgICAgICAgIyB0aGVuLgorICAgICAgICBpZiAobm90IGRlZmluZWQgJGZoKSB7CisgICAgICAgICAgICBjcm9hayAiQ2FuJ3Qgb3BlbiAkb2xlZmlsZS4gSXQgbWF5IGJlIGluIHVzZSBvciBwcm90ZWN0ZWQuXG4iOworICAgICAgICB9CisKKyAgICAgICAgIyBiaW5tb2RlIGZpbGUgd2hldGhlciBwbGF0Zm9ybSByZXF1aXJlcyBpdCBvciBub3QKKyAgICAgICAgYmlubW9kZSgkZmgpOworCisgICAgICAgICRzZWxmLT57X2ludGVybmFsX2ZofSA9IDE7CisgICAgfQorCisgICAgIyBTdG9yZSBmaWxlaGFuZGxlCisgICAgJHNlbGYtPntfZmlsZWhhbmRsZX0gPSAkZmg7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfc2l6ZSgkYmlmZnNpemUpCisjCisjIFNldCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBPTEUgc3RyZWFtCisjCisjICAgJGJpZ19ibG9ja3MgPSAoMTA5IGRlcG90IGJsb2NrIHggKDEyOCAtMSBtYXJrZXIgd29yZCkKKyMgICAgICAgICAgICAgICAgIC0gKDEgeCBlbmQgd29yZHMpKSA9IDEzODQyCisjICAgJG1heHNpemUgICAgPSAkYmlnX2Jsb2NrcyAqIDUxMiBieXRlcyA9IDcwODcxMDQKKyMKK3N1YiBzZXRfc2l6ZSB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICRtYXhzaXplID0gN18wODdfMTA0OyAjIFVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QmlnIHRvIGV4Y2VlZCB0aGlzCisKKyAgICBpZiAoJF9bMF0gPiAkbWF4c2l6ZSkgeworICAgICAgICByZXR1cm4gJHNlbGYtPntfc2l6ZV9hbGxvd2VkfSA9IDA7CisgICAgfQorCisgICAgJHNlbGYtPntfYmlmZnNpemV9ID0gJF9bMF07CisKKyAgICAjIFNldCB0aGUgbWluIGZpbGUgc2l6ZSB0byA0ayB0byBhdm9pZCBoYXZpbmcgdG8gdXNlIHNtYWxsIGJsb2NrcworICAgIGlmICgkX1swXSA+IDQwOTYpIHsKKyAgICAgICAgJHNlbGYtPntfYm9va3NpemV9ID0gJF9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19ib29rc2l6ZX0gPSA0MDk2OworICAgIH0KKworICAgIHJldHVybiAkc2VsZi0+e19zaXplX2FsbG93ZWR9ID0gMTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2NhbGN1bGF0ZV9zaXplcygpCisjCisjIENhbGN1bGF0ZSB2YXJpb3VzIHNpemVzIG5lZWRlZCBmb3IgdGhlIE9MRSBzdHJlYW0KKyMKK3N1YiBfY2FsY3VsYXRlX3NpemVzIHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRkYXRhc2l6ZSA9ICRzZWxmLT57X2Jvb2tzaXplfTsKKworICAgIGlmICgkZGF0YXNpemUgJSA1MTIgPT0gMCkgeworICAgICAgICAkc2VsZi0+e19iaWdfYmxvY2tzfSA9ICRkYXRhc2l6ZS81MTI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19iaWdfYmxvY2tzfSA9IGludCgkZGF0YXNpemUvNTEyKSArMTsKKyAgICB9CisgICAgIyBUaGVyZSBhcmUgMTI3IGxpc3QgYmxvY2tzIGFuZCAxIG1hcmtlciBibG9ja3MgZm9yIGVhY2ggYmlnIGJsb2NrCisgICAgIyBkZXBvdCArIDEgZW5kIG9mIGNoYWluIGJsb2NrCisgICAgJHNlbGYtPntfbGlzdF9ibG9ja3N9ID0gaW50KCgkc2VsZi0+e19iaWdfYmxvY2tzfSkvMTI3KSArMTsKKyAgICAkc2VsZi0+e19yb290X3N0YXJ0fSAgPSAkc2VsZi0+e19iaWdfYmxvY2tzfTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNsb3NlKCkKKyMKKyMgV3JpdGUgcm9vdCBlbnRyeSwgYmlnIGJsb2NrIGxpc3QgYW5kIGNsb3NlIHRoZSBmaWxlaGFuZGxlLgorIyBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBleHBsaWNpdGx5IGNsb3NlIHRoZSBvcGVuIGZpbGVoYW5kbGUgd2l0aG91dAorIyBoYXZpbmcgdG8gd2FpdCBmb3IgREVTVFJPWS4KKyMKK3N1YiBjbG9zZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIGlmIG5vdCAkc2VsZi0+e19zaXplX2FsbG93ZWR9OworCisgICAgJHNlbGYtPl93cml0ZV9wYWRkaW5nKCkgICAgICAgICAgaWYgbm90ICRzZWxmLT57X2JpZmZfb25seX07CisgICAgJHNlbGYtPl93cml0ZV9wcm9wZXJ0eV9zdG9yYWdlKCkgaWYgbm90ICRzZWxmLT57X2JpZmZfb25seX07CisgICAgJHNlbGYtPl93cml0ZV9iaWdfYmxvY2tfZGVwb3QoKSAgaWYgbm90ICRzZWxmLT57X2JpZmZfb25seX07CisKKyAgICBteSAkY2xvc2UgPSAxOyAjIERlZmF1bHQgdG8gbm8gZXJyb3IgZm9yIGV4dGVybmFsIGZpbGVoYW5kbGVzLgorCisgICAgIyBDbG9zZSB0aGUgZmlsZWhhbmRsZSBpZiBpdCB3YXMgY3JlYXRlZCBpbnRlcm5hbGx5LgorICAgICRjbG9zZSA9IENPUkU6OmNsb3NlKCRzZWxmLT57X2ZpbGVoYW5kbGV9KSBpZiAkc2VsZi0+e19pbnRlcm5hbF9maH07CisKKyAgICAkc2VsZi0+e19maWxlY2xvc2VkfSA9IDE7CisKKyAgICByZXR1cm4gJGNsb3NlOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgREVTVFJPWSgpCisjCisjIENsb3NlIHRoZSBmaWxlaGFuZGxlIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZXhwbGljaXRseSBjbG9zZWQuCisjCitzdWIgREVTVFJPWSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbG9jYWwgKCRALCAkISwgJF5FLCAkPyk7CisKKyAgICAkc2VsZi0+Y2xvc2UoKSB1bmxlc3MgJHNlbGYtPntfZmlsZWNsb3NlZH07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZSgkZGF0YSkKKyMKKyMgV3JpdGUgQklGRiBkYXRhIHRvIE9MRSBmaWxlLgorIworc3ViIHdyaXRlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIFByb3RlY3QgcHJpbnQoKSBmcm9tIC1sIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgbG9jYWwgJFwgPSB1bmRlZjsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICRfWzBdOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd3JpdGVfaGVhZGVyKCkKKyMKKyMgV3JpdGUgT0xFIGhlYWRlciBibG9jay4KKyMKK3N1YiB3cml0ZV9oZWFkZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgcmV0dXJuIGlmICRzZWxmLT57X2JpZmZfb25seX07CisgICAgJHNlbGYtPl9jYWxjdWxhdGVfc2l6ZXMoKTsKKworICAgIG15ICRyb290X3N0YXJ0ICAgICAgPSAkc2VsZi0+e19yb290X3N0YXJ0fTsKKyAgICBteSAkbnVtX2xpc3RzICAgICAgID0gJHNlbGYtPntfbGlzdF9ibG9ja3N9OworCisgICAgbXkgJGlkICAgICAgICAgICAgICA9IHBhY2soIk5OIiwgICAweEQwQ0YxMUUwLCAweEExQjExQUUxKTsKKyAgICBteSAkdW5rbm93bjEgICAgICAgID0gcGFjaygiVlZWViIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDApOworICAgIG15ICR1bmtub3duMiAgICAgICAgPSBwYWNrKCJ2diIsICAgMHgzRSwgMHgwMyk7CisgICAgbXkgJHVua25vd24zICAgICAgICA9IHBhY2soInYiLCAgICAtMik7CisgICAgbXkgJHVua25vd240ICAgICAgICA9IHBhY2soInYiLCAgICAweDA5KTsKKyAgICBteSAkdW5rbm93bjUgICAgICAgID0gcGFjaygiVlZWIiwgIDB4MDYsIDB4MDAsIDB4MDApOworICAgIG15ICRudW1fYmJkX2Jsb2NrcyAgPSBwYWNrKCJWIiwgICAgJG51bV9saXN0cyk7CisgICAgbXkgJHJvb3Rfc3RhcnRibG9jayA9IHBhY2soIlYiLCAgICAkcm9vdF9zdGFydCk7CisgICAgbXkgJHVua25vd242ICAgICAgICA9IHBhY2soIlZWIiwgICAweDAwLCAweDEwMDApOworICAgIG15ICRzYmRfc3RhcnRibG9jayAgPSBwYWNrKCJWIiwgICAgLTIpOworICAgIG15ICR1bmtub3duNyAgICAgICAgPSBwYWNrKCJWVlYiLCAgMHgwMCwgLTIgLDB4MDApOworICAgIG15ICR1bnVzZWQgICAgICAgICAgPSBwYWNrKCJWIiwgICAgLTEpOworCisgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgIGxvY2FsICRcID0gdW5kZWY7CisKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkaWQ7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHVua25vd24xOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duMjsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkdW5rbm93bjM7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHVua25vd240OworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duNTsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkbnVtX2JiZF9ibG9ja3M7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHJvb3Rfc3RhcnRibG9jazsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkdW5rbm93bjY7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHNiZF9zdGFydGJsb2NrOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duNzsKKworICAgIGZvciAoMS4uJG51bV9saXN0cykgeworICAgICAgICAkcm9vdF9zdGFydCsrOworICAgICAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICBwYWNrKCJWIiwgJHJvb3Rfc3RhcnQpOworICAgIH0KKworICAgIGZvciAoJG51bV9saXN0cy4uMTA4KSB7CisgICAgICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bnVzZWQ7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX2JpZ19ibG9ja19kZXBvdCgpCisjCisjIFdyaXRlIGJpZyBibG9jayBkZXBvdC4KKyMKK3N1YiBfd3JpdGVfYmlnX2Jsb2NrX2RlcG90IHsKKworICAgIG15ICRzZWxmICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkbnVtX2Jsb2NrcyAgID0gJHNlbGYtPntfYmlnX2Jsb2Nrc307CisgICAgbXkgJG51bV9saXN0cyAgICA9ICRzZWxmLT57X2xpc3RfYmxvY2tzfTsKKyAgICBteSAkdG90YWxfYmxvY2tzID0gJG51bV9saXN0cyAqMTI4OworICAgIG15ICR1c2VkX2Jsb2NrcyAgPSAkbnVtX2Jsb2NrcyArICRudW1fbGlzdHMgKzI7CisKKyAgICBteSAkbWFya2VyICAgICAgID0gcGFjaygiViIsIC0zKTsKKyAgICBteSAkZW5kX29mX2NoYWluID0gcGFjaygiViIsIC0yKTsKKyAgICBteSAkdW51c2VkICAgICAgID0gcGFjaygiViIsIC0xKTsKKworCisgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgIGxvY2FsICRcID0gdW5kZWY7CisKKyAgICBmb3IgbXkgJGkgKDEuLiRudW1fYmxvY2tzLTEpIHsKKyAgICAgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgcGFjaygiViIsJGkpOworICAgIH0KKworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRlbmRfb2ZfY2hhaW47CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJGVuZF9vZl9jaGFpbjsKKworICAgIGZvciAoMS4uJG51bV9saXN0cykgeworICAgICAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkbWFya2VyOworICAgIH0KKworICAgIGZvciAoJHVzZWRfYmxvY2tzLi4kdG90YWxfYmxvY2tzKSB7CisgICAgICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bnVzZWQ7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX3Byb3BlcnR5X3N0b3JhZ2UoKQorIworIyBXcml0ZSBwcm9wZXJ0eSBzdG9yYWdlLiBUT0RPOiBhZGQgc3VtbWFyeSBzaGVldHMKKyMKK3N1YiBfd3JpdGVfcHJvcGVydHlfc3RvcmFnZSB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKworICAgIG15ICRyb290c2l6ZSA9IC0yOworICAgIG15ICRib29rc2l6ZSA9ICRzZWxmLT57X2Jvb2tzaXplfTsKKworICAgICMjIyMjIyMjIyMjIyMjIyMjICBuYW1lICAgICAgICAgdHlwZSAgIGRpciBzdGFydCBzaXplCisgICAgJHNlbGYtPl93cml0ZV9wcHMoJ1Jvb3QgRW50cnknLCAweDA1LCAgIDEsICAgLTIsIDB4MDApOworICAgICRzZWxmLT5fd3JpdGVfcHBzKCdXb3JrYm9vaycsICAgMHgwMiwgIC0xLCAweDAwLCAkYm9va3NpemUpOworICAgICRzZWxmLT5fd3JpdGVfcHBzKCcnLCAgICAgICAgICAgMHgwMCwgIC0xLCAweDAwLCAweDAwMDApOworICAgICRzZWxmLT5fd3JpdGVfcHBzKCcnLCAgICAgICAgICAgMHgwMCwgIC0xLCAweDAwLCAweDAwMDApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX3BwcygpCisjCisjIFdyaXRlIHByb3BlcnR5IHNoZWV0IGluIHByb3BlcnR5IHN0b3JhZ2UKKyMKK3N1YiBfd3JpdGVfcHBzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRuYW1lICAgICAgICAgICAgPSAkX1swXTsKKyAgICBteSBAbmFtZSAgICAgICAgICAgID0gKCk7CisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDA7CisKKyAgICBpZiAoJG5hbWUgbmUgJycpIHsKKyAgICAgICAgJG5hbWUgICA9ICRfWzBdIC4gIlwwIjsKKyAgICAgICAgIyBTaW11bGF0ZSBhIFVuaWNvZGUgc3RyaW5nCisgICAgICAgIEBuYW1lICAgPSBtYXAob3JkLCBzcGxpdCgnJywgJG5hbWUpKTsKKyAgICAgICAgJGxlbmd0aCA9IGxlbmd0aCgkbmFtZSkgKiAyOworICAgIH0KKworICAgIG15ICRyYXduYW1lICAgICAgICAgPSBwYWNrKCJ2KiIsIEBuYW1lKTsKKyAgICBteSAkemVybyAgICAgICAgICAgID0gcGFjaygiQyIsICAwKTsKKworICAgIG15ICRwcHNfc2l6ZW9mbmFtZSAgPSBwYWNrKCJ2IiwgICRsZW5ndGgpOyAgICAjMHg0MAorICAgIG15ICRwcHNfdHlwZSAgICAgICAgPSBwYWNrKCJ2IiwgICRfWzFdKTsgICAgICAjMHg0MgorICAgIG15ICRwcHNfcHJldiAgICAgICAgPSBwYWNrKCJWIiwgIC0xKTsgICAgICAgICAjMHg0NAorICAgIG15ICRwcHNfbmV4dCAgICAgICAgPSBwYWNrKCJWIiwgIC0xKTsgICAgICAgICAjMHg0OAorICAgIG15ICRwcHNfZGlyICAgICAgICAgPSBwYWNrKCJWIiwgICRfWzJdKTsgICAgICAjMHg0YworCisgICAgbXkgJHVua25vd24xICAgICAgICA9IHBhY2soIlYiLCAgMCk7CisKKyAgICBteSAkcHBzX3RzMXMgICAgICAgID0gcGFjaygiViIsICAwKTsgICAgICAgICAgIzB4NjQKKyAgICBteSAkcHBzX3RzMWQgICAgICAgID0gcGFjaygiViIsICAwKTsgICAgICAgICAgIzB4NjgKKyAgICBteSAkcHBzX3RzMnMgICAgICAgID0gcGFjaygiViIsICAwKTsgICAgICAgICAgIzB4NmMKKyAgICBteSAkcHBzX3RzMmQgICAgICAgID0gcGFjaygiViIsICAwKTsgICAgICAgICAgIzB4NzAKKyAgICBteSAkcHBzX3NiICAgICAgICAgID0gcGFjaygiViIsICAkX1szXSk7ICAgICAgIzB4NzQKKyAgICBteSAkcHBzX3NpemUgICAgICAgID0gcGFjaygiViIsICAkX1s0XSk7ICAgICAgIzB4NzgKKworCisgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgIGxvY2FsICRcID0gdW5kZWY7CisKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcmF3bmFtZTsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkemVybyB4ICg2NCAtJGxlbmd0aCk7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc19zaXplb2ZuYW1lOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRwcHNfdHlwZTsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcHBzX3ByZXY7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc19uZXh0OworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRwcHNfZGlyOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duMSB4IDU7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc190czFzOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRwcHNfdHMxZDsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcHBzX3RzMmQ7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc190czJkOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRwcHNfc2I7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc19zaXplOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF93cml0ZV9wYWRkaW5nKCkKKyMKKyMgUGFkIHRoZSBlbmQgb2YgdGhlIGZpbGUKKyMKK3N1YiBfd3JpdGVfcGFkZGluZyB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkYmlmZnNpemUgPSAkc2VsZi0+e19iaWZmc2l6ZX07CisgICAgbXkgJG1pbl9zaXplOworCisgICAgaWYgKCRiaWZmc2l6ZSA8IDQwOTYpIHsKKyAgICAgICAgJG1pbl9zaXplID0gNDA5NjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRtaW5fc2l6ZSA9IDUxMjsKKyAgICB9CisKKyAgICAjIFByb3RlY3QgcHJpbnQoKSBmcm9tIC1sIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgbG9jYWwgJFwgPSB1bmRlZjsKKworICAgIGlmICgkYmlmZnNpemUgJSAkbWluX3NpemUgIT0gMCkgeworICAgICAgICBteSAkcGFkZGluZyAgPSAkbWluX3NpemUgLSAoJGJpZmZzaXplICUgJG1pbl9zaXplKTsKKyAgICAgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgIlwwIiB4ICRwYWRkaW5nOworICAgIH0KK30KKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitPTEV3cml0ZXIgLSBBIHdyaXRlciBjbGFzcyB0byBzdG9yZSBCSUZGIGRhdGEgaW4gYSBPTEUgY29tcG91bmQgc3RvcmFnZSBmaWxlLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworqSBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvUHJvcGVydGllcy5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvUHJvcGVydGllcy5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmM5MzNhCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Qcm9wZXJ0aWVzLnBtCkBAIC0wLDAgKzEsMzUyIEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpQcm9wZXJ0aWVzOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFByb3BlcnRpZXMgLSBBIG1vZHVsZSBmb3IgY3JlYXRpbmcgRXhjZWwgcHJvcGVydHkgc2V0cy4KKyMKKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2UgRXhwb3J0ZXI7Cit1c2Ugc3RyaWN0OwordXNlIENhcnA7Cit1c2UgUE9TSVggJ2Ztb2QnOwordXNlIFRpbWU6OkxvY2FsICd0aW1lbG9jYWwnOworCisKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBIEBFWFBPUlQgQEVYUE9SVF9PSyAlRVhQT1JUX1RBR1MpOworQElTQSAgICAgICAgPSBxdyhFeHBvcnRlcik7CisKKyRWRVJTSU9OICAgID0gJzIuMzcnOworCisjIFNldCB1cCB0aGUgZXhwb3J0cy4KK215IEBhbGxfZnVuY3Rpb25zID0gcXcoCisgICAgY3JlYXRlX3N1bW1hcnlfcHJvcGVydHlfc2V0CisgICAgY3JlYXRlX2RvY19zdW1tYXJ5X3Byb3BlcnR5X3NldAorICAgIF9wYWNrX3Byb3BlcnR5X2RhdGEKKyAgICBfcGFja19WVF9JMgorICAgIF9wYWNrX1ZUX0xQU1RSCisgICAgX3BhY2tfVlRfRklMRVRJTUUKKyk7CisKK215IEBwcHNfc3VtbWFyaWVzID0gcXcoCisgICAgY3JlYXRlX3N1bW1hcnlfcHJvcGVydHlfc2V0CisgICAgY3JlYXRlX2RvY19zdW1tYXJ5X3Byb3BlcnR5X3NldAorKTsKKworQEVYUE9SVCAgICAgICAgID0gKCk7CitARVhQT1JUX09LICAgICAgPSAoQGFsbF9mdW5jdGlvbnMpOworJUVYUE9SVF9UQUdTICAgID0gKHRlc3RpbmcgICAgICAgICAgPT4gXEBhbGxfZnVuY3Rpb25zLAorICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X3NldHMgICAgPT4gXEBwcHNfc3VtbWFyaWVzLAorICAgICAgICAgICAgICAgICAgKTsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNyZWF0ZV9zdW1tYXJ5X3Byb3BlcnR5X3NldCgpLgorIworIyBDcmVhdGUgdGhlIFN1bW1hcnlJbmZvcm1hdGlvbiBwcm9wZXJ0eSBzZXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgZm9yIHRoZQorIyBUaXRsZSwgU3ViamVjdCwgQXV0aG9yLCBLZXl3b3JkcywgQ29tbWVudHMsIExhc3QgYXV0aG9yIGtleXdvcmRzIGFuZCB0aGUKKyMgY3JlYXRpb24gZGF0ZS4KKyMKK3N1YiBjcmVhdGVfc3VtbWFyeV9wcm9wZXJ0eV9zZXQgeworCisgICAgbXkgQHByb3BlcnRpZXMgICAgICAgICAgPSBAeyRfWzBdfTsKKworICAgIG15ICRieXRlX29yZGVyICAgICAgICAgID0gcGFjayAndicsICAweEZGRkU7CisgICAgbXkgJHZlcnNpb24gICAgICAgICAgICAgPSBwYWNrICd2JywgIDB4MDAwMDsKKyAgICBteSAkc3lzdGVtX2lkICAgICAgICAgICA9IHBhY2sgJ1YnLCAgMHgwMDAyMDEwNTsKKyAgICBteSAkY2xhc3NfaWQgICAgICAgICAgICA9IHBhY2sgJ0gqJywgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJzsKKyAgICBteSAkbnVtX3Byb3BlcnR5X3NldHMgICA9IHBhY2sgJ1YnLCAgMHgwMDAxOworICAgIG15ICRmb3JtYXRfaWQgICAgICAgICAgID0gcGFjayAnSConLCAnRTA4NTlGRjJGOTRGNjgxMEFCOTEwODAwMkIyN0IzRDknOworICAgIG15ICRvZmZzZXQgICAgICAgICAgICAgID0gcGFjayAnVicsICAweDAwMzA7CisgICAgbXkgJG51bV9wcm9wZXJ0eSAgICAgICAgPSBwYWNrICdWJywgIHNjYWxhciBAcHJvcGVydGllczsKKyAgICBteSAkcHJvcGVydHlfb2Zmc2V0cyAgICA9ICcnOworCisgICAgIyBDcmVhdGUgdGhlIHByb3BlcnR5IHNldCBkYXRhIGJsb2NrIGFuZCBjYWxjdWxhdGUgdGhlIG9mZnNldHMgaW50byBpdC4KKyAgICBteSAoJHByb3BlcnR5X2RhdGEsICRvZmZzZXRzKSA9IF9wYWNrX3Byb3BlcnR5X2RhdGEoXEBwcm9wZXJ0aWVzKTsKKworICAgICMgQ3JlYXRlIHRoZSBwcm9wZXJ0eSB0eXBlIGFuZCBvZmZzZXRzIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBjYWxjdWxhdGlvbi4KKyAgICBmb3IgbXkgJGkgKDAgLi4gQHByb3BlcnRpZXMgLTEpIHsKKyAgICAgICAgJHByb3BlcnR5X29mZnNldHMgLj0gcGFjaygnVlYnLCAkcHJvcGVydGllc1skaV0tPlswXSwgJG9mZnNldHMtPlskaV0pOworICAgIH0KKworICAgICMgU2l6ZSBvZiAkc2l6ZSAoNCBieXRlcykgKyAgJG51bV9wcm9wZXJ0eSAoNCBieXRlcykgKyB0aGUgZGF0YSBzdHJ1Y3R1cmVzLgorICAgIG15ICRzaXplID0gOCArIGxlbmd0aCgkcHJvcGVydHlfb2Zmc2V0cykgKyBsZW5ndGgoJHByb3BlcnR5X2RhdGEpOworICAgICAgICRzaXplID0gcGFjayAnVicsICAkc2l6ZTsKKworCisgICAgcmV0dXJuICAkYnl0ZV9vcmRlciAgICAgICAgIC4KKyAgICAgICAgICAgICR2ZXJzaW9uICAgICAgICAgICAgLgorICAgICAgICAgICAgJHN5c3RlbV9pZCAgICAgICAgICAuCisgICAgICAgICAgICAkY2xhc3NfaWQgICAgICAgICAgIC4KKyAgICAgICAgICAgICRudW1fcHJvcGVydHlfc2V0cyAgLgorICAgICAgICAgICAgJGZvcm1hdF9pZCAgICAgICAgICAuCisgICAgICAgICAgICAkb2Zmc2V0ICAgICAgICAgICAgIC4KKyAgICAgICAgICAgICRzaXplICAgICAgICAgICAgICAgLgorICAgICAgICAgICAgJG51bV9wcm9wZXJ0eSAgICAgICAuCisgICAgICAgICAgICAkcHJvcGVydHlfb2Zmc2V0cyAgIC4KKyAgICAgICAgICAgICRwcm9wZXJ0eV9kYXRhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQ3JlYXRlIHRoZSBEb2NTdW1tYXJ5SW5mb3JtYXRpb24gcHJvcGVydHkgc2V0LiBUaGlzIGlzIG1haW5seSB1c2VkIGZvciB0aGUKKyMgTWFuYWdlciwgQ29tcGFueSBhbmQgQ2F0ZWdvcnkga2V5d29yZHMuCisjCisjIFRoZSBEb2NTdW1tYXJ5IGFsc28gY29udGFpbnMgYSBzdHJlYW0gZm9yIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzLiBIb3dldmVyCisjIHRoaXMgaXMgYSBsaXR0bGUgYXJjYW5lIGFuZCBwcm9iYWJseSBub3Qgd29ydGggdGhlIGltcGxlbWVudGF0aW9uIGVmZm9ydC4KKyMKK3N1YiBjcmVhdGVfZG9jX3N1bW1hcnlfcHJvcGVydHlfc2V0IHsKKworICAgIG15IEBwcm9wZXJ0aWVzICAgICAgICAgID0gQHskX1swXX07CisKKyAgICBteSAkYnl0ZV9vcmRlciAgICAgICAgICA9IHBhY2sgJ3YnLCAgMHhGRkZFOworICAgIG15ICR2ZXJzaW9uICAgICAgICAgICAgID0gcGFjayAndicsICAweDAwMDA7CisgICAgbXkgJHN5c3RlbV9pZCAgICAgICAgICAgPSBwYWNrICdWJywgIDB4MDAwMjAxMDU7CisgICAgbXkgJGNsYXNzX2lkICAgICAgICAgICAgPSBwYWNrICdIKicsICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc7CisgICAgbXkgJG51bV9wcm9wZXJ0eV9zZXRzICAgPSBwYWNrICdWJywgIDB4MDAwMjsKKworICAgIG15ICRmb3JtYXRfaWRfMCAgICAgICAgID0gcGFjayAnSConLCAnMDJENUNERDU5QzJFMUIxMDkzOTcwODAwMkIyQ0Y5QUUnOworICAgIG15ICRmb3JtYXRfaWRfMSAgICAgICAgID0gcGFjayAnSConLCAnMDVENUNERDU5QzJFMUIxMDkzOTcwODAwMkIyQ0Y5QUUnOworICAgIG15ICRvZmZzZXRfMCAgICAgICAgICAgID0gcGFjayAnVicsICAweDAwNDQ7CisgICAgbXkgJG51bV9wcm9wZXJ0eV8wICAgICAgPSBwYWNrICdWJywgIHNjYWxhciBAcHJvcGVydGllczsKKyAgICBteSAkcHJvcGVydHlfb2Zmc2V0c18wICA9ICcnOworCisgICAgIyBDcmVhdGUgdGhlIHByb3BlcnR5IHNldCBkYXRhIGJsb2NrIGFuZCBjYWxjdWxhdGUgdGhlIG9mZnNldHMgaW50byBpdC4KKyAgICBteSAoJHByb3BlcnR5X2RhdGFfMCwgJG9mZnNldHMpID0gX3BhY2tfcHJvcGVydHlfZGF0YShcQHByb3BlcnRpZXMpOworCisgICAgIyBDcmVhdGUgdGhlIHByb3BlcnR5IHR5cGUgYW5kIG9mZnNldHMgYmFzZWQgb24gdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uLgorICAgIGZvciBteSAkaSAoMCAuLiBAcHJvcGVydGllcyAtMSkgeworICAgICAgICAkcHJvcGVydHlfb2Zmc2V0c18wIC49IHBhY2soJ1ZWJywgJHByb3BlcnRpZXNbJGldLT5bMF0sICRvZmZzZXRzLT5bJGldKTsKKyAgICB9CisKKyAgICAjIFNpemUgb2YgJHNpemUgKDQgYnl0ZXMpICsgICRudW1fcHJvcGVydHkgKDQgYnl0ZXMpICsgdGhlIGRhdGEgc3RydWN0dXJlcy4KKyAgICBteSAkZGF0YV9sZW4gPSA4ICsgbGVuZ3RoKCRwcm9wZXJ0eV9vZmZzZXRzXzApICsgbGVuZ3RoKCRwcm9wZXJ0eV9kYXRhXzApOworICAgIG15ICRzaXplXzAgICA9IHBhY2sgJ1YnLCAgJGRhdGFfbGVuOworCisKKyAgICAjIFRoZSBzZWNvbmQgcHJvcGVydHkgc2V0IG9mZnNldCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBwcm9wZXJ0eSBzZXQuCisgICAgbXkgJG9mZnNldF8xID0gcGFjayAnVicsICAweDAwNDQgKyAkZGF0YV9sZW47CisKKyAgICAjIFdlIHdpbGwgdXNlIGEgc3RhdGljIHByb3BlcnR5IHNldCBzdHJlYW0gcmF0aGVyIHRoYW4gdHJ5IHRvIGdlbmVyYXRlIGl0LgorICAgIG15ICRwcm9wZXJ0eV9kYXRhXzEgPSBwYWNrICdIKicsIGpvaW4gJycsIHF3ICgKKyAgICAgICAgOTggMDAgMDAgMDAgMDMgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMjAgMDAgMDAgMDAKKyAgICAgICAgMDEgMDAgMDAgMDAgMzYgMDAgMDAgMDAgMDIgMDAgMDAgMDAgM0UgMDAgMDAgMDAKKyAgICAgICAgMDEgMDAgMDAgMDAgMDIgMDAgMDAgMDAgMEEgMDAgMDAgMDAgNUYgNTAgNDkgNDQKKyAgICAgICAgNUYgNDcgNTUgNDkgNDQgMDAgMDIgMDAgMDAgMDAgRTQgMDQgMDAgMDAgNDEgMDAKKyAgICAgICAgMDAgMDAgNEUgMDAgMDAgMDAgN0IgMDAgMzEgMDAgMzYgMDAgNDMgMDAgMzQgMDAKKyAgICAgICAgNDIgMDAgMzggMDAgMzMgMDAgNDIgMDAgMkQgMDAgMzkgMDAgMzYgMDAgMzUgMDAKKyAgICAgICAgNDYgMDAgMkQgMDAgMzQgMDAgNDIgMDAgMzIgMDAgMzEgMDAgMkQgMDAgMzkgMDAKKyAgICAgICAgMzAgMDAgMzMgMDAgNDQgMDAgMkQgMDAgMzkgMDAgMzEgMDAgMzAgMDAgNDYgMDAKKyAgICAgICAgNDEgMDAgNDQgMDAgNDYgMDAgNDEgMDAgMzcgMDAgMzAgMDAgMzEgMDAgNDIgMDAKKyAgICAgICAgN0QgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMkQgMDAgMzkgMDAgMzAgMDAgMzMgMDAKKyAgICApOworCisKKyAgICByZXR1cm4gICRieXRlX29yZGVyICAgICAgICAgLgorICAgICAgICAgICAgJHZlcnNpb24gICAgICAgICAgICAuCisgICAgICAgICAgICAkc3lzdGVtX2lkICAgICAgICAgIC4KKyAgICAgICAgICAgICRjbGFzc19pZCAgICAgICAgICAgLgorICAgICAgICAgICAgJG51bV9wcm9wZXJ0eV9zZXRzICAuCisgICAgICAgICAgICAkZm9ybWF0X2lkXzAgICAgICAgIC4KKyAgICAgICAgICAgICRvZmZzZXRfMCAgICAgICAgICAgLgorICAgICAgICAgICAgJGZvcm1hdF9pZF8xICAgICAgICAuCisgICAgICAgICAgICAkb2Zmc2V0XzEgICAgICAgICAgIC4KKworICAgICAgICAgICAgJHNpemVfMCAgICAgICAgICAgICAuCisgICAgICAgICAgICAkbnVtX3Byb3BlcnR5XzAgICAgIC4KKyAgICAgICAgICAgICRwcm9wZXJ0eV9vZmZzZXRzXzAgLgorICAgICAgICAgICAgJHByb3BlcnR5X2RhdGFfMCAgICAuCisKKyAgICAgICAgICAgICRwcm9wZXJ0eV9kYXRhXzE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcGFja19wcm9wZXJ0eV9kYXRhKCkuCisjCisjIENyZWF0ZSBhIHBhY2tlZCBwcm9wZXJ0eSBzZXQgc3RydWN0dXJlLiBTdHJpbmdzIGFyZSBudWxsIHRlcm1pbmF0ZWQgYW5kCisjIHBhZGRlZCB0byBhIDQgYnl0ZSBib3VuZGFyeS4gV2UgYWxzbyB1c2UgdGhpcyBmdW5jdGlvbiB0byBrZWVwIHRyYWNrIG9mIHRoZQorIyBwcm9wZXJ0eSBvZmZzZXRzIHdpdGhpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuIFRoZXNlIG9mZnNldHMgYXJlIHVzZWQgYnkgdGhlCisjIGNhbGxpbmcgZnVuY3Rpb25zLiBDdXJyZW50bHkgd2Ugb25seSBuZWVkIHRvIGhhbmRsZSA0IHByb3BlcnR5IHR5cGVzOgorIyBWVF9JMiwgVlRfTFBTVFIsIFZUX0ZJTEVUSU1FLgorIworc3ViIF9wYWNrX3Byb3BlcnR5X2RhdGEgeworCisgICAgbXkgQHByb3BlcnRpZXMgICAgICAgICAgPSBAeyRfWzBdfTsKKyAgICBteSAkb2Zmc2V0ICAgICAgICAgICAgICA9ICRfWzFdIHx8IDA7CisgICAgbXkgJHBhY2tlZF9wcm9wZXJ0eSAgICAgPSAnJzsKKyAgICBteSAkZGF0YSAgICAgICAgICAgICAgICA9ICcnOworICAgIG15IEBvZmZzZXRzOworCisgICAgIyBHZXQgdGhlIHN0cmluZ3MgY29kZXBhZ2UgZnJvbSB0aGUgZmlyc3QgcHJvcGVydHkuCisgICAgbXkgJGNvZGVwYWdlID0gJHByb3BlcnRpZXNbMF0tPlsyXTsKKworICAgICMgVGhlIHByb3BlcnRpZXMgc3RhcnQgYWZ0ZXIgOCBieXRlcyBmb3Igc2l6ZSArIG51bV9wcm9wZXJ0aWVzICsgOCBieXRlcworICAgICMgZm9yIGVhY2ggcHJvcGV0eSB0eXBlL29mZnNldCBwYWlyLgorICAgICRvZmZzZXQgKz0gOCAqIChAcHJvcGVydGllcyArIDEpOworCisgICAgZm9yIG15ICRwcm9wZXJ0eSAoQHByb3BlcnRpZXMpIHsKKyAgICAgICAgcHVzaCBAb2Zmc2V0cywgJG9mZnNldDsKKworICAgICAgICBteSAkcHJvcGVydHlfdHlwZSA9ICRwcm9wZXJ0eS0+WzFdOworCisgICAgICAgIGlmICAgICgkcHJvcGVydHlfdHlwZSBlcSAnVlRfSTInKSB7CisgICAgICAgICAgICAkcGFja2VkX3Byb3BlcnR5ID0gX3BhY2tfVlRfSTIoJHByb3BlcnR5LT5bMl0pOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkcHJvcGVydHlfdHlwZSBlcSAnVlRfTFBTVFInKSB7CisgICAgICAgICAgICAkcGFja2VkX3Byb3BlcnR5ID0gX3BhY2tfVlRfTFBTVFIoJHByb3BlcnR5LT5bMl0sICRjb2RlcGFnZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRwcm9wZXJ0eV90eXBlIGVxICdWVF9GSUxFVElNRScpIHsKKyAgICAgICAgICAgICRwYWNrZWRfcHJvcGVydHkgPSBfcGFja19WVF9GSUxFVElNRSgkcHJvcGVydHktPlsyXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjcm9hayAiVW5rbm93biBwcm9wZXJ0eSB0eXBlOiAkcHJvcGVydHlfdHlwZVxuIjsKKyAgICAgICAgfQorCisgICAgICAgICRvZmZzZXQgKz0gbGVuZ3RoICRwYWNrZWRfcHJvcGVydHk7CisgICAgICAgICRkYXRhICAgLj0gJHBhY2tlZF9wcm9wZXJ0eTsKKyAgICB9CisKKyAgICByZXR1cm4gJGRhdGEsIFxAb2Zmc2V0czsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX1ZUX0kyKCkuCisjCisjIFBhY2sgYW4gT0xFIHByb3BlcnR5IHR5cGU6IFZUX0kyLCAxNi1iaXQgc2lnbmVkIGludGVnZXIuCisjCitzdWIgX3BhY2tfVlRfSTIgeworCisgICAgbXkgJHR5cGUgICAgPSAweDAwMDI7CisgICAgbXkgJHZhbHVlICAgPSAkX1swXTsKKworICAgIG15ICRkYXRhID0gcGFjayAnVlYnLCAkdHlwZSwgJHZhbHVlOworCisgICAgcmV0dXJuICRkYXRhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhY2tfVlRfTFBTVFIoKS4KKyMKKyMgUGFjayBhbiBPTEUgcHJvcGVydHkgdHlwZTogVlRfTFBTVFIsIFN0cmluZyBpbiB0aGUgQ29kZXBhZ2UgZW5jb2RpbmcuCisjIFRoZSBzdHJpbmdzIGFyZSBudWxsIHRlcm1pbmF0ZWQgYW5kIHBhZGRlZCB0byBhIDQgYnl0ZSBib3VuZGFyeS4KKyMKK3N1YiBfcGFja19WVF9MUFNUUiB7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweDAwMUU7CisgICAgbXkgJHN0cmluZyAgICAgID0gJF9bMF0gLiAiXDAiOworICAgIG15ICRjb2RlcGFnZSAgICA9ICRfWzFdOworICAgIG15ICRsZW5ndGg7CisgICAgbXkgJGJ5dGVfc3RyaW5nOworCisgICAgaWYgKCRjb2RlcGFnZSA9PSAweDA0RTQpIHsKKyAgICAgICAgIyBMYXRpbjEKKyAgICAgICAgJGJ5dGVfc3RyaW5nID0gJHN0cmluZzsKKyAgICAgICAgJGxlbmd0aCAgICAgID0gbGVuZ3RoICRieXRlX3N0cmluZzsKKyAgICB9CisgICAgZWxzaWYgKCRjb2RlcGFnZSA9PSAweEZERTkpIHsKKyAgICAgICAgIyBVVEYtOAorICAgICAgICBpZiAoICRdID4gNS4wMDggKSB7CisgICAgICAgICAgICByZXF1aXJlIEVuY29kZTsKKyAgICAgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cmluZykpIHsKKyAgICAgICAgICAgICAgICAkYnl0ZV9zdHJpbmcgPSBFbmNvZGU6OmVuY29kZV91dGY4KCRzdHJpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJGJ5dGVfc3RyaW5nID0gJHN0cmluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRieXRlX3N0cmluZyA9ICRzdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICAkbGVuZ3RoID0gbGVuZ3RoICRieXRlX3N0cmluZzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNyb2FrICJVbmtub3duIGNvZGVwYWdlOiAkY29kZXBhZ2VcbiI7CisgICAgfQorCisgICAgIyBQYWNrIHRoZSBkYXRhLgorICAgIG15ICRkYXRhICA9IHBhY2sgJ1ZWJywgJHR5cGUsICRsZW5ndGg7CisgICAgICAgJGRhdGEgLj0gJGJ5dGVfc3RyaW5nOworCisgICAgIyBUaGUgcGFja2VkIGRhdGEgaGFzIHRvIG51bGwgcGFkZGVkIHRvIGEgNCBieXRlIGJvdW5kYXJ5LgorICAgIGlmIChteSAkZXh0cmEgPSAkbGVuZ3RoICUgNCkgeworICAgICAgICAkZGF0YSAuPSAiXDAiIHggKDQgLSAkZXh0cmEpOworICAgIH0KKworICAgIHJldHVybiAkZGF0YTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX1ZUX0ZJTEVUSU1FKCkuCisjCisjIFBhY2sgYW4gT0xFIHByb3BlcnR5IHR5cGU6IFZUX0ZJTEVUSU1FLgorIworc3ViIF9wYWNrX1ZUX0ZJTEVUSU1FIHsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4MDA0MDsKKyAgICBteSAkbG9jYWx0aW1lICAgPSAkX1swXTsKKworICAgICMgQ29udmVydCBmcm9tIGxvY2FsdGltZSB0byBzZWNvbmRzLgorICAgIG15ICRzZWNvbmRzID0gVGltZTo6TG9jYWw6OnRpbWVsb2NhbChAeyRsb2NhbHRpbWV9KTsKKworICAgICMgQWRkIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHRoZSAxNjAxIGFuZCAxOTcwIGVwb2Nocy4KKyAgICAkc2Vjb25kcyArPSAxMTY0NDQ3MzYwMDsKKworICAgICMgVGhlIEZJTEVUSU1FIHNlY29uZHMgYXJlIGluIHVuaXRzIG9mIDEwMCBuYW5vc2Vjb25kcy4KKyAgICBteSAkbmFub3NlY29uZHMgPSAkc2Vjb25kcyAqIDFFNzsKKworICAgICMgUGFjayB0aGUgdG90YWwgbmFub3NlY29uZHMgaW50byA2NCBiaXRzLgorICAgIG15ICR0aW1lX2hpID0gaW50KCRuYW5vc2Vjb25kcyAvIDIqKjMyKTsKKyAgICBteSAkdGltZV9sbyA9IFBPU0lYOjpmbW9kKCRuYW5vc2Vjb25kcywgMioqMzIpOworCisgICAgbXkgJGRhdGEgPSBwYWNrICdWVlYnLCAkdHlwZSwgJHRpbWVfbG8sICR0aW1lX2hpOworCisgICAgcmV0dXJuICRkYXRhOworfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK1Byb3BlcnRpZXMgLSBBIG1vZHVsZSBmb3IgY3JlYXRpbmcgRXhjZWwgcHJvcGVydHkgc2V0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgQzxzZXRfcHJvcGVydGllcygpPiBtZXRob2QgaW4gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24uCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCiupIE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9VdGlsaXR5LnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9VdGlsaXR5LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjE3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1V0aWxpdHkucG0KQEAgLTAsMCArMSw5MzggQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OlV0aWxpdHk7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVXRpbGl0eSAtIEhlbHBlciBmdW5jdGlvbnMgZm9yIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMKKwordXNlIEV4cG9ydGVyOwordXNlIHN0cmljdDsKK3VzZSBhdXRvdXNlICdEYXRlOjpDYWxjJyAgPT4gcXcoRGVsdGFfREhNUyBEZWNvZGVfRGF0ZV9FVSBEZWNvZGVfRGF0ZV9VUyk7Cit1c2UgYXV0b3VzZSAnRGF0ZTo6TWFuaXAnID0+IHF3KFBhcnNlRGF0ZSBEYXRlX0luaXQpOworCisKKyMgRG8gYWxsIG9mIHRoZSBleHBvcnQgcHJlcGFyYXRpb24KK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EgQEVYUE9SVCBARVhQT1JUX09LICVFWFBPUlRfVEFHUyk7CisKKyMgUm93IGFuZCBjb2x1bW4gZnVuY3Rpb25zCitteSBAcm93Y29sICAgICAgPSBxdygKKyAgICAgICAgICAgICAgICAgICAgICAgIHhsX3Jvd2NvbF90b19jZWxsCisgICAgICAgICAgICAgICAgICAgICAgICB4bF9jZWxsX3RvX3Jvd2NvbAorICAgICAgICAgICAgICAgICAgICAgICAgeGxfcmFuZ2VfZm9ybXVsYQorICAgICAgICAgICAgICAgICAgICAgICAgeGxfaW5jX3JvdworICAgICAgICAgICAgICAgICAgICAgICAgeGxfZGVjX3JvdworICAgICAgICAgICAgICAgICAgICAgICAgeGxfaW5jX2NvbAorICAgICAgICAgICAgICAgICAgICAgICAgeGxfZGVjX2NvbAorICAgICAgICAgICAgICAgICAgICApOworCisjIERhdGUgYW5kIFRpbWUgZnVuY3Rpb25zCitteSBAZGF0ZXMgICAgICAgPSBxdygKKyAgICAgICAgICAgICAgICAgICAgICAgIHhsX2RhdGVfbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgeGxfZGF0ZV8xOTA0CisgICAgICAgICAgICAgICAgICAgICAgICB4bF9wYXJzZV90aW1lCisgICAgICAgICAgICAgICAgICAgICAgICB4bF9wYXJzZV9kYXRlCisgICAgICAgICAgICAgICAgICAgICAgICB4bF9wYXJzZV9kYXRlX2luaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHhsX2RlY29kZV9kYXRlX0VVCisgICAgICAgICAgICAgICAgICAgICAgICB4bF9kZWNvZGVfZGF0ZV9VUworICAgICAgICAgICAgICAgICAgICApOworCisKK0BJU0EgICAgICAgICAgICA9IHF3KEV4cG9ydGVyKTsKK0BFWFBPUlRfT0sgICAgICA9ICAgKCk7CitARVhQT1JUICAgICAgICAgPSAgIChAcm93Y29sLCBAZGF0ZXMpOworJUVYUE9SVF9UQUdTICAgID0gICAoCisgICAgICAgICAgICAgICAgICAgICAgICByb3djb2wgID0+IFxAcm93Y29sLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXMgICA9PiBcQGRhdGVzCisgICAgICAgICAgICAgICAgICAgICk7CisKKyRWRVJTSU9OICAgICAgICA9ICcyLjM3JzsKKworCisKKworPWhlYWQxIE5BTUUKKworVXRpbGl0eSAtIEhlbHBlciBmdW5jdGlvbnMgZm9yIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWhlYWQxIFNZTk9QU0lTCisKK0Z1bmN0aW9ucyB0byBoZWxwIHdpdGggc29tZSBjb21tb24gdGFza3Mgd2hlbiB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworVGhlc2UgZnVuY3Rpb25zIG1haW5seSByZWxhdGUgdG8gZGVhbGluZyB3aXRoIHJvd3MgYW5kIGNvbHVtbnMgaW4gQTEgbm90YXRpb24gYW5kIHRvIGhhbmRsaW5nIGRhdGVzIGFuZCB0aW1lcy4KKworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eTsgICAgICAgICAgICAgICAjIEltcG9ydCBldmVyeXRoaW5nCisKKyAgICAoJHJvdywgJGNvbCkgICAgPSB4bF9jZWxsX3RvX3Jvd2NvbCgnQzInKTsgICAgICAgICAgIyAoMSwgMikKKyAgICAkc3RyICAgICAgICAgICAgPSB4bF9yb3djb2xfdG9fY2VsbCgxLCAyKTsgICAgICAgICAgIyBDMgorICAgICRzdHIgICAgICAgICAgICA9IHhsX2luY19jb2woJ1oxJyAgKTsgICAgICAgICAgICAgICAjIEFBMQorICAgICRzdHIgICAgICAgICAgICA9IHhsX2RlY19jb2woJ0FBMScgKTsgICAgICAgICAgICAgICAjIFoxCisKKyAgICAkZGF0ZSAgICAgICAgICAgPSB4bF9kYXRlX2xpc3QoMjAwMiwgMSwgMSk7ICAgICAgICAgIyAzNzI1NworICAgICRkYXRlICAgICAgICAgICA9IHhsX3BhcnNlX2RhdGUoIjExIEp1bHkgMTk5NyIpOyAgICAjIDM1NjIyCisgICAgJHRpbWUgICAgICAgICAgID0geGxfcGFyc2VfdGltZSgnMzoyMTozNiBQTScpOyAgICAgICMgMC42NAorICAgICRkYXRlICAgICAgICAgICA9IHhsX2RlY29kZV9kYXRlX0VVKCIxMyBNYXkgMjAwMiIpOyAjIDM3Mzg5CisKKworCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgdG8gaGVscCB3aXRoIHNvbWUgY29tbW9uIHRhc2tzIGVuY291bnRlcmVkIHdoZW4gdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZS4gVGhlIHR3byBtYWluIGNhdGVnb3JpZXMgb2YgZnVuY3Rpb24gYXJlOgorCitSb3cgYW5kIGNvbHVtbiBmdW5jdGlvbnM6IHRoZXNlIGFyZSB1c2VkIHRvIGRlYWwgd2l0aCBFeGNlbCdzIEExIHJlcHJlc2VudGF0aW9uIG9mIGNlbGxzLiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgY2F0ZWdvcnkgYXJlOgorCisgICAgeGxfcm93Y29sX3RvX2NlbGwKKyAgICB4bF9jZWxsX3RvX3Jvd2NvbAorICAgIHhsX3JhbmdlX2Zvcm11bGEKKyAgICB4bF9pbmNfcm93CisgICAgeGxfZGVjX3JvdworICAgIHhsX2luY19jb2wKKyAgICB4bF9kZWNfY29sCisKK0RhdGUgYW5kIFRpbWUgZnVuY3Rpb25zOiB0aGVzZSBhcmUgdXNlZCB0byBjb252ZXJ0IGRhdGVzIGFuZCB0aW1lcyB0byB0aGUgbnVtZXJpYyBmb3JtYXQgdXNlZCBieSBFeGNlbC4gVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGNhdGVnb3J5IGFyZToKKworICAgIHhsX2RhdGVfbGlzdAorICAgIHhsX2RhdGVfMTkwNAorICAgIHhsX3BhcnNlX3RpbWUKKyAgICB4bF9wYXJzZV9kYXRlCisgICAgeGxfcGFyc2VfZGF0ZV9pbml0CisgICAgeGxfZGVjb2RlX2RhdGVfRVUKKyAgICB4bF9kZWNvZGVfZGF0ZV9VUworCitBbGwgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieSBkZWZhdWx0LiBIb3dldmVyLCB5b3UgY2FuIHVzZSBpbXBvcnQgbGlzdHMgaWYgeW91IHdpc2ggdG8gbGltaXQgdGhlIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbXBvcnRlZDoKKworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eTsgICAgICAgICAgICAgICAgICAjIEltcG9ydCBldmVyeXRoaW5nCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5IHF3KHhsX2RhdGVfbGlzdCk7ICMgeGxfZGF0ZV9saXN0IG9ubHkKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OlV0aWxpdHkgcXcoOnJvd2NvbCk7ICAgICAgIyBSb3cvY29sIGZ1bmN0aW9ucworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eSBxdyg6ZGF0ZXMpOyAgICAgICAjIERhdGUgZnVuY3Rpb25zCisKKworCis9aGVhZDEgUk9XIEFORCBDT0xVTU4gRlVOQ1RJT05TCisKKworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgc3VwcG9ydHMgdHdvIGZvcm1zIG9mIG5vdGF0aW9uIHRvIGRlc2lnbmF0ZSB0aGUgcG9zaXRpb24gb2YgY2VsbHM6IFJvdy1jb2x1bW4gbm90YXRpb24gYW5kIEExIG5vdGF0aW9uLgorCitSb3ctY29sdW1uIG5vdGF0aW9uIHVzZXMgYSB6ZXJvIGJhc2VkIGluZGV4IGZvciBib3RoIHJvdyBhbmQgY29sdW1uIHdoaWxlIEExIG5vdGF0aW9uIHVzZXMgdGhlIHN0YW5kYXJkIEV4Y2VsIGFscGhhbnVtZXJpYyBzZXF1ZW5jZSBvZiBjb2x1bW4gbGV0dGVyIGFuZCAxLWJhc2VkIHJvdy4gQ29sdW1ucyByYW5nZSBmcm9tIEEgdG8gSVYgaS5lLiAwIHRvIDI1NSwgcm93cyByYW5nZSBmcm9tIDEgdG8gMTYzODQgaW4gRXhjZWwgNSBhbmQgNjU1MzYgaW4gRXhjZWwgOTcuIEZvciBleGFtcGxlOgorCisgICAgKDAsIDApICAgICAgIyBUaGUgdG9wIGxlZnQgY2VsbCBpbiByb3ctY29sdW1uIG5vdGF0aW9uLgorICAgICgnQTEnKSAgICAgICMgVGhlIHRvcCBsZWZ0IGNlbGwgaW4gQTEgbm90YXRpb24uCisKKyAgICAoMTk5OSwgMjkpICAjIFJvdy1jb2x1bW4gbm90YXRpb24uCisgICAgKCdBRDIwMDAnKSAgIyBUaGUgc2FtZSBjZWxsIGluIEExIG5vdGF0aW9uLgorCitSb3ctY29sdW1uIG5vdGF0aW9uIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIHJlZmVycmluZyB0byBjZWxscyBwcm9ncmFtbWF0aWNhbGx5OgorCisgICAgZm9yIG15ICRpICgwIC4uIDkpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGksIDAsICdIZWxsbycpOyAjIENlbGxzIEExIHRvIEExMAorICAgIH0KKworQTEgbm90YXRpb24gaXMgdXNlZnVsIGZvciBzZXR0aW5nIHVwIGEgd29ya3NoZWV0IG1hbnVhbGx5IGFuZCBmb3Igd29ya2luZyB3aXRoIGZvcm11bGFzOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0gxJywgMjAwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDInLCAnPUg3KzEnKTsKKworVGhlIGZ1bmN0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIGNhbiBiZSB1c2VkIGZvciBkZWFsaW5nIHdpdGggQTEgbm90YXRpb24sIGZvciBleGFtcGxlOgorCisgICAgKCRyb3csICRjb2wpICAgID0geGxfY2VsbF90b19yb3djb2woJ0MyJyk7ICAjICgxLCAyKQorICAgICRzdHIgICAgICAgICAgICA9IHhsX3Jvd2NvbF90b19jZWxsKDEsIDIpOyAgIyBDMgorCisKK0NlbGwgcmVmZXJlbmNlcyBpbiBFeGNlbCBjYW4gYmUgZWl0aGVyIHJlbGF0aXZlIG9yIGFic29sdXRlLiBBYnNvbHV0ZSByZWZlcmVuY2VzIGFyZSBwcmVmaXhlZCBieSB0aGUgZG9sbGFyIHN5bWJvbCBhcyBzaG93biBiZWxvdzoKKworICAgIEExICAgICAgIyBDb2x1bW4gYW5kIHJvdyBhcmUgcmVsYXRpdmUKKyAgICAkQTEgICAgICMgQ29sdW1uIGlzIGFic29sdXRlIGFuZCByb3cgaXMgcmVsYXRpdmUKKyAgICBBJDEgICAgICMgQ29sdW1uIGlzIHJlbGF0aXZlIGFuZCByb3cgaXMgYWJzb2x1dGUKKyAgICAkQSQxICAgICMgQ29sdW1uIGFuZCByb3cgYXJlIGFic29sdXRlCisKK0FuIGFic29sdXRlIHJlZmVyZW5jZSBvbmx5IGhhcyBhbiBlZmZlY3QgaWYgdGhlIGNlbGwgaXMgY29waWVkLiBSZWZlciB0byB0aGUgRXhjZWwgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc3VwcG9ydCBhYnNvbHV0ZSByZWZlcmVuY2VzLgorCis9Y3V0CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX3Jvd2NvbF90b19jZWxsKCRyb3csICRjb2wsICRyb3dfYWJzb2x1dGUsICRjb2xfYWJzb2x1dGUpCisKKyAgICBQYXJhbWV0ZXJzOiAkcm93OiAgICAgICAgICAgSW50ZWdlcgorICAgICAgICAgICAgICAgICRjb2w6ICAgICAgICAgICBJbnRlZ2VyCisgICAgICAgICAgICAgICAgJHJvd19hYnNvbHV0ZTogIEJvb2xlYW4gKDEvMCkgW29wdGlvbmFsLCBkZWZhdWx0IGlzIDBdCisgICAgICAgICAgICAgICAgJGNvbF9hYnNvbHV0ZTogIEJvb2xlYW4gKDEvMCkgW29wdGlvbmFsLCBkZWZhdWx0IGlzIDBdCisKKyAgICBSZXR1cm5zOiAgICBBIHN0cmluZyBpbiBBMSBjZWxsIG5vdGF0aW9uCisKKworVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHplcm8gYmFzZWQgcm93IGFuZCBjb2x1bW4gY2VsbCByZWZlcmVuY2UgdG8gYSBBMSBzdHlsZSBzdHJpbmc6CisKKyAgICAkc3RyID0geGxfcm93Y29sX3RvX2NlbGwoMCwgMCk7ICMgQTEKKyAgICAkc3RyID0geGxfcm93Y29sX3RvX2NlbGwoMCwgMSk7ICMgQjEKKyAgICAkc3RyID0geGxfcm93Y29sX3RvX2NlbGwoMSwgMCk7ICMgQTIKKworCitUaGUgb3B0aW9uYWwgcGFyYW1ldGVycyBDPCRyb3dfYWJzb2x1dGU+IGFuZCBDPCRjb2xfYWJzb2x1dGU+IGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIGlmIHRoZSByb3cgb3IgY29sdW1uIGlzIGFic29sdXRlOgorCisgICAgJHN0ciA9IHhsX3Jvd2NvbF90b19jZWxsKDAsIDAsIDAsIDEpOyAjICRBMQorICAgICRzdHIgPSB4bF9yb3djb2xfdG9fY2VsbCgwLCAwLCAxLCAwKTsgIyBBJDEKKyAgICAkc3RyID0geGxfcm93Y29sX3RvX2NlbGwoMCwgMCwgMSwgMSk7ICMgJEEkMQorCitTZWUgTDxST1cgQU5EIENPTFVNTiBGVU5DVElPTlM+IGZvciBhbiBleHBsYW5hdGlvbiBvZiBhYnNvbHV0ZSBjZWxsIHJlZmVyZW5jZXMuCisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9yb3djb2xfdG9fY2VsbCgkcm93LCAkY29sLCAkcm93X2Fic29sdXRlLCAkY29sX2Fic29sdXRlKQorIworc3ViIHhsX3Jvd2NvbF90b19jZWxsIHsKKworICAgIG15ICRyb3cgICAgID0gJF9bMF07CisgICAgbXkgJGNvbCAgICAgPSAkX1sxXTsKKyAgICBteSAkcm93X2FicyA9ICRfWzJdID8gJyQnIDogJyc7CisgICAgbXkgJGNvbF9hYnMgPSAkX1szXSA/ICckJyA6ICcnOworCisKKyAgICBteSAkaW50ICA9IGludCAoJGNvbCAvIDI2KTsKKyAgICBteSAkZnJhYyA9ICRjb2wgJSAyNjsKKworICAgIG15ICRjaHIxID0nJzsgIyBNb3N0IHNpZ25pZmljYW50IGNoYXJhY3RlciBpbiBBQTEKKworICAgIGlmICgkaW50ID4gMCkgeworICAgICAgICAkY2hyMSA9IGNociggb3JkKCdBJykgKyAkaW50ICAtMSApOworICAgIH0KKworICAgIG15ICRjaHIyID0gY2hyKCBvcmQoJ0EnKSArICRmcmFjICk7CisKKyAgICAjIFplcm8gaW5kZXggdG8gMS1pbmRleAorICAgICRyb3crKzsKKworICAgIHJldHVybiAkY29sX2FicyAuICRjaHIxIC4gJGNocjIgLiAkcm93X2Ficy4gJHJvdzsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfY2VsbF90b19yb3djb2woJHN0cmluZykKKworCisgICAgUGFyYW1ldGVyczogJHN0cmluZyAgICAgICAgIFN0cmluZyBpbiBBMSBmb3JtYXQKKworICAgIFJldHVybnM6ICAgIExpc3QgICAgICAgICAgICAoJHJvdywgJGNvbCkKKworVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiB0byBhIHplcm8gYmFzZWQgcm93IGFuZCBjb2x1bW4uIFRoZSBmdW5jdGlvbiB3aWxsIGFsc28gaGFuZGxlIEV4Y2VsJ3MgYWJzb2x1dGUsIEM8JD4sIGNlbGwgbm90YXRpb24uCisKKyAgICBteSAoJHJvdywgJGNvbCkgPSB4bF9jZWxsX3RvX3Jvd2NvbCgnQTEnKTsgICAgICMgKDAsIDApCisgICAgbXkgKCRyb3csICRjb2wpID0geGxfY2VsbF90b19yb3djb2woJ0IxJyk7ICAgICAjICgwLCAxKQorICAgIG15ICgkcm93LCAkY29sKSA9IHhsX2NlbGxfdG9fcm93Y29sKCdDMicpOyAgICAgIyAoMSwgMikKKyAgICBteSAoJHJvdywgJGNvbCkgPSB4bF9jZWxsX3RvX3Jvd2NvbCgnJEMyJyApOyAgICMgKDEsIDIpCisgICAgbXkgKCRyb3csICRjb2wpID0geGxfY2VsbF90b19yb3djb2woJ0MkMicgKTsgICAjICgxLCAyKQorICAgIG15ICgkcm93LCAkY29sKSA9IHhsX2NlbGxfdG9fcm93Y29sKCckQyQyJyk7ICAgIyAoMSwgMikKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9jZWxsX3RvX3Jvd2NvbCgkc3RyaW5nKQorIworIyBSZXR1cm5zOiAoJHJvdywgJGNvbCwgJHJvd19hYnNvbHV0ZSwgJGNvbF9hYnNvbHV0ZSkKKyMKKyMgVGhlICRyb3dfYWJzb2x1dGUgYW5kICRjb2xfYWJzb2x1dGUgcGFyYW1ldGVycyBhcmVuJ3QgZG9jdW1lbnRlZCBiZWNhdXNlIHRoZXkKKyMgbWFpbmx5IHVzZWQgaW50ZXJuYWxseSBhbmQgYXJlbid0IHZlcnkgdXNlZnVsIHRvIHRoZSB1c2VyLgorIworc3ViIHhsX2NlbGxfdG9fcm93Y29sIHsKKworICAgIG15ICRjZWxsID0gc2hpZnQ7CisKKyAgICAkY2VsbCA9fiAvKFwkPykoW0EtSV0/W0EtWl0pKFwkPykoXGQrKS87CisKKyAgICBteSAkY29sX2FicyA9ICQxIGVxICIiID8gMCA6IDE7CisgICAgbXkgJGNvbCAgICAgPSAkMjsKKyAgICBteSAkcm93X2FicyA9ICQzIGVxICIiID8gMCA6IDE7CisgICAgbXkgJHJvdyAgICAgPSAkNDsKKworICAgICMgQ29udmVydCBiYXNlMjYgY29sdW1uIHN0cmluZyB0byBudW1iZXIKKyAgICAjIEFsbCB5b3VyIEJhc2UgYXJlIGJlbG9uZyB0byB1cy4KKyAgICBteSBAY2hhcnMgID0gc3BsaXQgLy8sICRjb2w7CisgICAgbXkgJGV4cG4gICA9IDA7CisgICAgJGNvbCAgICAgICA9IDA7CisKKyAgICB3aGlsZSAoQGNoYXJzKSB7CisgICAgICAgIG15ICRjaGFyID0gcG9wKEBjaGFycyk7ICMgTFMgY2hhciBmaXJzdAorICAgICAgICAkY29sICs9IChvcmQoJGNoYXIpIC1vcmQoJ0EnKSArMSkgKiAoMjYqKiRleHBuKTsKKyAgICAgICAgJGV4cG4rKzsKKyAgICB9CisKKyAgICAjIENvbnZlcnQgMS1pbmRleCB0byB6ZXJvLWluZGV4CisgICAgJHJvdy0tOworICAgICRjb2wtLTsKKworICAgIHJldHVybiAkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnM7Cit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX3JhbmdlX2Zvcm11bGEoJHNoZWV0bmFtZSwgJHJvd18xLCAkcm93XzIsICRjb2xfMSwgJGNvbF8yKQorCisgICAgUGFyYW1ldGVyczogJHNoZWV0bmFtZSAgICAgIFN0cmluZworICAgICAgICAgICAgICAgICRyb3dfMTogICAgICAgICBJbnRlZ2VyCisgICAgICAgICAgICAgICAgJHJvd18yOiAgICAgICAgIEludGVnZXIKKyAgICAgICAgICAgICAgICAkY29sXzE6ICAgICAgICAgSW50ZWdlcgorICAgICAgICAgICAgICAgICRjb2xfMjogICAgICAgICBJbnRlZ2VyCisKKyAgICBSZXR1cm5zOiAgICBBIHdvcmtzaGVldCByYW5nZSBmb3JtdWxhIGFzIGEgc3RyaW5nLgorCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHplcm8gYmFzZWQgcm93IGFuZCBjb2x1bW4gY2VsbCByZWZlcmVuY2VzIHRvIGFuIEExIHN0eWxlIGZvcm11bGEgc3RyaW5nOgorCisgICAgbXkgJHN0ciA9IHhsX3JhbmdlX2Zvcm11bGEoJ1NoZWV0MScsICAgMCwgIDksIDAsIDApOyAjID1TaGVldDEhJEEkMTokQSQxMAorICAgIG15ICRzdHIgPSB4bF9yYW5nZV9mb3JtdWxhKCdTaGVldDInLCAgIDYsIDY1LCAxLCAxKTsgIyA9U2hlZXQyISRCJDc6JEIkNjYKKyAgICBteSAkc3RyID0geGxfcmFuZ2VfZm9ybXVsYSgnTmV3IGRhdGEnLCAxLCAgOCwgMiwgMik7ICMgPSdOZXcgZGF0YSchJEMkMjokQyQ5CisKKworVGhpcyBpcyB1c2VmdWwgZm9yIHNldHRpbmcgcmFuZ2VzIGluIENoYXJ0IG9iamVjdHM6CisKKworICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyAgICA9PiB4bF9yYW5nZV9mb3JtdWxhKCdTaGVldDEnLCAxLCA5LCAwLCAwKSwKKyAgICAgICAgdmFsdWVzICAgICAgICA9PiB4bF9yYW5nZV9mb3JtdWxhKCdTaGVldDEnLCAxLCA5LCAxLCAxKTssCisgICAgKTsKKworICAgICMgV2hpY2ggaXMgdGhlIHNhbWUgYXM6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgICAgPT4gJz1TaGVldDEhJEEkMjokQSQxMCcsCisgICAgICAgIHZhbHVlcyAgICAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQxMCcsCisgICAgKTsKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX3JhbmdlX2Zvcm11bGEoJHNoZWV0bmFtZSwgJHJvd18xLCAkcm93XzIsICRjb2xfMSwgJGNvbF8yKQorIworc3ViIHhsX3JhbmdlX2Zvcm11bGEgeworCisgICAgbXkgKCRzaGVldG5hbWUsICRyb3dfMSwgJHJvd18yLCAkY29sXzEsICRjb2xfMikgPSBAXzsKKworICAgICMgVXNlIEV4Y2VsJ3MgY29udmVudGlvbnMgYW5kIHF1b3RlIHRoZSBzaGVldCBuYW1lIGlmIGl0IGNvbnRhaW5zIGFueQorICAgICMgbm9uLXdvcmQgY2hhcmFjdGVyIG9yIGlmIGl0IGlzbid0IGFscmVhZHkgcXVvdGVkLgorICAgIGlmICgkc2hlZXRuYW1lID1+IC9cVy8gJiYgJHNoZWV0bmFtZSAhfiAvXicvKSB7CisgICAgICAgICRzaGVldG5hbWUgPSBxKCcpIC4gJHNoZWV0bmFtZSAuIHEoJyk7CisgICAgfQorCisgICAgbXkgJHJhbmdlMSA9IHhsX3Jvd2NvbF90b19jZWxsKCRyb3dfMSwgJGNvbF8xLCAxLCAxKTsKKyAgICBteSAkcmFuZ2UyID0geGxfcm93Y29sX3RvX2NlbGwoJHJvd18yLCAkY29sXzIsIDEsIDEpOworCisgICAgcmV0dXJuICc9JyAuICRzaGVldG5hbWUgLiAnIScgLiAkcmFuZ2UxIC4gJzonIC4gJHJhbmdlMjsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfaW5jX3Jvdygkc3RyaW5nKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nLCBhIHN0cmluZyBpbiBBMSBmb3JtYXQKKworICAgIFJldHVybnM6ICAgIEluY3JlbWVudGVkIHN0cmluZyBpbiBBMSBmb3JtYXQKKworVGhpcyBmdW5jdGlvbnMgdGFrZXMgYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcgaW4gQTEgbm90YXRpb24gYW5kIGluY3JlbWVudHMgdGhlIHJvdy4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBoYW5kbGUgRXhjZWwncyBhYnNvbHV0ZSwgQzwkPiwgY2VsbCBub3RhdGlvbjoKKworICAgIG15ICRzdHIgPSB4bF9pbmNfcm93KCdBMScgICk7ICMgQTIKKyAgICBteSAkc3RyID0geGxfaW5jX3JvdygnQiQyJyApOyAjIEIkMworICAgIG15ICRzdHIgPSB4bF9pbmNfcm93KCckQzMnICk7ICMgJEM0CisgICAgbXkgJHN0ciA9IHhsX2luY19yb3coJyREJDQnKTsgIyAkRCQ1CisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9pbmNfcm93KCRzdHJpbmcpCisjCitzdWIgeGxfaW5jX3JvdyB7CisKKyAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgIG15ICgkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpID0geGxfY2VsbF90b19yb3djb2woJGNlbGwpOworCisgICAgcmV0dXJuIHhsX3Jvd2NvbF90b19jZWxsKCsrJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKTsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfZGVjX3Jvdygkc3RyaW5nKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nLCBhIHN0cmluZyBpbiBBMSBmb3JtYXQKKworICAgIFJldHVybnM6ICAgIERlY3JlbWVudGVkIHN0cmluZyBpbiBBMSBmb3JtYXQKKworVGhpcyBmdW5jdGlvbnMgdGFrZXMgYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcgaW4gQTEgbm90YXRpb24gYW5kIGRlY3JlbWVudHMgdGhlIHJvdy4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBoYW5kbGUgRXhjZWwncyBhYnNvbHV0ZSwgQzwkPiwgY2VsbCBub3RhdGlvbjoKKworICAgIG15ICRzdHIgPSB4bF9kZWNfcm93KCdBMicgICk7ICMgQTEKKyAgICBteSAkc3RyID0geGxfZGVjX3JvdygnQiQzJyApOyAjIEIkMgorICAgIG15ICRzdHIgPSB4bF9kZWNfcm93KCckQzQnICk7ICMgJEMzCisgICAgbXkgJHN0ciA9IHhsX2RlY19yb3coJyREJDUnKTsgIyAkRCQ0CisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9kZWNfcm93KCRzdHJpbmcpCisjCisjIERlY3JlbWVudHMgdGhlIHJvdyBudW1iZXIgb2YgYW4gRXhjZWwgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24uCisjIEZvciBleGFtcGxlIEM0IHRvIEMzCisjCisjIFJldHVybnM6IGEgY2VsbCByZWZlcmVuY2Ugc3RyaW5nLgorIworc3ViIHhsX2RlY19yb3cgeworCisgICAgbXkgJGNlbGwgPSBzaGlmdDsKKyAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IHhsX2NlbGxfdG9fcm93Y29sKCRjZWxsKTsKKworICAgIHJldHVybiB4bF9yb3djb2xfdG9fY2VsbCgtLSRyb3csICRjb2wsICRyb3dfYWJzLCAkY29sX2Ficyk7Cit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX2luY19jb2woJHN0cmluZykKKworCisgICAgUGFyYW1ldGVyczogJHN0cmluZywgYSBzdHJpbmcgaW4gQTEgZm9ybWF0CisKKyAgICBSZXR1cm5zOiAgICBJbmNyZW1lbnRlZCBzdHJpbmcgaW4gQTEgZm9ybWF0CisKK1RoaXMgZnVuY3Rpb25zIHRha2VzIGEgY2VsbCByZWZlcmVuY2Ugc3RyaW5nIGluIEExIG5vdGF0aW9uIGFuZCBpbmNyZW1lbnRzIHRoZSBjb2x1bW4uIFRoZSBmdW5jdGlvbiB3aWxsIGFsc28gaGFuZGxlIEV4Y2VsJ3MgYWJzb2x1dGUsIEM8JD4sIGNlbGwgbm90YXRpb246CisKKyAgICBteSAkc3RyID0geGxfaW5jX2NvbCgnQTEnICApOyAjIEIxCisgICAgbXkgJHN0ciA9IHhsX2luY19jb2woJ1oxJyAgKTsgIyBBQTEKKyAgICBteSAkc3RyID0geGxfaW5jX2NvbCgnJEIxJyApOyAjICRDMQorICAgIG15ICRzdHIgPSB4bF9pbmNfY29sKCckRCQ1Jyk7ICMgJEUkNQorCisKKz1jdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgeGxfaW5jX2NvbCgkc3RyaW5nKQorIworIyBJbmNyZW1lbnRzIHRoZSBjb2x1bW4gbnVtYmVyIG9mIGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uLgorIyBGb3IgZXhhbXBsZSBDMyB0byBEMworIworIyBSZXR1cm5zOiBhIGNlbGwgcmVmZXJlbmNlIHN0cmluZy4KKyMKK3N1YiB4bF9pbmNfY29sIHsKKworICAgIG15ICRjZWxsID0gc2hpZnQ7CisgICAgbXkgKCRyb3csICRjb2wsICRyb3dfYWJzLCAkY29sX2FicykgPSB4bF9jZWxsX3RvX3Jvd2NvbCgkY2VsbCk7CisKKyAgICByZXR1cm4geGxfcm93Y29sX3RvX2NlbGwoJHJvdywgKyskY29sLCAkcm93X2FicywgJGNvbF9hYnMpOworfQorCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKz1oZWFkMiB4bF9kZWNfY29sKCRzdHJpbmcpCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nLCBhIHN0cmluZyBpbiBBMSBmb3JtYXQKKworICAgIFJldHVybnM6ICAgIERlY3JlbWVudGVkIHN0cmluZyBpbiBBMSBmb3JtYXQKKworVGhpcyBmdW5jdGlvbnMgdGFrZXMgYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcgaW4gQTEgbm90YXRpb24gYW5kIGRlY3JlbWVudHMgdGhlIGNvbHVtbi4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBoYW5kbGUgRXhjZWwncyBhYnNvbHV0ZSwgQzwkPiwgY2VsbCBub3RhdGlvbjoKKworICAgIG15ICRzdHIgPSB4bF9kZWNfY29sKCdCMScgICk7ICMgQTEKKyAgICBteSAkc3RyID0geGxfZGVjX2NvbCgnQUExJyApOyAjIFoxCisgICAgbXkgJHN0ciA9IHhsX2RlY19jb2woJyRDMScgKTsgIyAkQjEKKyAgICBteSAkc3RyID0geGxfZGVjX2NvbCgnJEUkNScpOyAjICREJDUKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX2RlY19jb2woJHN0cmluZykKKyMKK3N1YiB4bF9kZWNfY29sIHsKKworICAgIG15ICRjZWxsID0gc2hpZnQ7CisgICAgbXkgKCRyb3csICRjb2wsICRyb3dfYWJzLCAkY29sX2FicykgPSB4bF9jZWxsX3RvX3Jvd2NvbCgkY2VsbCk7CisKKyAgICByZXR1cm4geGxfcm93Y29sX3RvX2NlbGwoJHJvdywgLS0kY29sLCAkcm93X2FicywgJGNvbF9hYnMpOworfQorCisKKworCis9aGVhZDEgVElNRSBBTkQgREFURSBGVU5DVElPTlMKKworCitEYXRlcyBhbmQgdGltZXMgaW4gRXhjZWwgYXJlIHJlcHJlc2VudGVkIGJ5IHJlYWwgbnVtYmVycywgZm9yIGV4YW1wbGUgIkphbiAxIDIwMDEgMTI6MzAgQU0iIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBudW1iZXIgMzY4OTIuNTIxLgorCitUaGUgaW50ZWdlciBwYXJ0IG9mIHRoZSBudW1iZXIgc3RvcmVzIHRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZXBvY2ggYW5kIHRoZSBmcmFjdGlvbmFsIHBhcnQgc3RvcmVzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBkYXkgaW4gc2Vjb25kcy4KKworVGhlIGVwb2NoIGNhbiBiZSBlaXRoZXIgMTkwMCBvciAxOTA0LiBFeGNlbCBmb3IgV2luZG93cyB1c2VzIDE5MDAgYW5kIEV4Y2VsIGZvciBNYWNpbnRvc2ggdXNlcyAxOTA0LiBUaGUgZXBvY2hzIGFyZToKKworICAgIDE5MDA6IDAgSmFudWFyeSAxOTAwIGkuZS4gMzEgRGVjZW1iZXIgMTg5OQorICAgIDE5MDQ6IDEgSmFudWFyeSAxOTA0CisKK0V4Y2VsIG9uIFdpbmRvd3MgYW5kIHRoZSBNYWNpbnRvc2ggd2lsbCBjb252ZXJ0IGF1dG9tYXRpY2FsbHkgYmV0d2VlbiBvbmUgc3lzdGVtIGFuZCB0aGUgb3RoZXIuIEJ5IGRlZmF1bHQgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdXNlcyB0aGUgMTkwMCBmb3JtYXQuIFRvIHVzZSB0aGUgMTkwNCBlcG9jaCB5b3UgbXVzdCB1c2UgdGhlIEM8c2V0XzE5MDQoKT4gd29ya2Jvb2sgbWV0aG9kLCBzZWUgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24uCisKK1RoZXJlIGFyZSB0d28gdGhpbmdzIHRvIG5vdGUgYWJvdXQgdGhlIDE5MDAgZGF0ZSBmb3JtYXQuIFRoZSBmaXJzdCBpcyB0aGF0IHRoZSBlcG9jaCBzdGFydHMgb24gMCBKYW51YXJ5IDE5MDAuIFRoZSBzZWNvbmQgaXMgdGhhdCB0aGUgeWVhciAxOTAwIGlzIGVycm9uZW91c2x5IGJ1dCBkZWxpYmVyYXRlbHkgdHJlYXRlZCBhcyBhIGxlYXAgeWVhci4gVGhlcmVmb3JlIHlvdSBtdXN0IGFkZCBhbiBleHRyYSBkYXkgdG8gZGF0ZXMgYWZ0ZXIgMjggRmVicnVhcnkgMTkwMC4gVGhlIGZ1bmN0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24gd2lsbCBkZWFsIHdpdGggdGhlc2UgaXNzdWVzIGF1dG9tYXRpY2FsbHkuIFRoZSByZWFzb24gZm9yIHRoaXMgYW5vbWFseSBpcyBleHBsYWluZWQgYXQgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9zdXBwb3J0L2tiL2FydGljbGVzL1ExODEvMy83MC5hc3AKKworTm90ZSwgYSBkYXRlIG9yIHRpbWUgaW4gRXhjZWwgaXMgbGlrZSBhbnkgb3RoZXIgbnVtYmVyLiBUbyBkaXNwbGF5IHRoZSBudW1iZXIgYXMgYSBkYXRlIHlvdSBtdXN0IGFwcGx5IGEgbnVtYmVyIGZvcm1hdCB0byBpdDogUmVmZXIgdG8gdGhlIEM8c2V0X251bV9mb3JtYXQoKT4gbWV0aG9kIGluIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uOgorCisgICAgJGRhdGUgPSB4bF9kYXRlX2xpc3QoMjAwMSwgMSwgMSwgMTIsIDMwKTsKKyAgICAkZm9ybWF0LT5zZXRfbnVtX2Zvcm1hdCgnbW1tIGQgeXl5eSBoaDptbSBBTS9QTScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICRkYXRlICwgJGZvcm1hdCk7ICMgSmFuIDEgMjAwMSAxMjozMCBBTQorCitUbyB1c2UgdGhlc2UgZnVuY3Rpb25zIHlvdSBtdXN0IGluc3RhbGwgdGhlIEM8RGF0ZTo6TWFuaXA+IGFuZCBDPERhdGU6OkNhbGM+IG1vZHVsZXMuIFNlZSBMPFJFUVVJUkVNRU5UUz4gYW5kIHRoZSBpbmRpdmlkdWFsIHJlcXVpcmVtZW50cyBvZiBlYWNoIGZ1bmN0aW9ucy4KKworU2VlIGFsc28gdGhlIERhdGVUaW1lOjpGb3JtYXQ6OkV4Y2VsIG1vZHVsZSxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9kaXN0PURhdGVUaW1lLUZvcm1hdC1FeGNlbCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBEYXRlVGltZSBwcm9qZWN0IGFuZCB3aGljaCBkZWFscyBzcGVjaWZpY2FsbHkgd2l0aCBjb252ZXJ0aW5nIGRhdGVzIGFuZCB0aW1lcyB0byBhbmQgZnJvbSBFeGNlbCdzIGZvcm1hdC4KKworCis9Y3V0CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfZGF0ZV9saXN0KCR5ZWFycywgJG1vbnRocywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkeWVhcnM6ICAgICAgICAgSW50ZWdlcgorICAgICAgICAgICAgICAgICRtb250aHM6ICAgICAgICBJbnRlZ2VyIFtvcHRpb25hbCwgZGVmYXVsdCBpcyAxXQorICAgICAgICAgICAgICAgICRkYXlzOiAgICAgICAgICBJbnRlZ2VyIFtvcHRpb25hbCwgZGVmYXVsdCBpcyAxXQorICAgICAgICAgICAgICAgICRob3VyczogICAgICAgICBJbnRlZ2VyIFtvcHRpb25hbCwgZGVmYXVsdCBpcyAwXQorICAgICAgICAgICAgICAgICRtaW51dGVzOiAgICAgICBJbnRlZ2VyIFtvcHRpb25hbCwgZGVmYXVsdCBpcyAwXQorICAgICAgICAgICAgICAgICRzZWNvbmRzOiAgICAgICBGbG9hdCAgIFtvcHRpb25hbCwgZGVmYXVsdCBpcyAwXQorCisgICAgUmV0dXJuczogICAgQSBudW1iZXIgdGhhdCByZXByZXNlbnRzIGFuIEV4Y2VsIGRhdGUKKyAgICAgICAgICAgICAgICBvciB1bmRlZiBmb3IgYW4gaW52YWxpZCBkYXRlLgorCisgICAgUmVxdWlyZXM6ICAgRGF0ZTo6Q2FsYworCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIGFycmF5IG9mIGRhdGEgaW50byBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgZGF0ZS4gQWxsIG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCBleGNlcHQgZm9yIEM8JHllYXJzPi4KKworICAgICRkYXRlMSA9IHhsX2RhdGVfbGlzdCgyMDAyLCAxLCAyKTsgICAgICAgICAgICAgICMgMiBKYW4gMjAwMgorICAgICRkYXRlMiA9IHhsX2RhdGVfbGlzdCgyMDAyLCAxLCAyLCAxMik7ICAgICAgICAgICMgMiBKYW4gMjAwMiAxMjowMCBwbQorICAgICRkYXRlMyA9IHhsX2RhdGVfbGlzdCgyMDAyLCAxLCAyLCAxMiwgMzApOyAgICAgICMgMiBKYW4gMjAwMiAxMjozMCBwbQorICAgICRkYXRlNCA9IHhsX2RhdGVfbGlzdCgyMDAyLCAxLCAyLCAxMiwgMzAsIDQ1KTsgICMgMiBKYW4gMjAwMiAxMjozMDo0NSBwbQorCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggZnVuY3Rpb25zIHRoYXQgcGFyc2UgZGF0ZSBhbmQgdGltZSBzdHJpbmdzLiBJbiBmYWN0IGl0IGlzIHVzZWQgaW4gbW9zdCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucy4KKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX2RhdGVfbGlzdCgkeWVhcnMsICRtb250aHMsICRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcykKKyMKK3N1YiB4bF9kYXRlX2xpc3QgeworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyBAXzsKKworICAgIG15ICR5ZWFycyAgID0gJF9bMF07CisgICAgbXkgJG1vbnRocyAgPSAkX1sxXSB8fCAxOworICAgIG15ICRkYXlzICAgID0gJF9bMl0gfHwgMTsKKyAgICBteSAkaG91cnMgICA9ICRfWzNdIHx8IDA7CisgICAgbXkgJG1pbnV0ZXMgPSAkX1s0XSB8fCAwOworICAgIG15ICRzZWNvbmRzID0gJF9bNV0gfHwgMDsKKworICAgIG15IEBkYXRlID0gKCR5ZWFycywgJG1vbnRocywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKTsKKyAgICBteSBAZXBvY2ggPSAoMTg5OSwgMTIsIDMxLCAwLCAwLCAwKTsKKworICAgICgkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpID0gRGVsdGFfREhNUyhAZXBvY2gsIEBkYXRlKTsKKworICAgIG15ICRkYXRlID0gJGRheXMgKyAoJGhvdXJzKjM2MDAgKyRtaW51dGVzKjYwICskc2Vjb25kcykvKDI0KjYwKjYwKTsKKworICAgICMgQWRkIGEgZGF5IGZvciBFeGNlbCdzIG1pc3NpbmcgbGVhcCBkYXkgaW4gMTkwMAorICAgICRkYXRlKysgaWYgKCRkYXRlID4gNTkpOworCisgICAgcmV0dXJuICRkYXRlOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX3BhcnNlX3RpbWUoJHN0cmluZykKKworCisgICAgUGFyYW1ldGVyczogJHN0cmluZywgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgdGltZQorCisgICAgUmV0dXJuczogICAgQSBudW1iZXIgdGhhdCByZXByZXNlbnRzIGFuIEV4Y2VsIHRpbWUKKyAgICAgICAgICAgICAgICBvciB1bmRlZiBmb3IgYW4gaW52YWxpZCB0aW1lLgorCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgdGltZSBzdHJpbmcgaW50byBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgdGltZS4gVGhlIGZvbGxvd2luZyB0aW1lIGZvcm1hdHMgYXJlIHZhbGlkOgorCisgICAgaGg6bW0gICAgICAgW0FNfFBNXQorICAgIGhoOm1tICAgICAgIFtBTXxQTV0KKyAgICBoaDptbTpzcyAgICBbQU18UE1dCisgICAgaGg6bW06c3Muc3MgW0FNfFBNXQorCisKK1RoZSBtZXJpZGlhbiwgQU0gb3IgUE0sIGlzIG9wdGlvbmFsIGFuZCBjYXNlIGluc2Vuc2l0aXZlLiBBIDI0IGhvdXIgdGltZSBpcyBhc3N1bWVkIGlmIHRoZSBtZXJpZGlhbiBpcyBvbWl0dGVkCisKKyAgICAkdGltZTEgPSB4bF9wYXJzZV90aW1lKCcxMjoxOCcpOworICAgICR0aW1lMiA9IHhsX3BhcnNlX3RpbWUoJzEyOjE4OjE0Jyk7CisgICAgJHRpbWUzID0geGxfcGFyc2VfdGltZSgnMTI6MTg6MTQgQU0nKTsKKyAgICAkdGltZTQgPSB4bF9wYXJzZV90aW1lKCcxOjE4OjE0IEFNJyk7CisKK1RpbWUgaW4gRXhjZWwgaXMgZXhwcmVzc2VkIGFzIGEgZnJhY3Rpb24gb2YgdGhlIGRheSBpbiBzZWNvbmRzLiBUaGVyZWZvcmUgeW91IGNhbiBjYWxjdWxhdGUgYW4gRXhjZWwgdGltZSBhcyBmb2xsb3dzOgorCisgICAgJHRpbWUgPSAoJGhvdXJzKjM2MDAgKyRtaW51dGVzKjYwICskc2Vjb25kcykvKDI0KjYwKjYwKTsKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX3BhcnNlX3RpbWUoJHN0cmluZykKKyMKK3N1YiB4bF9wYXJzZV90aW1lIHsKKworICAgIG15ICR0aW1lID0gc2hpZnQ7CisKKyAgICBpZiAoJHRpbWUgPX4gLyhcZHsxLDJ9KTooXGRcZCk6PygoPzpcZFxkKSg/OlwuXGQrKT8pPyg/OlxzKyk/KGFtfHBtKT8vaSkgeworCisgICAgICAgIG15ICRob3VycyAgICAgICA9ICQxOworICAgICAgICBteSAkbWludXRlcyAgICAgPSAkMjsKKyAgICAgICAgbXkgJHNlY29uZHMgICAgID0gJDMgICAgIHx8IDA7CisgICAgICAgIG15ICRtZXJpZGlhbiAgICA9IGxjKCQ0KSB8fCAnJzsKKworICAgICAgICAjIE5vcm1hbGlzZSBtaWRuaWdodCBhbmQgbWlkZGF5CisgICAgICAgICRob3VycyA9IDAgaWYgKCRob3VycyA9PSAxMiAmJiAkbWVyaWRpYW4gbmUgJycpOworCisgICAgICAgICMgQWRkIDEyIGhvdXJzIHRvIHRoZSBwbSB0aW1lcy4gTm90ZTogMTIuMDAgcG0gaGFzIGJlZW4gc2V0IHRvIDAuMDAuCisgICAgICAgICRob3VycyArPSAxMiBpZiAkbWVyaWRpYW4gZXEgJ3BtJzsKKworICAgICAgICAjIENhbGN1bGF0ZSB0aGUgdGltZSBhcyBhIGZyYWN0aW9uIG9mIDI0IGhvdXJzIGluIHNlY29uZHMKKyAgICAgICAgcmV0dXJuICgkaG91cnMqMzYwMCArJG1pbnV0ZXMqNjAgKyRzZWNvbmRzKS8oMjQqNjAqNjApOworCisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gdW5kZWY7ICMgTm90IGEgdmFsaWQgdGltZSBzdHJpbmcKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfcGFyc2VfZGF0ZSgkc3RyaW5nKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nLCBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRlIGFuZCB0aW1lCisKKyAgICBSZXR1cm5zOiAgICBBIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgZGF0ZQorICAgICAgICAgICAgICAgIG9yIHVuZGVmIGZvciBhbiBpbnZhbGlkIGRhdGUuCisKKyAgICBSZXF1aXJlczogICBEYXRlOjpNYW5pcCBhbmQgRGF0ZTo6Q2FsYworCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgaW50byBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgZGF0ZS4KKworVGhlIHBhcnNpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBDPFBhcnNlRGF0ZSgpPiBmdW5jdGlvbiBvZiB0aGUgRGF0ZTo6TWFuaXAgbW9kdWxlLiBSZWZlciB0byB0aGUgRGF0ZTo6TWFuaXAgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0ZSBhbmQgdGltZSBmb3JtYXRzIHRoYXQgY2FuIGJlIHBhcnNlZC4gSW4gb3JkZXIgdG8gdXNlIHRoaXMgZnVuY3Rpb24geW91IHdpbGwgcHJvYmFibHkgaGF2ZSB0byBpbml0aWFsaXNlIHNvbWUgRGF0ZTo6TWFuaXAgdmFyaWFibGVzIHZpYSB0aGUgQzx4bF9wYXJzZV9kYXRlX2luaXQoKT4gZnVuY3Rpb24sIHNlZSBiZWxvdy4KKworICAgIHhsX3BhcnNlX2RhdGVfaW5pdCgiVFo9R01UIiwiRGF0ZUZvcm1hdD1ub24tVVMiKTsKKworICAgICRkYXRlMSA9IHhsX3BhcnNlX2RhdGUoIjExLzcvOTciKTsKKyAgICAkZGF0ZTIgPSB4bF9wYXJzZV9kYXRlKCJGcmlkYXkgMTEgSnVseSAxOTk3Iik7CisgICAgJGRhdGUzID0geGxfcGFyc2VfZGF0ZSgiMTA6MzAgQU0gRnJpZGF5IDExIEp1bHkgMTk5NyIpOworICAgICRkYXRlNCA9IHhsX3BhcnNlX2RhdGUoIlRvZGF5Iik7CisgICAgJGRhdGU1ID0geGxfcGFyc2VfZGF0ZSgiWWVzdGVyZGF5Iik7CisKK05vdGUsIGlmIHlvdSBwYXJzZSBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSB0aW1lIGJ1dCBub3QgYSBkYXRlIHRoaXMgZnVuY3Rpb24gd2lsbCBhZGQgdGhlIGN1cnJlbnQgZGF0ZS4gSWYgeW91IHdhbnQgdGhlIHRpbWUgd2l0aG91dCB0aGUgZGF0ZSB5b3UgY2FuIGRvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAkdGltZSAgPSB4bF9wYXJzZV9kYXRlKCIxMDozMCBBTSIpOworICAgICR0aW1lIC09IGludCgkdGltZSk7CisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9wYXJzZV9kYXRlKCRzdHJpbmcpCisjCitzdWIgeGxfcGFyc2VfZGF0ZSB7CisKKyAgICBteSAkZGF0ZSA9IFBhcnNlRGF0ZSgkX1swXSk7CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzIGRlZmluZWQgJGRhdGU7CisKKyAgICAjIFVucGFjayB0aGUgcmV0dXJuIHZhbHVlIGZyb20gUGFyc2VEYXRlKCkKKyAgICBteSAgICAoJHllYXJzLCAkbW9udGhzLCAkZGF5cywgJGhvdXJzLCB1bmRlZiwgJG1pbnV0ZXMsIHVuZGVmLCAkc2Vjb25kcykgPQorICAgIHVucGFjaygiQTQgICAgIEEyICAgICAgIEEyICAgICBBMiAgICAgIEMgICAgICBBMiAgICAgICAgQyAgICAgIEEyIiwgJGRhdGUpOworCisgICAgIyBDb252ZXJ0IHRvIEV4Y2VsIGRhdGUKKyAgICByZXR1cm4geGxfZGF0ZV9saXN0KCR5ZWFycywgJG1vbnRocywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKTsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfcGFyc2VfZGF0ZV9pbml0KCJ2YXJpYWJsZT12YWx1ZSIsIC4uLikKKworCisgICAgUGFyYW1ldGVyczogQSBsaXN0IG9mIERhdGU6Ok1hbmlwIHZhcmlhYmxlIHN0cmluZ3MKKworICAgIFJldHVybnM6ICAgIEEgbGlzdCBvZiBhbGwgdGhlIERhdGU6Ok1hbmlwIHN0cmluZ3MKKworICAgIFJlcXVpcmVzOiAgIERhdGU6Ok1hbmlwCisKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXNlIHZhcmlhYmxlcyByZXF1aXJlZCBieSB0aGUgRGF0ZTo6TWFuaXAgbW9kdWxlLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgY2FsbGluZyBDPHhsX3BhcnNlX2RhdGUoKT4uIEl0IG5lZWQgb25seSBiZSBjYWxsZWQgb25jZS4KKworVGhpcyBmdW5jdGlvbiBpcyBhIHRoaW4gd3JhcHBlciBmb3IgdGhlIEM8RGF0ZTo6TWFuaXA6OkRhdGVfSW5pdCgpPiBmdW5jdGlvbi4gWW91IGNhbiB1c2UgQzxEYXRlX0luaXQoKT4gIGRpcmVjdGx5IGlmIHlvdSB3aXNoLiBSZWZlciB0byB0aGUgRGF0ZTo6TWFuaXAgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKworICAgIHhsX3BhcnNlX2RhdGVfaW5pdCgiVFo9TVNUIiwiRGF0ZUZvcm1hdD1VUyIpOworICAgICRkYXRlMSA9IHhsX3BhcnNlX2RhdGUoIjExLzcvOTciKTsgICMgTm92ZW1iZXIgN3RoIDE5OTcKKworICAgIHhsX3BhcnNlX2RhdGVfaW5pdCgiVFo9R01UIiwiRGF0ZUZvcm1hdD1ub24tVVMiKTsKKyAgICAkZGF0ZTEgPSB4bF9wYXJzZV9kYXRlKCIxMS83Lzk3Iik7ICAjIEp1bHkgMTF0aCAxOTk3CisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9wYXJzZV9kYXRlX2luaXQoInZhcmlhYmxlPXZhbHVlIiwgLi4uKQorIworc3ViIHhsX3BhcnNlX2RhdGVfaW5pdCB7CisKKyAgICBEYXRlX0luaXQoQF8pOyAjIEhvdyBsYXp5IGlzIHRoYXQuCit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX2RlY29kZV9kYXRlX0VVKCRzdHJpbmcpCisKKworICAgIFBhcmFtZXRlcnM6ICRzdHJpbmcsIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBhIGRhdGUgYW5kIHRpbWUKKworICAgIFJldHVybnM6ICAgIEEgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyBhbiBFeGNlbCBkYXRlCisgICAgICAgICAgICAgICAgb3IgdW5kZWYgZm9yIGFuIGludmFsaWQgZGF0ZS4KKworICAgIFJlcXVpcmVzOiAgIERhdGU6OkNhbGMKKworVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIGRhdGUgYW5kIHRpbWUgc3RyaW5nIGludG8gYSBudW1iZXIgdGhhdCByZXByZXNlbnRzIGFuIEV4Y2VsIGRhdGUuCisKK1RoZSBkYXRlIHBhcnNpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBDPERlY29kZV9EYXRlX0VVKCk+IGZ1bmN0aW9uIG9mIHRoZSBEYXRlOjpDYWxjIG1vZHVsZS4gUmVmZXIgdG8gdGhlIERhdGU6OkNhbGMgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGUgZm9ybWF0cyB0aGF0IGNhbiBiZSBwYXJzZWQuIEFsc28gbm90ZSB0aGUgZm9sbG93aW5nIGZyb20gdGhlIERhdGU6OkNhbGMgZG9jdW1lbnRhdGlvbjoKKworIklmIHRoZSB5ZWFyIGlzIGdpdmVuIGFzIG9uZSBvciB0d28gZGlnaXRzIG9ubHkgKGkuZS4sIGlmIHRoZSB5ZWFyIGlzIGxlc3MgdGhhbiAxMDApLCBpdCBpcyBtYXBwZWQgdG8gdGhlIHdpbmRvdyAxOTcwIC0yMDY5IGFzIGZvbGxvd3MiOgorCisgICAgIDAgRTxsdD49ICR5ZWFyIEU8bHQ+ICA3MCAgPT0+ICAkeWVhciArPSAyMDAwOworICAgIDcwIEU8bHQ+PSAkeWVhciBFPGx0PiAxMDAgID09PiAgJHllYXIgKz0gMTkwMDsKKworVGhlIHRpbWUgcG9ydGlvbiBvZiB0aGUgc3RyaW5nIGlzIHBhcnNlZCB1c2luZyB0aGUgQzx4bF9wYXJzZV90aW1lKCk+IGZ1bmN0aW9uIGRlc2NyaWJlZCBhYm92ZS4KKworTm90ZTogdGhlIEVVIGluIHRoZSBmdW5jdGlvbiBuYW1lIG1lYW5zIHRoYXQgYSBFdXJvcGVhbiBkYXRlIGZvcm1hdCBpcyBhc3N1bWVkIGlmIGl0IGlzIG5vdCBjbGVhciBmcm9tIHRoZSBzdHJpbmcuIFNlZSB0aGUgZmlyc3QgZXhhbXBsZSBiZWxvdy4KKworICAgICRkYXRlMSA9IHhsX2RlY29kZV9kYXRlX0VVKCIxMS83Lzk3Iik7ICMxMSBKdWx5IDE5OTcKKyAgICAkZGF0ZTIgPSB4bF9kZWNvZGVfZGF0ZV9FVSgiU2F0IDEyIFNlcHQgMTk5OCIpOworICAgICRkYXRlMyA9IHhsX2RlY29kZV9kYXRlX0VVKCI0OjMwIEFNIFNhdCAxMiBTZXB0IDE5OTgiKTsKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX2RlY29kZV9kYXRlX0VVKCRzdHJpbmcpCisjCitzdWIgeGxfZGVjb2RlX2RhdGVfRVUgeworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyBAXzsKKworICAgIG15ICRkYXRlID0gc2hpZnQ7CisgICAgbXkgQGRhdGU7CisgICAgbXkgJHRpbWUgPSAwOworCisgICAgIyBSZW1vdmUgYW5kIGRlY29kZSB0aGUgdGltZSBwb3J0aW9uIG9mIHRoZSBzdHJpbmcKKyAgICBpZiAoJGRhdGUgPX4gcy8oXGR7MSwyfTpcZFxkOj8oXGRcZChcLlxkKyk/KT8oXHMrKT8oYW18cG0pPykvL2kpIHsKKyAgICAgICAgJHRpbWUgPSB4bF9wYXJzZV90aW1lKCQxKTsKKyAgICAgICAgcmV0dXJuIHVuZGVmIHVubGVzcyBkZWZpbmVkICR0aW1lOworICAgIH0KKworICAgICMgUmV0dXJuIGlmIHRoZSBzdHJpbmcgaXMgbm93IGJsYW5rLCBpLmUuIGl0IGNvbnRhaW5lZCBhIHRpbWUgb25seS4KKyAgICByZXR1cm4gJHRpbWUgaWYgJGRhdGUgPX4gL15ccyokLzsKKworICAgICMgRGVjb2RlIHRoZSBkYXRlIHBvcnRpb24gb2YgdGhlIHN0cmluZworICAgIEBkYXRlID0gRGVjb2RlX0RhdGVfRVUoJGRhdGUpOworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgQGRhdGU7CisKKyAgICByZXR1cm4geGxfZGF0ZV9saXN0KEBkYXRlKSArICR0aW1lOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfZGVjb2RlX2RhdGVfVVMoJHN0cmluZykKKworCisgICAgUGFyYW1ldGVyczogJHN0cmluZywgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgZGF0ZSBhbmQgdGltZQorCisgICAgUmV0dXJuczogICAgQSBudW1iZXIgdGhhdCByZXByZXNlbnRzIGFuIEV4Y2VsIGRhdGUKKyAgICAgICAgICAgICAgICBvciB1bmRlZiBmb3IgYW4gaW52YWxpZCBkYXRlLgorCisgICAgUmVxdWlyZXM6ICAgRGF0ZTo6Q2FsYworCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgaW50byBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgZGF0ZS4KKworVGhlIGRhdGUgcGFyc2luZyBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIEM8RGVjb2RlX0RhdGVfVVMoKT4gZnVuY3Rpb24gb2YgdGhlIERhdGU6OkNhbGMgbW9kdWxlLiBSZWZlciB0byB0aGUgRGF0ZTo6Q2FsYyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0ZSBmb3JtYXRzIHRoYXQgY2FuIGJlIHBhcnNlZC4gQWxzbyBub3RlIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgRGF0ZTo6Q2FsYyBkb2N1bWVudGF0aW9uOgorCisiSWYgdGhlIHllYXIgaXMgZ2l2ZW4gYXMgb25lIG9yIHR3byBkaWdpdHMgb25seSAoaS5lLiwgaWYgdGhlIHllYXIgaXMgbGVzcyB0aGFuIDEwMCksIGl0IGlzIG1hcHBlZCB0byB0aGUgd2luZG93IDE5NzAgLTIwNjkgYXMgZm9sbG93cyI6CisKKyAgICAgMCA8PSAkeWVhciA8ICA3MCAgPT0+ICAkeWVhciArPSAyMDAwOworICAgIDcwIDw9ICR5ZWFyIDwgMTAwICA9PT4gICR5ZWFyICs9IDE5MDA7CisKK1RoZSB0aW1lIHBvcnRpb24gb2YgdGhlIHN0cmluZyBpcyBwYXJzZWQgdXNpbmcgdGhlIEM8eGxfcGFyc2VfdGltZSgpPiBmdW5jdGlvbiBkZXNjcmliZWQgYWJvdmUuCisKK05vdGU6IHRoZSBVUyBpbiB0aGUgZnVuY3Rpb24gbmFtZSBtZWFucyB0aGF0IGFuIEFtZXJpY2FuIGRhdGUgZm9ybWF0IGlzIGFzc3VtZWQgaWYgaXQgaXMgbm90IGNsZWFyIGZyb20gdGhlIHN0cmluZy4gU2VlIHRoZSBmaXJzdCBleGFtcGxlIGJlbG93LgorCisgICAgJGRhdGUxID0geGxfZGVjb2RlX2RhdGVfVVMoIjExLzcvOTciKTsgIyA3IE5vdmVtYmVyIDE5OTcKKyAgICAkZGF0ZTIgPSB4bF9kZWNvZGVfZGF0ZV9VUygiMTIgU2VwdCBTYXR1cmRheSAxOTk4Iik7CisgICAgJGRhdGUzID0geGxfZGVjb2RlX2RhdGVfVVMoIjQ6MzAgQU0gMTIgU2VwdCBTYXQgMTk5OCIpOworCisKKz1jdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgeGxfZGVjb2RlX2RhdGVfVVMoJHN0cmluZykKKyMKK3N1YiB4bF9kZWNvZGVfZGF0ZV9VUyB7CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzIEBfOworCisgICAgbXkgJGRhdGUgPSBzaGlmdDsKKyAgICBteSBAZGF0ZTsKKyAgICBteSAkdGltZSA9IDA7CisKKyAgICAjIFJlbW92ZSBhbmQgZGVjb2RlIHRoZSB0aW1lIHBvcnRpb24gb2YgdGhlIHN0cmluZworICAgIGlmICgkZGF0ZSA9fiBzLyhcZHsxLDJ9OlxkXGQ6PyhcZFxkKFwuXGQrKT8pPyhccyspPyhhbXxwbSk/KS8vaSkgeworICAgICAgICAkdGltZSA9IHhsX3BhcnNlX3RpbWUoJDEpOworICAgICAgICByZXR1cm4gdW5kZWYgdW5sZXNzIGRlZmluZWQgJHRpbWU7CisgICAgfQorCisgICAgIyBSZXR1cm4gaWYgdGhlIHN0cmluZyBpcyBub3cgYmxhbmssIGkuZS4gaXQgY29udGFpbmVkIGEgdGltZSBvbmx5LgorICAgIHJldHVybiAkdGltZSBpZiAkZGF0ZSA9fiAvXlxzKiQvOworCisgICAgIyBEZWNvZGUgdGhlIGRhdGUgcG9ydGlvbiBvZiB0aGUgc3RyaW5nCisgICAgQGRhdGUgPSBEZWNvZGVfRGF0ZV9VUygkZGF0ZSk7CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyBAZGF0ZTsKKworICAgIHJldHVybiB4bF9kYXRlX2xpc3QoQGRhdGUpICsgJHRpbWU7Cit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX2RhdGVfMTkwNCgkZGF0ZSkKKworCisgICAgUGFyYW1ldGVyczogJGRhdGUsIGFuIEV4Y2VsIGRhdGUgd2l0aCBhIDE5MDAgZXBvY2gKKworICAgIFJldHVybnM6ICAgIGFuIEV4Y2VsIGRhdGUgd2l0aCBhIDE5MDQgZXBvY2ggb3IgemVybyBpZgorICAgICAgICAgICAgICAgIHRoZSAkZGF0ZSBpcyBiZWZvcmUgMTkwNAorCisKK1RoaXMgZnVuY3Rpb24gY29udmVydHMgYW4gRXhjZWwgZGF0ZSBiYXNlZCBvbiB0aGUgMTkwMCBlcG9jaCBpbnRvIGEgZGF0ZSBiYXNlZCBvbiB0aGUgMTkwNCBlcG9jaC4KKworCisgICAgJGRhdGUxID0geGxfZGF0ZV9saXN0KDIwMDIsIDEsIDEzKTsgIyAxMyBKYW4gMjAwMiwgMTkwMCBlcG9jaAorICAgICRkYXRlMiA9IHhsX2RhdGVfMTkwNCgkZGF0ZTEpOyAgICAgICMgMTMgSmFuIDIwMDIsIDE5MDQgZXBvY2gKKworCitTZWUgYWxzbyB0aGUgQzxzZXRfMTkwNCgpPiB3b3JrYm9vayBtZXRob2QgaW4gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24uCisKKz1jdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgeGxfZGVjb2RlX2RhdGVfVVMoJHN0cmluZykKKyMKK3N1YiB4bF9kYXRlXzE5MDQgeworCisgICAgbXkgJGRhdGUgPSAkX1swXSB8fCAwOworCisgICAgaWYgKCRkYXRlIDwgMTQ2MikgeworICAgICAgICAjIGJlZm9yZSAxOTA0CisgICAgICAgICRkYXRlID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRkYXRlIC09IDE0NjI7CisgICAgfQorCisgICAgcmV0dXJuICRkYXRlOworfQorCisKKworCisKKz1oZWFkMSBSRVFVSVJFTUVOVFMKKworVGhlIGRhdGUgYW5kIHRpbWUgZnVuY3Rpb25zIHJlcXVpcmUgZnVuY3Rpb25zIGZyb20gdGhlIEM8RGF0ZTo6TWFuaXA+IGFuZCBDPERhdGU6OkNhbGM+IG1vZHVsZXMuIFRoZSByZXF1aXJlZCBmdW5jdGlvbnMgYXJlICJhdXRvdXNlZCIgZnJvbSB0aGVzZSBtb2R1bGVzIHNvIHRoYXQgeW91IGRvIG5vdCBoYXZlIHRvIGluc3RhbGwgdGhlbSB1bmxlc3MgeW91IHdpc2ggdG8gdXNlIHRoZSBkYXRlIGFuZCB0aW1lIHJvdXRpbmVzLiBUaGVyZWZvcmUgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSByb3cgYW5kIGNvbHVtbiBmdW5jdGlvbnMgd2l0aG91dCBoYXZpbmcgQzxEYXRlOjpNYW5pcD4gYW5kIEM8RGF0ZTo6Q2FsYz4gaW5zdGFsbGVkLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCAiYXV0b3VzaW5nIiByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgQzxhdXRvdXNlPiBwcmFnbWEuCisKKworCis9aGVhZDEgQlVHUworCitXaGVuIHVzaW5nIHRoZSBhdXRvdXNlZCBmdW5jdGlvbnMgZnJvbSBDPERhdGU6Ok1hbmlwPiBhbmQgQzxEYXRlOjpDYWxjPiBvbiBQZXJsIDUuNi4wIHdpdGggQzwtdz4geW91IHdpbGwgZ2V0IGEgd2FybmluZyBsaWtlIHRoaXM6CisKKyAgICAiU3Vicm91dGluZSB4eHggcmVkZWZpbmVkIC4uLiIKKworVGhlIGN1cnJlbnQgd29ya2Fyb3VuZCBmb3IgdGhpcyBpcyB0byBwdXQgQzx1c2Ugd2FybmluZ3M7PiBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgeW91ciBwcm9ncmFtLgorCisKKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCisKKworCis9aGVhZDEgQ09QWVJJR0hUCisKK6kgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKKz1jdXQKKworCisKKzE7CisKKworX19FTkRfXworCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1dvcmtib29rLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Xb3JrYm9vay5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc2YmIyCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Xb3JrYm9vay5wbQpAQCAtMCwwICsxLDM2MzggQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6Oldvcmtib29rOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFdvcmtib29rIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIFdvcmtib29rcy4KKyMKKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKK3VzZSBFeHBvcnRlcjsKK3VzZSBzdHJpY3Q7Cit1c2UgQ2FycDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlcjsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6T0xFd3JpdGVyOwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3Jrc2hlZXQ7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OlByb3BlcnRpZXMgJzpwcm9wZXJ0eV9zZXRzJzsKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkJJRkZ3cml0ZXIgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIyBDb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIG5ldyBXb3JrYm9vayBvYmplY3QgZnJvbSBhIEJJRkZ3cml0ZXIgb2JqZWN0LgorIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgICAgICAgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlci0+bmV3KCk7CisgICAgbXkgJGJ5dGVfb3JkZXIgID0gJHNlbGYtPntfYnl0ZV9vcmRlcn07CisgICAgbXkgJHBhcnNlciAgICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm11bGEtPm5ldygkYnl0ZV9vcmRlcik7CisKKyAgICAkc2VsZi0+e19maWxlbmFtZX0gICAgICAgICAgICAgID0gJF9bMF0gfHwgJyc7CisgICAgJHNlbGYtPntfcGFyc2VyfSAgICAgICAgICAgICAgICA9ICRwYXJzZXI7CisgICAgJHNlbGYtPntfdGVtcGRpcn0gICAgICAgICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57XzE5MDR9ICAgICAgICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2FjdGl2ZXNoZWV0fSAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2ZpcnN0c2hlZXR9ICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X3NlbGVjdGVkfSAgICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X3hmX2luZGV4fSAgICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2ZpbGVjbG9zZWR9ICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2JpZmZzaXplfSAgICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X3NoZWV0X25hbWV9ICAgICAgICAgICAgID0gJ1NoZWV0JzsKKyAgICAkc2VsZi0+e19jaGFydF9uYW1lfSAgICAgICAgICAgICA9ICdDaGFydCc7CisgICAgJHNlbGYtPntfc2hlZXRfY291bnR9ICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfY2hhcnRfY291bnR9ICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfdXJsX2Zvcm1hdH0gICAgICAgICAgICA9ICcnOworICAgICRzZWxmLT57X2NvZGVwYWdlfSAgICAgICAgICAgICAgPSAweDA0RTQ7CisgICAgJHNlbGYtPntfY291bnRyeX0gICAgICAgICAgICAgICA9IDE7CisgICAgJHNlbGYtPntfd29ya3NoZWV0c30gICAgICAgICAgICA9IFtdOworICAgICRzZWxmLT57X3NoZWV0bmFtZXN9ICAgICAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19mb3JtYXRzfSAgICAgICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfcGFsZXR0ZX0gICAgICAgICAgICAgICA9IFtdOworCisgICAgJHNlbGYtPntfdXNpbmdfdG1wZmlsZX0gICAgICAgICA9IDE7CisgICAgJHNlbGYtPntfZmlsZWhhbmRsZX0gICAgICAgICAgICA9ICIiOworICAgICRzZWxmLT57X3RlbXBfZmlsZX0gICAgICAgICAgICAgPSAiIjsKKyAgICAkc2VsZi0+e19pbnRlcm5hbF9maH0gICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19maF9vdXR9ICAgICAgICAgICAgICAgID0gIiI7CisKKyAgICAkc2VsZi0+e19zdHJfdG90YWx9ICAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19zdHJfdW5pcXVlfSAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19zdHJfdGFibGV9ICAgICAgICAgICAgID0ge307CisgICAgJHNlbGYtPntfc3RyX2FycmF5fSAgICAgICAgICAgICA9IFtdOworICAgICRzZWxmLT57X3N0cl9ibG9ja19zaXplc30gICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19leHRzc3Rfb2Zmc2V0c30gICAgICAgID0gW107CisgICAgJHNlbGYtPntfZXh0c3N0X2J1Y2tldHN9ICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfZXh0c3N0X2J1Y2tldF9zaXplfSAgICA9IDA7CisKKyAgICAkc2VsZi0+e19leHRfcmVmX2NvdW50fSAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19leHRfcmVmc30gICAgICAgICAgICAgID0ge307CisKKyAgICAkc2VsZi0+e19tc29fY2x1c3RlcnN9ICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfbXNvX3NpemV9ICAgICAgICAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19oaWRlb2JqfSAgICAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19jb21wYXRpYmlsaXR5fSAgICAgICAgID0gMDsKKworICAgICRzZWxmLT57X2FkZF9kb2NfcHJvcGVydGllc30gICAgPSAwOworICAgICRzZWxmLT57X2xvY2FsdGltZX0gICAgICAgICAgICAgPSBbbG9jYWx0aW1lKCldOworCisgICAgJHNlbGYtPntfZGVmaW5lZF9uYW1lc30gICAgICAgICA9IFtdOworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKworCisgICAgIyBBZGQgdGhlIGluLWJ1aWx0IHN0eWxlIGZvcm1hdHMgYW5kIHRoZSBkZWZhdWx0IGNlbGwgZm9ybWF0LgorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjICAwIE5vcm1hbAorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjICAxIFJvd0xldmVsIDEKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAgMiBSb3dMZXZlbCAyCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgIDMgUm93TGV2ZWwgMworICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjICA0IFJvd0xldmVsIDQKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAgNSBSb3dMZXZlbCA1CisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgIDYgUm93TGV2ZWwgNgorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjICA3IFJvd0xldmVsIDcKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAgOCBDb2xMZXZlbCAxCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgIDkgQ29sTGV2ZWwgMgorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjIDEwIENvbExldmVsIDMKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAxMSBDb2xMZXZlbCA0CisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgMTIgQ29sTGV2ZWwgNQorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjIDEzIENvbExldmVsIDYKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAxNCBDb2xMZXZlbCA3CisgICAgJHNlbGYtPmFkZF9mb3JtYXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMTUgQ2VsbCBYRgorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSwgbnVtX2Zvcm1hdCA9PiAweDJCKTsgICAjIDE2IENvbW1hCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxLCBudW1fZm9ybWF0ID0+IDB4MjkpOyAgICMgMTcgQ29tbWFbMF0KKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEsIG51bV9mb3JtYXQgPT4gMHgyQyk7ICAgIyAxOCBDdXJyZW5jeQorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSwgbnVtX2Zvcm1hdCA9PiAweDJBKTsgICAjIDE5IEN1cnJlbmN5WzBdCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxLCBudW1fZm9ybWF0ID0+IDB4MDkpOyAgICMgMjAgUGVyY2VudAorCisKKyAgICAjIEFkZCB0aGUgZGVmYXVsdCBmb3JtYXQgZm9yIGh5cGVybGlua3MKKyAgICAkc2VsZi0+e191cmxfZm9ybWF0fSA9ICRzZWxmLT5hZGRfZm9ybWF0KGNvbG9yID0+ICdibHVlJywgdW5kZXJsaW5lID0+IDEpOworCisKKyAgICAjIENoZWNrIGZvciBhIGZpbGVuYW1lIHVubGVzcyBpdCBpcyBhbiBleGlzdGluZyBmaWxlaGFuZGxlCisgICAgaWYgKG5vdCByZWYgJHNlbGYtPntfZmlsZW5hbWV9IGFuZCAkc2VsZi0+e19maWxlbmFtZX0gZXEgJycpIHsKKyAgICAgICAgY2FycCAnRmlsZW5hbWUgcmVxdWlyZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygpJzsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKworCisgICAgIyBDb252ZXJ0IHRoZSBmaWxlbmFtZSB0byBhIGZpbGVoYW5kbGUgdG8gcGFzcyB0byB0aGUgT0xFIHdyaXRlciB3aGVuIHRoZQorICAgICMgZmlsZSBpcyBjbG9zZWQuIElmIHRoZSBmaWxlbmFtZSBpcyBhIHJlZmVyZW5jZSBpdCBpcyBhc3N1bWVkIHRoYXQgaXQgaXMKKyAgICAjIGEgdmFsaWQgZmlsZWhhbmRsZS4KKyAgICAjCisgICAgaWYgKG5vdCByZWYgJHNlbGYtPntfZmlsZW5hbWV9KSB7CisKKyAgICAgICAgbXkgJGZoID0gRmlsZUhhbmRsZS0+bmV3KCc+Jy4gJHNlbGYtPntfZmlsZW5hbWV9KTsKKworICAgICAgICBpZiAobm90IGRlZmluZWQgJGZoKSB7CisgICAgICAgICAgICBjYXJwICJDYW4ndCBvcGVuICIgLgorICAgICAgICAgICAgICAgICAgJHNlbGYtPntfZmlsZW5hbWV9IC4KKyAgICAgICAgICAgICAgICAgICIuIEl0IG1heSBiZSBpbiB1c2Ugb3IgcHJvdGVjdGVkIjsKKyAgICAgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICAgICAgfQorCisgICAgICAgICMgYmlubW9kZSBmaWxlIHdoZXRoZXIgcGxhdGZvcm0gcmVxdWlyZXMgaXQgb3Igbm90CisgICAgICAgIGJpbm1vZGUoJGZoKTsKKyAgICAgICAgJHNlbGYtPntfaW50ZXJuYWxfZmh9ID0gMTsKKyAgICAgICAgJHNlbGYtPntfZmhfb3V0fSAgICAgID0gJGZoOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfaW50ZXJuYWxfZmh9ID0gMDsKKyAgICAgICAgJHNlbGYtPntfZmhfb3V0fSAgICAgID0gJHNlbGYtPntfZmlsZW5hbWV9OworCisgICAgfQorCisKKyAgICAjIFNldCBjb2xvdXIgcGFsZXR0ZS4KKyAgICAkc2VsZi0+c2V0X3BhbGV0dGVfeGw5NygpOworCisgICAgIyBMb2FkIEVuY29kZSBpZiB3ZSBjYW4uCisgICAgcmVxdWlyZSBFbmNvZGUgaWYgJF0gPj0gNS4wMDg7CisKKyAgICAkc2VsZi0+X2luaXRpYWxpemUoKTsKKyAgICAkc2VsZi0+X2dldF9jaGVja3N1bV9tZXRob2QoKTsKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfaW5pdGlhbGl6ZSgpCisjCisjIE9wZW4gYSB0bXAgZmlsZSB0byBzdG9yZSB0aGUgbWFqb3JpdHkgb2YgdGhlIFdvcmtzaGVldCBkYXRhLiBJZiB0aGlzIGZhaWxzLAorIyBmb3IgZXhhbXBsZSBkdWUgdG8gd3JpdGUgcGVybWlzc2lvbnMsIHN0b3JlIHRoZSBkYXRhIGluIG1lbW9yeS4gVGhpcyBjYW4gYmUKKyMgc2xvdyBmb3IgbGFyZ2UgZmlsZXMuCisjCisjIFRPRE86IE1vdmUgdGhpcyBhbmQgb3RoZXIgbWV0aG9kcyBzaGFyZWQgd2l0aCBXb3Jrc2hlZXQgdXAgaW50byBCSUZGd3JpdGVyLgorIworc3ViIF9pbml0aWFsaXplIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGZoOworICAgIG15ICR0bXBfZGlyOworCisgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgY29tcGxpY2F0ZWQgYnkgV2luZG93cyBsaW1pdGF0aW9ucy4gUG9ydGVycyBjYW4KKyAgICAjIGNob29zZSBhIG1vcmUgZGlyZWN0IG1ldGhvZC4KKworCisKKyAgICAjIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2UgdXNlIElPOjpGaWxlLT5uZXdfdG1wZmlsZSgpLiBUaGlzIG1heSBmYWlsLCBpbgorICAgICMgcGFydGljdWxhciB3aXRoIElJUyBvbiBXaW5kb3dzLCBzbyB3ZSBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgdGVtcAorICAgICMgZGlyZWN0b3J5IHZpYSBGaWxlOjpUZW1wLgorICAgICMKKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e190ZW1wZGlyfSkgeworCisgICAgICAgICMgRGVsYXkgbG9hZGluZyBGaWxlOlRlbXAgdG8gcmVkdWNlIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzLgorICAgICAgICBldmFsIHsgcmVxdWlyZSBGaWxlOjpUZW1wIH07CisgICAgICAgIGRpZSAiVGhlIEZpbGU6OlRlbXAgbW9kdWxlIG11c3QgYmUgaW5zdGFsbGVkIGluIG9yZGVyICIuCisgICAgICAgICAgICAidG8gY2FsbCBzZXRfdGVtcGRpcigpLlxuIiBpZiAkQDsKKworCisgICAgICAgICMgVHJhcCBidXQgaWdub3JlIEZpbGU6OlRlbXAgZXJyb3JzLgorICAgICAgICBldmFsIHsgJGZoID0gRmlsZTo6VGVtcDo6dGVtcGZpbGUoRElSID0+ICRzZWxmLT57X3RlbXBkaXJ9KSB9OworCisgICAgICAgICMgU3RvcmUgdGhlIGZhaWxlZCB0bXAgZGlyIGluIGNhc2Ugb2YgZXJyb3JzLgorICAgICAgICAkdG1wX2RpciA9ICRzZWxmLT57X3RlbXBkaXJ9IHx8IEZpbGU6OlNwZWMtPnRtcGRpciBpZiBub3QgJGZoOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAkZmggPSBJTzo6RmlsZS0+bmV3X3RtcGZpbGUoKTsKKworICAgICAgICAjIFN0b3JlIHRoZSBmYWlsZWQgdG1wIGRpciBpbiBjYXNlIG9mIGVycm9ycy4KKyAgICAgICAgJHRtcF9kaXIgPSAiUE9TSVg6OnRtcG5hbSgpIGRpcmVjdG9yeSIgaWYgbm90ICRmaDsKKyAgICB9CisKKworICAgICMgQ2hlY2sgaWYgdGhlIHRlbXAgZmlsZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gRWxzZSBzdG9yZSBkYXRhIGluIG1lbW9yeS4KKyAgICBpZiAoJGZoKSB7CisKKyAgICAgICAgIyBiaW5tb2RlIGZpbGUgd2hldGhlciBwbGF0Zm9ybSByZXF1aXJlcyBpdCBvciBub3QuCisgICAgICAgIGJpbm1vZGUoJGZoKTsKKworICAgICAgICAjIFN0b3JlIGZpbGVoYW5kbGUKKyAgICAgICAgJHNlbGYtPntfZmlsZWhhbmRsZX0gPSAkZmg7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgICMgU2V0IGZsYWcgdG8gc3RvcmUgZGF0YSBpbiBtZW1vcnkgaWYgWFg6OnRlbXBmaWxlKCkgZmFpbGVkLgorICAgICAgICAkc2VsZi0+e191c2luZ190bXBmaWxlfSA9IDA7CisKKyAgICAgICAgaWYgKCReVykgeworICAgICAgICAgICAgbXkgJGRpciA9ICRzZWxmLT57X3RlbXBkaXJ9IHx8IEZpbGU6OlNwZWMtPnRtcGRpcigpOworCisgICAgICAgICAgICB3YXJuICJVbmFibGUgdG8gY3JlYXRlIHRlbXAgZmlsZXMgaW4gJHRtcF9kaXIuIERhdGEgd2lsbCBiZSAiLgorICAgICAgICAgICAgICAgICAic3RvcmVkIGluIG1lbW9yeS4gUmVmZXIgdG8gc2V0X3RlbXBkaXIoKSBpbiB0aGUgIi4KKyAgICAgICAgICAgICAgICAgIlNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24uXG4iIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfY2hlY2tzdW1fbWV0aG9kLgorIworIyBDaGVjayBmb3IgbW9kdWxlcyBhdmFpbGFibGUgdG8gY2FsY3VsYXRlIGltYWdlIGNoZWNrc3VtLiBFeGNlbCB1c2VzIE1ENCBidXQKKyMgTUQ1IHdpbGwgYWxzbyB3b3JrLgorIworc3ViIF9nZXRfY2hlY2tzdW1fbWV0aG9kIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBldmFsIHsgcmVxdWlyZSBEaWdlc3Q6Ok1ENH07CisgICAgaWYgKG5vdCAkQCkgeworICAgICAgICAkc2VsZi0+e19jaGVja3N1bV9tZXRob2R9ID0gMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgZXZhbCB7IHJlcXVpcmUgRGlnZXN0OjpQZXJsOjpNRDR9OworICAgIGlmIChub3QgJEApIHsKKyAgICAgICAgJHNlbGYtPntfY2hlY2tzdW1fbWV0aG9kfSA9IDI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIGV2YWwgeyByZXF1aXJlIERpZ2VzdDo6TUQ1fTsKKyAgICBpZiAobm90ICRAKSB7CisgICAgICAgICRzZWxmLT57X2NoZWNrc3VtX21ldGhvZH0gPSAzOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgIyBEZWZhdWx0LgorICAgICRzZWxmLT57X2NoZWNrc3VtX21ldGhvZH0gPSAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2FwcGVuZCgpLCBvdmVycmlkZGVuLgorIworIyBTdG9yZSBXb3Jrc2hlZXQgZGF0YSBpbiBtZW1vcnkgdXNpbmcgdGhlIGJhc2UgY2xhc3MgX2FwcGVuZCgpIG9yIHRvIGEKKyMgdGVtcG9yYXJ5IGZpbGUsIHRoZSBkZWZhdWx0LgorIworc3ViIF9hcHBlbmQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZGF0YSA9ICcnOworCisgICAgaWYgKCRzZWxmLT57X3VzaW5nX3RtcGZpbGV9KSB7CisgICAgICAgICRkYXRhID0gam9pbignJywgQF8pOworCisgICAgICAgICMgQWRkIENPTlRJTlVFIHJlY29yZHMgaWYgbmVjZXNzYXJ5CisgICAgICAgICRkYXRhID0gJHNlbGYtPl9hZGRfY29udGludWUoJGRhdGEpIGlmIGxlbmd0aCgkZGF0YSkgPiAkc2VsZi0+e19saW1pdH07CisKKyAgICAgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICBsb2NhbCAkXCA9IHVuZGVmOworCisgICAgICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gJGRhdGE7CisgICAgICAgICRzZWxmLT57X2RhdGFzaXplfSArPSBsZW5ndGgoJGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGRhdGEgPSAkc2VsZi0+U1VQRVI6Ol9hcHBlbmQoQF8pOworICAgIH0KKworICAgIHJldHVybiAkZGF0YTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9kYXRhKCkuCisjCisjIFJldHJpZXZlcyBkYXRhIGZyb20gbWVtb3J5IGluIG9uZSBjaHVuaywgb3IgZnJvbSBkaXNrIGluICRidWZmZXIKKyMgc2l6ZWQgY2h1bmtzLgorIworc3ViIGdldF9kYXRhIHsKKworICAgIG15ICRzZWxmICAgPSBzaGlmdDsKKyAgICBteSAkYnVmZmVyID0gNDA5NjsKKyAgICBteSAkdG1wOworCisgICAgIyBSZXR1cm4gZGF0YSBzdG9yZWQgaW4gbWVtb3J5CisgICAgaWYgKGRlZmluZWQgJHNlbGYtPntfZGF0YX0pIHsKKyAgICAgICAgJHRtcCAgICAgICAgICAgPSAkc2VsZi0+e19kYXRhfTsKKyAgICAgICAgJHNlbGYtPntfZGF0YX0gPSB1bmRlZjsKKyAgICAgICAgbXkgJGZoICAgICAgICAgPSAkc2VsZi0+e19maWxlaGFuZGxlfTsKKyAgICAgICAgc2VlaygkZmgsIDAsIDApIGlmICRzZWxmLT57X3VzaW5nX3RtcGZpbGV9OworICAgICAgICByZXR1cm4gJHRtcDsKKyAgICB9CisKKyAgICAjIFJldHVybiBkYXRhIHN0b3JlZCBvbiBkaXNrCisgICAgaWYgKCRzZWxmLT57X3VzaW5nX3RtcGZpbGV9KSB7CisgICAgICAgIHJldHVybiAkdG1wIGlmIHJlYWQoJHNlbGYtPntfZmlsZWhhbmRsZX0sICR0bXAsICRidWZmZXIpOworICAgIH0KKworICAgICMgTm8gZGF0YSB0byByZXR1cm4KKyAgICByZXR1cm4gdW5kZWY7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjbG9zZSgpCisjCisjIENhbGxzIGZpbmFsaXphdGlvbiBtZXRob2RzIGFuZCBleHBsaWNpdGx5IGNsb3NlIHRoZSBPTEV3cml0ZXIgZmlsZQorIyBoYW5kbGUuCisjCitzdWIgY2xvc2UgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiBpZiAkc2VsZi0+e19maWxlY2xvc2VkfTsgIyBQcmV2ZW50IGNsb3NlKCkgZnJvbSBiZWluZyBjYWxsZWQgdHdpY2UuCisKKyAgICAkc2VsZi0+e19maWxlY2xvc2VkfSA9IDE7CisKKyAgICByZXR1cm4gJHNlbGYtPl9zdG9yZV93b3JrYm9vaygpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgREVTVFJPWSgpCisjCisjIENsb3NlIHRoZSB3b3JrYm9vayBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGV4cGxpY2l0bHkgY2xvc2VkLgorIworc3ViIERFU1RST1kgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGxvY2FsICgkQCwgJCEsICReRSwgJD8pOworCisgICAgJHNlbGYtPmNsb3NlKCkgaWYgbm90ICRzZWxmLT57X2ZpbGVjbG9zZWR9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2hlZXRzKHNsaWNlLC4uLikKKyMKKyMgQW4gYWNjZXNzb3IgZm9yIHRoZSBfd29ya3NoZWV0c1tdIGFycmF5CisjCisjIFJldHVybnM6IGFuIG9wdGlvbmFsbHkgc2xpY2VkIGxpc3Qgb2YgdGhlIHdvcmtzaGVldCBvYmplY3RzIGluIGEgd29ya2Jvb2suCisjCitzdWIgc2hlZXRzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoQF8pIHsKKyAgICAgICAgIyBSZXR1cm4gYSBzbGljZSBvZiB0aGUgYXJyYXkKKyAgICAgICAgcmV0dXJuIEB7JHNlbGYtPntfd29ya3NoZWV0c319W0BfXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICMgUmV0dXJuIHRoZSBlbnRpcmUgbGlzdAorICAgICAgICByZXR1cm4gQHskc2VsZi0+e193b3Jrc2hlZXRzfX07CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd29ya3NoZWV0cygpCisjCisjIEFuIGFjY2Vzc29yIGZvciB0aGUgX3dvcmtzaGVldHNbXSBhcnJheS4KKyMgVGhpcyBtZXRob2QgaXMgbm93IGRlcHJlY2F0ZWQuIFVzZSB0aGUgc2hlZXRzKCkgbWV0aG9kIGluc3RlYWQuCisjCisjIFJldHVybnM6IGFuIGFycmF5IHJlZmVyZW5jZQorIworc3ViIHdvcmtzaGVldHMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e193b3Jrc2hlZXRzfTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGFkZF93b3Jrc2hlZXQoJG5hbWUsICRlbmNvZGluZykKKyMKKyMgQWRkIGEgbmV3IHdvcmtzaGVldCB0byB0aGUgRXhjZWwgd29ya2Jvb2suCisjCisjIFJldHVybnM6IHJlZmVyZW5jZSB0byBhIHdvcmtzaGVldCBvYmplY3QKKyMKK3N1YiBhZGRfd29ya3NoZWV0IHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRpbmRleCAgICA9IEB7JHNlbGYtPntfd29ya3NoZWV0c319OworCisgICAgbXkgKCRuYW1lLCAkZW5jb2RpbmcpID0gJHNlbGYtPl9jaGVja19zaGVldG5hbWUoJF9bMF0sICRfWzFdKTsKKworCisgICAgIyBQb3J0ZXJzIHRha2Ugbm90ZSwgdGhlIGZvbGxvd2luZyBzY2hlbWUgb2YgcGFzc2luZyByZWZlcmVuY2VzIHRvIFdvcmtib29rCisgICAgIyBkYXRhIChpbiB0aGUgXCRzZWxmLT57X2Zvb30gY2FzZXMpIGluc3RlYWQgb2YgYSByZWZlcmVuY2UgdG8gdGhlIFdvcmtib29rCisgICAgIyBpdHNlbGYgaXMgYSB3b3JrYXJvdW5kIHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiBXb3JrYm9vayBhbmQKKyAgICAjIFdvcmtzaGVldCBvYmplY3RzLiBGZWVsIGZyZWUgdG8gaW1wbGVtZW50IHRoaXMgaW4gYW55IHdheSB0aGUgc3VpdHMgeW91cgorICAgICMgbGFuZ3VhZ2UuCisgICAgIworICAgIG15IEBpbml0X2RhdGEgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICRlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19hY3RpdmVzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICAgICBcJHNlbGYtPntfZmlyc3RzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfdXJsX2Zvcm1hdH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfcGFyc2VyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e190ZW1wZGlyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19zdHJfdG90YWx9LAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X3N0cl91bmlxdWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X3N0cl90YWJsZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfMTkwNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfY29tcGF0aWJpbGl0eX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsICMgUGFsZXR0ZS4gTm90IHVzZWQgeWV0LiBTZWUgYWRkX2NoYXJ0KCkuCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBteSAkd29ya3NoZWV0ID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldC0+bmV3KEBpbml0X2RhdGEpOworICAgICRzZWxmLT57X3dvcmtzaGVldHN9LT5bJGluZGV4XSA9ICR3b3Jrc2hlZXQ7ICAgICAjIFN0b3JlIHJlZiBmb3IgaXRlcmF0b3IKKyAgICAkc2VsZi0+e19zaGVldG5hbWVzfS0+WyRpbmRleF0gPSAkbmFtZTsgICAgICAgICAgIyBTdG9yZSBFWFRFUk5TSEVFVCBuYW1lcworICAgICRzZWxmLT57X3BhcnNlcn0tPnNldF9leHRfc2hlZXRzKCRuYW1lLCAkaW5kZXgpOyAjIFN0b3JlIG5hbWVzIGluIEZvcm11bGEucG0KKyAgICByZXR1cm4gJHdvcmtzaGVldDsKK30KKworIyBPbGRlciBtZXRob2QgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisqYWRkd29ya3NoZWV0ID0gKmFkZF93b3Jrc2hlZXQ7CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBhZGRfY2hhcnQoJWFyZ3MpCisjCisjIENyZWF0ZSBhIGNoYXJ0IGZvciBlbWJlZGRpbmcgb3IgYXMgYXMgbmV3IHNoZWV0LgorIworIworc3ViIGFkZF9jaGFydCB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAlYXJnICAgICAgPSBAXzsKKyAgICBteSAkbmFtZSAgICAgPSAnJzsKKyAgICBteSAkZW5jb2RpbmcgPSAwOworICAgIG15ICRpbmRleCAgICA9IEB7ICRzZWxmLT57X3dvcmtzaGVldHN9IH07CisKKyAgICAjIFR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgc28gd2UgY2FuIGNyZWF0ZSB0aGUgcmVxdWlyZWQgY2hhcnQgaW5zdGFuY2UuCisgICAgbXkgJHR5cGUgPSAkYXJne3R5cGV9OworICAgIGlmICggIWRlZmluZWQgJHR5cGUgKSB7CisgICAgICAgIGNyb2FrICJNdXN0IGRlZmluZSBjaGFydCB0eXBlIGluIGFkZF9jaGFydCgpIjsKKyAgICB9CisKKyAgICAjIEVuc3VyZSB0aGF0IHRoZSBjaGFydCBkZWZhdWx0cyB0byBub24gZW1iZWRkZWQuCisgICAgbXkgJGVtYmVkZGVkID0gJGFyZ3tlbWJlZGRlZH0gfHw9IDA7CisKKyAgICAjIENoZWNrIHRoZSB3b3Jrc2hlZXQgbmFtZSBmb3Igbm9uLWVtYmVkZGVkIGNoYXJ0cy4KKyAgICBpZiAoICEkZW1iZWRkZWQgKSB7CisgICAgICAgICggJG5hbWUsICRlbmNvZGluZyApID0KKyAgICAgICAgICAkc2VsZi0+X2NoZWNrX3NoZWV0bmFtZSggJGFyZ3tuYW1lfSwgJGFyZ3tuYW1lX2VuY29kaW5nfSwgMSApOworICAgIH0KKworICAgIG15IEBpbml0X2RhdGEgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICRlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19hY3RpdmVzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICAgICBcJHNlbGYtPntfZmlyc3RzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfdXJsX2Zvcm1hdH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfcGFyc2VyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e190ZW1wZGlyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19zdHJfdG90YWx9LAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X3N0cl91bmlxdWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X3N0cl90YWJsZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfMTkwNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfY29tcGF0aWJpbGl0eX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfcGFsZXR0ZX0sCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBteSAkY2hhcnQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPmZhY3RvcnkoICR0eXBlLCBAaW5pdF9kYXRhICk7CisKKyAgICAjIElmIHRoZSBjaGFydCBpc24ndCBlbWJlZGRlZCBsZXQgdGhlIHdvcmtib29rIGNvbnRyb2wgaXQuCisgICAgaWYgKCAhJGVtYmVkZGVkICkgeworICAgICAgICAkc2VsZi0+e193b3Jrc2hlZXRzfS0+WyRpbmRleF0gPSAkY2hhcnQ7ICAgICMgU3RvcmUgcmVmIGZvciBpdGVyYXRvcgorICAgICAgICAkc2VsZi0+e19zaGVldG5hbWVzfS0+WyRpbmRleF0gPSAkbmFtZTsgICAgICMgU3RvcmUgRVhURVJOU0hFRVQgbmFtZXMKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICMgU2V0IGluZGV4IHRvIDAgc28gdGhhdCB0aGUgYWN0aXZhdGUoKSBhbmQgc2V0X2ZpcnN0X3NoZWV0KCkgbWV0aG9kcworICAgICAgICAjIHBvaW50IGJhY2sgdG8gdGhlIGZpcnN0IHdvcmtzaGVldCBpZiB1c2VkIGZvciBlbWJlZGRlZCBjaGFydHMuCisgICAgICAgICRjaGFydC0+e19pbmRleH0gPSAwOworCisgICAgICAgICRjaGFydC0+X3NldF9lbWJlZGRlZF9jb25maWdfZGF0YSgpOworICAgIH0KKworICAgIHJldHVybiAkY2hhcnQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBhZGRfY2hhcnRfZXh0KCRmaWxlbmFtZSwgJG5hbWUpCisjCisjIEFkZCBhbiBleHRlcm5hbGx5IGNyZWF0ZWQgY2hhcnQuCisjCisjCitzdWIgYWRkX2NoYXJ0X2V4dCB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSAkX1swXTsKKyAgICBteSAkaW5kZXggICAgPSBAeyRzZWxmLT57X3dvcmtzaGVldHN9fTsKKyAgICBteSAkdHlwZSAgICAgPSAnZXh0ZXJuYWwnOworCisgICAgbXkgKCRuYW1lLCAkZW5jb2RpbmcpID0gJHNlbGYtPl9jaGVja19zaGVldG5hbWUoJF9bMV0sICRfWzJdKTsKKworCisgICAgbXkgQGluaXRfZGF0YSA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICRlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19hY3RpdmVzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICAgICBcJHNlbGYtPntfZmlyc3RzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBteSAkY2hhcnQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPmZhY3RvcnkoJHR5cGUsIEBpbml0X2RhdGEpOworICAgICRzZWxmLT57X3dvcmtzaGVldHN9LT5bJGluZGV4XSA9ICRjaGFydDsgICAgICAgICAjIFN0b3JlIHJlZiBmb3IgaXRlcmF0b3IKKyAgICAkc2VsZi0+e19zaGVldG5hbWVzfS0+WyRpbmRleF0gPSAkbmFtZTsgICAgICAgICAgIyBTdG9yZSBFWFRFUk5TSEVFVCBuYW1lcworCisgICAgcmV0dXJuICRjaGFydDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jaGVja19zaGVldG5hbWUoJG5hbWUsICRlbmNvZGluZykKKyMKKyMgQ2hlY2sgZm9yIHZhbGlkIHdvcmtzaGVldCBuYW1lcy4gV2UgY2hlY2sgdGhlIGxlbmd0aCwgaWYgaXQgY29udGFpbnMgYW55CisjIGludmFsaWQgY2hhcmFjdGVycyBhbmQgaWYgdGhlIG5hbWUgaXMgdW5pcXVlIGluIHRoZSB3b3JrYm9vay4KKyMKK3N1YiBfY2hlY2tfc2hlZXRuYW1lIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkbmFtZSAgICAgICAgICAgID0gJF9bMF0gfHwgIiI7CisgICAgbXkgJGVuY29kaW5nICAgICAgICA9ICRfWzFdIHx8IDA7CisgICAgbXkgJGNoYXJ0ICAgICAgICAgICA9ICRfWzJdIHx8IDA7CisgICAgbXkgJGxpbWl0ICAgICAgICAgICA9ICRlbmNvZGluZyA/IDYyIDogMzE7CisgICAgbXkgJGludmFsaWRfY2hhciAgICA9IHFyKFtcW1xdOio/L1xcXSk7CisKKyAgICAjIEluY3JlbWVudCB0aGUgU2hlZXQvQ2hhcnQgbnVtYmVyIHVzZWQgZm9yIGRlZmF1bHQgc2hlZXQgbmFtZXMgYmVsb3cuCisgICAgaWYgKCAkY2hhcnQgKSB7CisgICAgICAgICRzZWxmLT57X2NoYXJ0X2NvdW50fSsrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfc2hlZXRfY291bnR9Kys7CisgICAgfQorCisgICAgIyBTdXBwbHkgZGVmYXVsdCBTaGVldC9DaGFydCBuYW1lIGlmIG5vbmUgaGFzIGJlZW4gZGVmaW5lZC4KKyAgICBpZiAoICRuYW1lIGVxICIiICkgeworICAgICAgICAkZW5jb2RpbmcgPSAwOworCisgICAgICAgIGlmICggJGNoYXJ0ICkgeworICAgICAgICAgICAgJG5hbWUgPSAkc2VsZi0+e19jaGFydF9uYW1lfSAuICRzZWxmLT57X2NoYXJ0X2NvdW50fTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRuYW1lID0gJHNlbGYtPntfc2hlZXRfbmFtZX0gLiAkc2VsZi0+e19zaGVldF9jb3VudH07CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgQ2hlY2sgdGhhdCBzaGVldG5hbWUgaXMgPD0gMzEgKDEgb3IgMiBieXRlIGNoYXJzKS4gRXhjZWwgbGltaXQuCisgICAgY3JvYWsgIlNoZWV0bmFtZSAkbmFtZSBtdXN0IGJlIDw9IDMxIGNoYXJzIiBpZiBsZW5ndGggJG5hbWUgPiAkbGltaXQ7CisKKyAgICAjIENoZWNrIHRoYXQgVW5pY29kZSBzaGVldG5hbWUgaGFzIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCisgICAgY3JvYWsgJ09kZCBudW1iZXIgb2YgYnl0ZXMgaW4gVW5pY29kZSB3b3Jrc2hlZXQgbmFtZTonIC4gJG5hbWUKKyAgICAgICAgICBpZiAkZW5jb2RpbmcgPT0gMSBhbmQgbGVuZ3RoKCRuYW1lKSAlIDI7CisKKworICAgICMgQ2hlY2sgdGhhdCBzaGVldG5hbWUgZG9lc24ndCBjb250YWluIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKKyAgICBpZiAoJGVuY29kaW5nICE9IDEgYW5kICRuYW1lID1+ICRpbnZhbGlkX2NoYXIpIHsKKyAgICAgICAgIyBDaGVjayBBU0NJSSBuYW1lcworICAgICAgICBjcm9hayAnSW52YWxpZCBjaGFyYWN0ZXIgW106Kj8vXFwgaW4gd29ya3NoZWV0IG5hbWU6ICcgLiAkbmFtZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICMgRXh0cmFjdCBhbnkgOGJpdCBjbGVhbiBjaGFycyBmcm9tIHRoZSBVVEYxNiBuYW1lIGFuZCB2YWxpZGF0ZSB0aGVtLgorICAgICAgICBmb3IgbXkgJHdjaGFyICgkbmFtZSA9fiAvLi4vc2cpIHsKKyAgICAgICAgICAgIG15ICgkaGksICRsbykgPSB1bnBhY2sgImFhIiwgJHdjaGFyOworICAgICAgICAgICAgaWYgKCRoaSBlcSAiXDAiIGFuZCAkbG8gPX4gJGludmFsaWRfY2hhcikgeworICAgICAgICAgICAgICAgIGNyb2FrICdJbnZhbGlkIGNoYXJhY3RlciBbXToqPy9cXCBpbiB3b3Jrc2hlZXQgbmFtZTogJyAuICRuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJG5hbWUpKSB7CisgICAgICAgICAgICAkbmFtZSA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZCRSIsICRuYW1lKTsKKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgd29ya3NoZWV0IG5hbWUgZG9lc24ndCBhbHJlYWR5IGV4aXN0IHNpbmNlIHRoaXMgaXMgYSBmYXRhbAorICAgICMgZXJyb3IgaW4gRXhjZWwgOTcuIFRoZSBjaGVjayBtdXN0IGFsc28gZXhjbHVkZSBjYXNlIGluc2Vuc2l0aXZlIG1hdGNoZXMKKyAgICAjIHNpbmNlIHRoZSBuYW1lcyAnU2hlZXQxJyBhbmQgJ3NoZWV0MScgYXJlIGVxdWl2YWxlbnQuIFRoZSB0ZXN0cyBhbHNvIGhhdmUKKyAgICAjIHRvIHRha2UgdGhlIGVuY29kaW5nIGludG8gYWNjb3VudC4KKyAgICAjCisgICAgZm9yZWFjaCBteSAkd29ya3NoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworICAgICAgICBteSAkbmFtZV9hICA9ICRuYW1lOworICAgICAgICBteSAkZW5jZF9hICA9ICRlbmNvZGluZzsKKyAgICAgICAgbXkgJG5hbWVfYiAgPSAkd29ya3NoZWV0LT57X25hbWV9OworICAgICAgICBteSAkZW5jZF9iICA9ICR3b3Jrc2hlZXQtPntfZW5jb2Rpbmd9OworICAgICAgICBteSAkZXJyb3IgICA9IDA7CisKKyAgICAgICAgaWYgICAgKCRlbmNkX2EgPT0gMCBhbmQgJGVuY2RfYiA9PSAwKSB7CisgICAgICAgICAgICAkZXJyb3IgID0gMSBpZiBsYygkbmFtZV9hKSBlcSBsYygkbmFtZV9iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoJGVuY2RfYSA9PSAwIGFuZCAkZW5jZF9iID09IDEpIHsKKyAgICAgICAgICAgICRuYW1lX2EgPSBwYWNrICJuKiIsIHVucGFjayAiQyoiLCAkbmFtZV9hOworICAgICAgICAgICAgJGVycm9yICA9IDEgaWYgbGMoJG5hbWVfYSkgZXEgbGMoJG5hbWVfYik7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRlbmNkX2EgPT0gMSBhbmQgJGVuY2RfYiA9PSAwKSB7CisgICAgICAgICAgICAkbmFtZV9iID0gcGFjayAibioiLCB1bnBhY2sgIkMqIiwgJG5hbWVfYjsKKyAgICAgICAgICAgICRlcnJvciAgPSAxIGlmIGxjKCRuYW1lX2EpIGVxIGxjKCRuYW1lX2IpOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkZW5jZF9hID09IDEgYW5kICRlbmNkX2IgPT0gMSkgeworICAgICAgICAgICAgIyBXZSBjYW4gZG8gYSB0cnVlIGNhc2UgaW5zZW5zaXRpdmUgdGVzdCB3aXRoIFBlcmwgNS44IGFuZCB1dGY4LgorICAgICAgICAgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgICAgICAgICAgJG5hbWVfYSA9IEVuY29kZTo6ZGVjb2RlKCJVVEYtMTZCRSIsICRuYW1lX2EpOworICAgICAgICAgICAgICAgICRuYW1lX2IgPSBFbmNvZGU6OmRlY29kZSgiVVRGLTE2QkUiLCAkbmFtZV9iKTsKKyAgICAgICAgICAgICAgICAkZXJyb3IgID0gMSBpZiBsYygkbmFtZV9hKSBlcSBsYygkbmFtZV9iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBXZSBjYW4ndCBlYXNpbHkgZG8gYSBjYXNlIGluc2Vuc2l0aXZlIHRlc3Qgb2YgdGhlIFVURjE2IG5hbWVzLgorICAgICAgICAgICAgIyBBcyBhIHNwZWNpYWwgY2FzZSB3ZSBjaGVjayBpZiBhbGwgb2YgdGhlIGhpZ2ggYnl0ZXMgYXJlIG51bGxzIGFuZAorICAgICAgICAgICAgIyB0aGVuIGRvIGFuIEFTQ0lJIHN0eWxlIGNhc2UgaW5zZW5zaXRpdmUgdGVzdC4KKworICAgICAgICAgICAgICAgICMgU3RyaXAgb3V0IHRoZSBoaWdoIGJ5dGVzIChmdW5raWx5KS4KKyAgICAgICAgICAgICAgICBteSAkaGlfYSA9IGdyZXAge29yZH0gJG5hbWVfYSA9fiAvKC4pLi9zZzsKKyAgICAgICAgICAgICAgICBteSAkaGlfYiA9IGdyZXAge29yZH0gJG5hbWVfYiA9fiAvKC4pLi9zZzsKKworICAgICAgICAgICAgICAgIGlmICgkaGlfYSBvciAkaGlfYikgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3IgID0gMSBpZiAgICAkbmFtZV9hICBlcSAgICAkbmFtZV9iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yICA9IDEgaWYgbGMoJG5hbWVfYSkgZXEgbGMoJG5hbWVfYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBJZiBhbnkgb2YgdGhlIGNhc2VzIGZhaWxlZCB3ZSB0aHJvdyB0aGUgZXJyb3IgaGVyZS4KKyAgICAgICAgaWYgKCRlcnJvcikgeworICAgICAgICAgICAgY3JvYWsgIldvcmtzaGVldCBuYW1lICckbmFtZScsIHdpdGggY2FzZSBpZ25vcmVkLCAiIC4KKyAgICAgICAgICAgICAgICAgICJpcyBhbHJlYWR5IGluIHVzZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKCRuYW1lLCAgJGVuY29kaW5nKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGFkZF9mb3JtYXQoJXByb3BlcnRpZXMpCisjCisjIEFkZCBhIG5ldyBmb3JtYXQgdG8gdGhlIEV4Y2VsIHdvcmtib29rLiBUaGlzIGFkZHMgYW4gWEYgcmVjb3JkIGFuZAorIyBhIEZPTlQgcmVjb3JkLiBBbHNvLCBwYXNzIGFueSBwcm9wZXJ0aWVzIHRvIHRoZSBGb3JtYXQ6Om5ldygpLgorIworc3ViIGFkZF9mb3JtYXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRmb3JtYXQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0LT5uZXcoJHNlbGYtPntfeGZfaW5kZXh9LCBAXyk7CisKKyAgICAkc2VsZi0+e194Zl9pbmRleH0gKz0gMTsKKyAgICBwdXNoIEB7JHNlbGYtPntfZm9ybWF0c319LCAkZm9ybWF0OyAjIFN0b3JlIGZvcm1hdCByZWZlcmVuY2UKKworICAgIHJldHVybiAkZm9ybWF0OworfQorCisjIE9sZGVyIG1ldGhvZCBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyphZGRmb3JtYXQgPSAqYWRkX2Zvcm1hdDsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNvbXBhdGliaWxpdHlfbW9kZSgpCisjCisjIFNldCB0aGUgY29tcGF0aWJpbGl0eSBtb2RlLgorIworIyBFeGNlbCBkb2Vzbid0IHJlcXVpcmUgZXZlcnkgcG9zc2libGUgQmlmZiByZWNvcmQgdG8gYmUgcHJlc2VudCBpbiBhIGZpbGUuCisjIEluIHBhcnRpY3VsYXIgaWYgdGhlIGluZGV4aW5nIHJlY29yZHMgSU5ERVgsIFJPVyBhbmQgREJDRUxMIGFyZW4ndCBwcmVzZW50CisjIGl0IGp1c3QgaWdub3JlcyB0aGUgZmFjdCBhbmQgcmVhZHMgdGhlIGNlbGxzIGFueXdheS4gVGhpcyBpcyBhbHNvIHRydWUgb2YKKyMgdGhlIEVYVFNTVCByZWNvcmQuIEdudW1lcmljIGFuZCBPT28gYWxzbyB0YWtlIHRoaXMgYXBwcm9hY2guIFRoaXMgYWxsb3dzCisjIFdyaXRlRXhjZWwgdG8gaWdub3JlIHRoZXNlIHJlY29yZHMgaW4gb3JkZXIgdG8gbWluaW1pc2UgdGhlIGFtb3VudCBvZiBkYXRhCisjIHN0b3JlZCBpbiBtZW1vcnkuIEhvd2V2ZXIsIG90aGVyIHRoaXJkIHBhcnR5IGFwcGxpY2F0aW9ucyB0aGF0IHJlYWQgRXhjZWwKKyMgZmlsZXMgb2Z0ZW4gZXhwZWN0IHRoZXNlIHJlY29yZHMgdG8gYmUgcHJlc2VudC4gSW4gImNvbXBhdGliaWxpdHkgbW9kZSIKKyMgV3JpdGVFeGNlbCB3cml0ZXMgdGhlc2UgcmVjb3JkcyBhbmQgdHJpZXMgdG8gYmUgYXMgY2xvc2UgdG8gYW4gRXhjZWwKKyMgZ2VuZXJhdGVkIGZpbGUgYXMgcG9zc2libGUuCisjCisjIFRoaXMgcmVxdWlyZXMgYWRkaXRpb25hbCBkYXRhIHRvIGJlIHN0b3JlZCBpbiBtZW1vcnkgdW50aWwgdGhlIGZpbGUgaXMKKyMgYWJvdXQgdG8gYmUgd3JpdHRlbi4gVGhpcyBpbmN1cnMgYSBtZW1vcnkgYW5kIHNwZWVkIHBlbmFsdHkgYW5kIG1heSBub3QgYmUKKyMgc3VpdGFibGUgZm9yIHZlcnkgbGFyZ2UgZmlsZXMuCisjCitzdWIgY29tcGF0aWJpbGl0eV9tb2RlIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIGNyb2FrICJjb21wYXRpYmlsaXR5X21vZGUoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYWRkX3dvcmtzaGVldCgpIgorICAgICAgICAgIGlmICRzZWxmLT5zaGVldHMoKTsKKworICAgIGlmIChkZWZpbmVkKCRfWzBdKSkgeworICAgICAgICAkc2VsZi0+e19jb21wYXRpYmlsaXR5fSA9ICRfWzBdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfY29tcGF0aWJpbGl0eX0gPSAxOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF8xOTA0KCkKKyMKKyMgU2V0IHRoZSBkYXRlIHN5c3RlbTogMCA9IDE5MDAgKHRoZSBkZWZhdWx0KSwgMSA9IDE5MDQKKyMKK3N1YiBzZXRfMTkwNCB7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisKKyAgICBjcm9hayAic2V0XzE5MDQoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYWRkX3dvcmtzaGVldCgpIgorICAgICAgICAgIGlmICRzZWxmLT5zaGVldHMoKTsKKworCisgICAgaWYgKGRlZmluZWQoJF9bMF0pKSB7CisgICAgICAgICRzZWxmLT57XzE5MDR9ID0gJF9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e18xOTA0fSA9IDE7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0XzE5MDQoKQorIworIyBSZXR1cm4gdGhlIGRhdGUgc3lzdGVtOiAwID0gMTkwMCwgMSA9IDE5MDQKKyMKK3N1YiBnZXRfMTkwNCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57XzE5MDR9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2N1c3RvbV9jb2xvcigpCisjCisjIENoYW5nZSB0aGUgUkdCIGNvbXBvbmVudHMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xvdXIgcGFsZXR0ZS4KKyMKK3N1YiBzZXRfY3VzdG9tX2NvbG9yIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKworICAgICMgTWF0Y2ggYSBIVE1MICN4eHl5enogc3R5bGUgcGFyYW1ldGVyCisgICAgaWYgKGRlZmluZWQgJF9bMV0gYW5kICRfWzFdID1+IC9eIyhcd1x3KShcd1x3KShcd1x3KS8gKSB7CisgICAgICAgIEBfID0gKCRfWzBdLCBoZXggJDEsIGhleCAkMiwgaGV4ICQzKTsKKyAgICB9CisKKworICAgIG15ICRpbmRleCAgID0gJF9bMF0gfHwgMDsKKyAgICBteSAkcmVkICAgICA9ICRfWzFdIHx8IDA7CisgICAgbXkgJGdyZWVuICAgPSAkX1syXSB8fCAwOworICAgIG15ICRibHVlICAgID0gJF9bM10gfHwgMDsKKworICAgIG15ICRhcmVmICAgID0gJHNlbGYtPntfcGFsZXR0ZX07CisKKyAgICAjIENoZWNrIHRoYXQgdGhlIGNvbG91ciBpbmRleCBpcyB0aGUgcmlnaHQgcmFuZ2UKKyAgICBpZiAoJGluZGV4IDwgOCBvciAkaW5kZXggPiA2NCkgeworICAgICAgICBjYXJwICJDb2xvciBpbmRleCAkaW5kZXggb3V0c2lkZSByYW5nZTogOCA8PSBpbmRleCA8PSA2NCI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICMgQ2hlY2sgdGhhdCB0aGUgY29sb3VyIGNvbXBvbmVudHMgYXJlIGluIHRoZSByaWdodCByYW5nZQorICAgIGlmICggKCRyZWQgICA8IDAgb3IgJHJlZCAgID4gMjU1KSB8fAorICAgICAgICAgKCRncmVlbiA8IDAgb3IgJGdyZWVuID4gMjU1KSB8fAorICAgICAgICAgKCRibHVlICA8IDAgb3IgJGJsdWUgID4gMjU1KSApCisgICAgeworICAgICAgICBjYXJwICJDb2xvciBjb21wb25lbnQgb3V0c2lkZSByYW5nZTogMCA8PSBjb2xvciA8PSAyNTUiOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAkaW5kZXggLT04OyAjIEFkanVzdCBjb2xvdXIgaW5kZXggKHdpbmdsZXNzIGRyYWdvbmZseSkKKworICAgICMgU2V0IHRoZSBSR0IgdmFsdWUKKyAgICAkYXJlZi0+WyRpbmRleF0gPSBbJHJlZCwgJGdyZWVuLCAkYmx1ZSwgMF07CisKKyAgICByZXR1cm4gJGluZGV4ICs4OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3BhbGV0dGVfeGw5NygpCisjCisjIFNldHMgdGhlIGNvbG91ciBwYWxldHRlIHRvIHRoZSBFeGNlbCA5NysgZGVmYXVsdC4KKyMKK3N1YiBzZXRfcGFsZXR0ZV94bDk3IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19wYWxldHRlfSA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sICAgIyA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDBdLCAgICMgOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweDAwLCAweDAwLCAweDAwXSwgICAjIDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4ZmYsIDB4MDAsIDB4MDBdLCAgICMgMTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHgwMCwgMHhmZiwgMHgwMF0sICAgIyAxMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweGZmLCAweDAwLCAweDAwXSwgICAjIDEzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDBdLCAgICMgMTQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHhmZiwgMHhmZiwgMHgwMF0sICAgIyAxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDgwLCAweDAwLCAweDAwLCAweDAwXSwgICAjIDE2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4ODAsIDB4MDAsIDB4MDBdLCAgICMgMTcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHgwMCwgMHg4MCwgMHgwMF0sICAgIyAxOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDgwLCAweDgwLCAweDAwLCAweDAwXSwgICAjIDE5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ODAsIDB4MDAsIDB4ODAsIDB4MDBdLCAgICMgMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHg4MCwgMHg4MCwgMHgwMF0sICAgIyAyMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGMwLCAweGMwLCAweGMwLCAweDAwXSwgICAjIDIyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ODAsIDB4ODAsIDB4ODAsIDB4MDBdLCAgICMgMjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg5OSwgMHg5OSwgMHhmZiwgMHgwMF0sICAgIyAyNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDk5LCAweDMzLCAweDY2LCAweDAwXSwgICAjIDI1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4ZmYsIDB4Y2MsIDB4MDBdLCAgICMgMjYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhjYywgMHhmZiwgMHhmZiwgMHgwMF0sICAgIyAyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDY2LCAweDAwLCAweDY2LCAweDAwXSwgICAjIDI4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4ODAsIDB4ODAsIDB4MDBdLCAgICMgMjkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHg2NiwgMHhjYywgMHgwMF0sICAgIyAzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGNjLCAweGNjLCAweGZmLCAweDAwXSwgICAjIDMxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4MDAsIDB4ODAsIDB4MDBdLCAgICMgMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHgwMCwgMHhmZiwgMHgwMF0sICAgIyAzMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweGZmLCAweDAwLCAweDAwXSwgICAjIDM0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDBdLCAgICMgMzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg4MCwgMHgwMCwgMHg4MCwgMHgwMF0sICAgIyAzNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDgwLCAweDAwLCAweDAwLCAweDAwXSwgICAjIDM3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4ODAsIDB4ODAsIDB4MDBdLCAgICMgMzgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHgwMCwgMHhmZiwgMHgwMF0sICAgIyAzOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwLCAweGNjLCAweGZmLCAweDAwXSwgICAjIDQwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4Y2MsIDB4ZmYsIDB4ZmYsIDB4MDBdLCAgICMgNDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhjYywgMHhmZiwgMHhjYywgMHgwMF0sICAgIyA0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweGZmLCAweDk5LCAweDAwXSwgICAjIDQzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4OTksIDB4Y2MsIDB4ZmYsIDB4MDBdLCAgICMgNDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHg5OSwgMHhjYywgMHgwMF0sICAgIyA0NQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGNjLCAweDk5LCAweGZmLCAweDAwXSwgICAjIDQ2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4Y2MsIDB4OTksIDB4MDBdLCAgICMgNDcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgzMywgMHg2NiwgMHhmZiwgMHgwMF0sICAgIyA0OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDMzLCAweGNjLCAweGNjLCAweDAwXSwgICAjIDQ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4OTksIDB4Y2MsIDB4MDAsIDB4MDBdLCAgICMgNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHhjYywgMHgwMCwgMHgwMF0sICAgIyA1MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweDk5LCAweDAwLCAweDAwXSwgICAjIDUyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4NjYsIDB4MDAsIDB4MDBdLCAgICMgNTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg2NiwgMHg2NiwgMHg5OSwgMHgwMF0sICAgIyA1NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDk2LCAweDk2LCAweDk2LCAweDAwXSwgICAjIDU1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4MzMsIDB4NjYsIDB4MDBdLCAgICMgNTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgzMywgMHg5OSwgMHg2NiwgMHgwMF0sICAgIyA1NworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwLCAweDMzLCAweDAwLCAweDAwXSwgICAjIDU4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MzMsIDB4MzMsIDB4MDAsIDB4MDBdLCAgICMgNTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg5OSwgMHgzMywgMHgwMCwgMHgwMF0sICAgIyA2MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDk5LCAweDMzLCAweDY2LCAweDAwXSwgICAjIDYxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MzMsIDB4MzMsIDB4OTksIDB4MDBdLCAgICMgNjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgzMywgMHgzMywgMHgzMywgMHgwMF0sICAgIyA2MworICAgICAgICAgICAgICAgICAgICAgICAgXTsKKworICAgIHJldHVybiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3RlbXBkaXIoKQorIworIyBDaGFuZ2UgdGhlIGRlZmF1bHQgdGVtcCBkaXJlY3RvcnkgdXNlZCBieSBfaW5pdGlhbGl6ZSgpIGluIFdvcmtzaGVldC5wbS4KKyMKK3N1YiBzZXRfdGVtcGRpciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBXaW5kb3dzIHdvcmthcm91bmQuIFNlZSBXb3Jrc2hlZXQ6Ol9pbml0aWFsaXplKCkKKyAgICBteSAkZGlyICA9IHNoaWZ0IHx8ICcnOworCisgICAgY3JvYWsgIiRkaXIgaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5IiAgICAgICBpZiAkZGlyIG5lICcnIGFuZCBub3QgLWQgJGRpcjsKKyAgICBjcm9hayAic2V0X3RlbXBkaXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFkZF93b3Jrc2hlZXQiIGlmICRzZWxmLT5zaGVldHMoKTsKKworICAgICRzZWxmLT57X3RlbXBkaXJ9ID0gJGRpciA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfY29kZXBhZ2UoKQorIworIyBTZWUgYWxzbyB0aGUgX3N0b3JlX2NvZGVwYWdlIG1ldGhvZC4gVGhpcyBpcyB1c2VkIHRvIHN0b3JlIHRoZSBjb2RlIHBhZ2UsIGkuZS4KKyMgdGhlIGNoYXJhY3RlciBzZXQgdXNlZCBpbiB0aGUgd29ya2Jvb2suCisjCitzdWIgc2V0X2NvZGVwYWdlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJGNvZGVwYWdlICAgID0gJF9bMF0gfHwgMTsKKyAgICAgICAkY29kZXBhZ2UgICAgPSAweDA0RTQgaWYgJGNvZGVwYWdlID09IDE7CisgICAgICAgJGNvZGVwYWdlICAgID0gMHg4MDAwIGlmICRjb2RlcGFnZSA9PSAyOworCisgICAgJHNlbGYtPntfY29kZXBhZ2V9ID0gJGNvZGVwYWdlOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2NvdW50cnkoKQorIworIyBTZWUgYWxzbyB0aGUgX3N0b3JlX2NvdW50cnkgbWV0aG9kLiBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGNvdW50cnkgY29kZS4KKyMgU29tZSBub24tZW5nbGlzaCB2ZXJzaW9ucyBvZiBFeGNlbCBtYXkgbmVlZCB0aGlzIHNldCB0byBzb21lIHZhbHVlIG90aGVyCisjIHRoYW4gMSA9ICJVbml0ZWQgU3RhdGVzIi4gSW4gZ2VuZXJhbCB0aGUgY291bnRyeSBjb2RlIGlzIGVxdWFsIHRvIHRoZQorIyBpbnRlcm5hdGlvbmFsIGRpYWxsaW5nIGNvZGUuCisjCitzdWIgc2V0X2NvdW50cnkgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfY291bnRyeX0gICA9ICRfWzBdIHx8IDE7Cit9CisKKworCisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZGVmaW5lX25hbWUoKQorIworIyBUT0RPLgorIworc3ViIGRlZmluZV9uYW1lIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRuYW1lICAgICAgICA9IHNoaWZ0OworICAgIG15ICRmb3JtdWxhICAgICA9IHNoaWZ0OworICAgIG15ICRlbmNvZGluZyAgICA9IHNoaWZ0IHx8IDA7CisgICAgbXkgJHNoZWV0X2luZGV4ID0gMDsKKyAgICBteSBAdG9rZW5zOworCisgICAgbXkgJGZ1bGxfbmFtZSAgID0gJG5hbWU7CisKKyAgICBpZiAoJG5hbWUgPX4gL14oLiopISguKikkLykgeworICAgICAgICBteSAkc2hlZXRuYW1lICAgPSAkMTsKKyAgICAgICAgJG5hbWUgICAgICAgICAgID0gJDI7CisgICAgICAgICRzaGVldF9pbmRleCAgICA9IDEgKyAkc2VsZi0+e19wYXJzZXJ9LT5fZ2V0X3NoZWV0X2luZGV4KCRzaGVldG5hbWUpOworICAgIH0KKworCisKKyAgICAjIFN0cmlwIHRoZSA9IHNpZ24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9ybXVsYSBzdHJpbmcKKyAgICAkZm9ybXVsYSAgICA9fiBzKF49KSgpOworCisgICAgIyBQYXJzZSB0aGUgZm9ybXVsYSB1c2luZyB0aGUgcGFyc2VyIGluIEZvcm11bGEucG0KKyAgICBteSAkcGFyc2VyICA9ICRzZWxmLT57X3BhcnNlcn07CisKKyAgICAjIEluIG9yZGVyIHRvIHJhaXNlIGZvcm11bGEgZXJyb3JzIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGNhbGxpbmcKKyAgICAjIHByb2dyYW0gd2UgdXNlIGFuIGV2YWwgYmxvY2sgYW5kIHJlLXJhaXNlIHRoZSBlcnJvciBmcm9tIGhlcmUuCisgICAgIworICAgIGV2YWwgeyBAdG9rZW5zID0gJHBhcnNlci0+cGFyc2VfZm9ybXVsYSgkZm9ybXVsYSkgfTsKKworICAgIGlmICgkQCkgeworICAgICAgICAkQCA9fiBzL1xuJC8vOyAgIyBTdHJpcCB0aGUgXG4gdXNlZCBpbiB0aGUgRm9ybXVsYS5wbSBkaWUoKQorICAgICAgICBjcm9hayAkQDsgICAgICAgIyBSZS1yYWlzZSB0aGUgZXJyb3IKKyAgICB9CisKKyAgICAjIEZvcmNlIDJkIHJhbmdlcyB0byBiZSBhIHJlZmVyZW5jZSBjbGFzcy4KKyAgICBzL19yZWYzZC9fcmVmM2RSLyAgICAgZm9yIEB0b2tlbnM7CisgICAgcy9fcmFuZ2UzZC9fcmFuZ2UzZFIvIGZvciBAdG9rZW5zOworCisKKyAgICAjIFBhcnNlIHRoZSB0b2tlbnMgaW50byBhIGZvcm11bGEgc3RyaW5nLgorICAgICRmb3JtdWxhID0gJHBhcnNlci0+cGFyc2VfdG9rZW5zKEB0b2tlbnMpOworCisKKworICAgICRmdWxsX25hbWUgPSBsYyAkZnVsbF9uYW1lOworCisgICAgcHVzaCBAeyRzZWxmLT57X2RlZmluZWRfbmFtZXN9fSwgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAgID0+ICRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyAgICA9PiAkZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0X2luZGV4ID0+ICRzaGVldF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXVsYSAgICAgPT4gJGZvcm11bGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgIG15ICRpbmRleCA9IHNjYWxhciBAeyRzZWxmLT57X2RlZmluZWRfbmFtZXN9fTsKKworICAgICRwYXJzZXItPnNldF9leHRfbmFtZSgkbmFtZSwgJGluZGV4KTsKK30KKworCisKKworCisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3Byb3BlcnRpZXMoKQorIworIyBTZXQgdGhlIGRvY3VtZW50IHByb3BlcnRpZXMgc3VjaCBhcyBUaXRsZSwgQXV0aG9yIGV0Yy4gVGhlc2UgYXJlIHdyaXR0ZW4gdG8KKyMgcHJvcGVydHkgc2V0cyBpbiB0aGUgT0xFIGNvbnRhaW5lci4KKyMKK3N1YiBzZXRfcHJvcGVydGllcyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICVwYXJhbTsKKworICAgICMgSWdub3JlIGlmIG5vIGFyZ3Mgd2VyZSBwYXNzZWQuCisgICAgcmV0dXJuIC0xIHVubGVzcyBAXzsKKworCisgICAgIyBBbGxvdyB0aGUgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgYXMgYSBoYXNoIG9yIGhhc2ggcmVmLgorICAgIGlmIChyZWYgJF9bMF0gZXEgJ0hBU0gnKSB7CisgICAgICAgICVwYXJhbSA9ICV7JF9bMF19OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJXBhcmFtID0gQF87CisgICAgfQorCisKKyAgICAjIExpc3Qgb2YgdmFsaWQgaW5wdXQgcGFyYW1ldGVycy4KKyAgICBteSAlcHJvcGVydGllcyA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXBhZ2UgICAgICA9PiBbMHgwMDAxLCAnVlRfSTInICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgICAgICAgICA9PiBbMHgwMDAyLCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdCAgICAgICA9PiBbMHgwMDAzLCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yICAgICAgICA9PiBbMHgwMDA0LCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZHMgICAgICA9PiBbMHgwMDA1LCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMgICAgICA9PiBbMHgwMDA2LCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9hdXRob3IgICA9PiBbMHgwMDA4LCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCAgICAgICA9PiBbMHgwMDBDLCAnVlRfRklMRVRJTUUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnkgICAgICA9PiBbMHgwMDAyLCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlciAgICAgICA9PiBbMHgwMDBFLCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueSAgICAgICA9PiBbMHgwMDBGLCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmOCAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAjIENoZWNrIGZvciB2YWxpZCBpbnB1dCBwYXJhbWV0ZXJzLgorICAgIGZvciBteSAkcGFyYW1ldGVyIChrZXlzICVwYXJhbSkgeworICAgICAgICBpZiAobm90IGV4aXN0cyAkcHJvcGVydGllc3skcGFyYW1ldGVyfSkgeworICAgICAgICAgICAgY2FycCAiVW5rbm93biBwYXJhbWV0ZXIgJyRwYXJhbWV0ZXInIGluIHNldF9wcm9wZXJ0aWVzKCkiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisKKyAgICAjIFNldCB0aGUgY3JlYXRpb24gdGltZSB1bmxlc3Mgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICAgIGlmICghZXhpc3RzICRwYXJhbXtjcmVhdGVkfSl7CisgICAgICAgICRwYXJhbXtjcmVhdGVkfSA9ICRzZWxmLT57X2xvY2FsdGltZX07CisgICAgfQorCisKKyAgICAjCisgICAgIyBDcmVhdGUgdGhlIFN1bW1hcnlJbmZvcm1hdGlvbiBwcm9wZXJ0eSBzZXQuCisgICAgIworCisgICAgIyBHZXQgdGhlIGNvZGVwYWdlIG9mIHRoZSBzdHJpbmdzIGluIHRoZSBwcm9wZXJ0eSBzZXQuCisgICAgbXkgQHN0cmluZ3MgICAgICA9IHF3KHRpdGxlIHN1YmplY3QgYXV0aG9yIGtleXdvcmRzIGNvbW1lbnRzIGxhc3RfYXV0aG9yKTsKKyAgICAkcGFyYW17Y29kZXBhZ2V9ID0gJHNlbGYtPl9nZXRfcHJvcGVydHlfc2V0X2NvZGVwYWdlKFwlcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcQHN0cmluZ3MpOworCisgICAgIyBDcmVhdGUgYW4gYXJyYXkgb2YgcHJvcGVydHkgc2V0IHZhbHVlcy4KKyAgICBteSBAcHJvcGVydHlfc2V0czsKKworICAgIGZvciBteSAkcHJvcGVydHkgKHF3KGNvZGVwYWdlIHRpdGxlICAgIHN1YmplY3QgICAgIGF1dGhvcgorICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzIGNvbW1lbnRzIGxhc3RfYXV0aG9yIGNyZWF0ZWQpKQorICAgIHsKKyAgICAgICAgaWYgKGV4aXN0cyAkcGFyYW17JHByb3BlcnR5fSAmJiBkZWZpbmVkICRwYXJhbXskcHJvcGVydHl9KSB7CisgICAgICAgICAgICBwdXNoIEBwcm9wZXJ0eV9zZXRzLCBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvcGVydGllc3skcHJvcGVydHl9LT5bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvcGVydGllc3skcHJvcGVydHl9LT5bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW17JHByb3BlcnR5fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgUGFjayB0aGUgcHJvcGVydHkgc2V0cy4KKyAgICAkc2VsZi0+e3N1bW1hcnl9ID0gY3JlYXRlX3N1bW1hcnlfcHJvcGVydHlfc2V0KFxAcHJvcGVydHlfc2V0cyk7CisKKworICAgICMKKyAgICAjIENyZWF0ZSB0aGUgRG9jU3VtbWFyeUluZm9ybWF0aW9uIHByb3BlcnR5IHNldC4KKyAgICAjCisKKyAgICAjIEdldCB0aGUgY29kZXBhZ2Ugb2YgdGhlIHN0cmluZ3MgaW4gdGhlIHByb3BlcnR5IHNldC4KKyAgICBAc3RyaW5ncyAgICAgICAgID0gcXcoY2F0ZWdvcnkgbWFuYWdlciBjb21wYW55KTsKKyAgICAkcGFyYW17Y29kZXBhZ2V9ID0gJHNlbGYtPl9nZXRfcHJvcGVydHlfc2V0X2NvZGVwYWdlKFwlcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcQHN0cmluZ3MpOworCisgICAgIyBDcmVhdGUgYW4gYXJyYXkgb2YgcHJvcGVydHkgc2V0IHZhbHVlcy4KKyAgICBAcHJvcGVydHlfc2V0cyA9ICgpOworCisgICAgZm9yIG15ICRwcm9wZXJ0eSAocXcoY29kZXBhZ2UgY2F0ZWdvcnkgbWFuYWdlciBjb21wYW55KSkKKyAgICB7CisgICAgICAgIGlmIChleGlzdHMgJHBhcmFteyRwcm9wZXJ0eX0gJiYgZGVmaW5lZCAkcGFyYW17JHByb3BlcnR5fSkgeworICAgICAgICAgICAgcHVzaCBAcHJvcGVydHlfc2V0cywgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3BlcnRpZXN7JHByb3BlcnR5fS0+WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3BlcnRpZXN7JHByb3BlcnR5fS0+WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFteyRwcm9wZXJ0eX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFBhY2sgdGhlIHByb3BlcnR5IHNldHMuCisgICAgJHNlbGYtPntkb2Nfc3VtbWFyeX0gPSBjcmVhdGVfZG9jX3N1bW1hcnlfcHJvcGVydHlfc2V0KFxAcHJvcGVydHlfc2V0cyk7CisKKyAgICAjIFNldCBhIGZsYWcgZm9yIHdoZW4gdGhlIGZpbGVzIGlzIHdyaXR0ZW4uCisgICAgJHNlbGYtPntfYWRkX2RvY19wcm9wZXJ0aWVzfSA9IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZ2V0X3Byb3BlcnR5X3NldF9jb2RlcGFnZSgpCisjCisjIEdldCB0aGUgY2hhcmFjdGVyIGNvZGVwYWdlIHVzZWQgYnkgdGhlIHN0cmluZ3MgaW4gYSBwcm9wZXJ0eSBzZXQuIElmIG9uZSBvZgorIyB0aGUgc3RyaW5ncyB1c2VkIGlzIHV0ZjggdGhlbiB0aGUgY29kZXBhZ2UgaXMgbWFya2VkIGFzIHV0ZjguIE90aGVyd2lzZQorIyBMYXRpbiAxIGlzIHVzZWQgKGFsdGhvdWdoIGluIG91ciBjYXNlIHRoaXMgaXMgbGltaXRlZCB0byA3Yml0IEFTQ0lJKS4KKyMKK3N1YiBfZ2V0X3Byb3BlcnR5X3NldF9jb2RlcGFnZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRwYXJhbXMgICAgICA9ICRfWzBdOworICAgIG15ICRzdHJpbmdzICAgICA9ICRfWzFdOworCisgICAgIyBBbGxvdyBmb3IgbWFudWFsbHkgbWFya2VkIHV0Zjggc3RyaW5ncy4KKyAgICByZXR1cm4gMHhGREU5IGlmIGRlZmluZWQgJHBhcmFtcy0+e3V0Zjh9OworCisgICAgIyBDaGVjayBmb3IgdXRmOCBzdHJpbmdzIGluIHBlcmwgNS44LgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKyAgICAgICAgZm9yIG15ICRzdHJpbmcgKEB7JHN0cmluZ3MgfSkgeworICAgICAgICAgICAgbmV4dCB1bmxlc3MgZXhpc3RzICRwYXJhbXMtPnskc3RyaW5nfTsKKyAgICAgICAgICAgIHJldHVybiAweEZERTkgaWYgRW5jb2RlOjppc191dGY4KCRwYXJhbXMtPnskc3RyaW5nfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMHgwNEU0OyAjIERlZmF1bHQgY29kZXBhZ2UsIExhdGluIDEuCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfd29ya2Jvb2soKQorIworIyBBc3NlbWJsZSB3b3Jrc2hlZXRzIGludG8gYSB3b3JrYm9vayBhbmQgc2VuZCB0aGUgQklGRiBkYXRhIHRvIGFuIE9MRQorIyBzdG9yYWdlLgorIworc3ViIF9zdG9yZV93b3JrYm9vayB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBBZGQgYSBkZWZhdWx0IHdvcmtzaGVldCBpZiBub24gaGF2ZSBiZWVuIGFkZGVkLgorICAgICRzZWxmLT5hZGRfd29ya3NoZWV0KCkgaWYgbm90IEB7JHNlbGYtPntfd29ya3NoZWV0c319OworCisgICAgIyBDYWxjdWxhdGUgc2l6ZSByZXF1aXJlZCBmb3IgTVNPIHJlY29yZHMgYW5kIHVwZGF0ZSB3b3Jrc2hlZXRzLgorICAgICRzZWxmLT5fY2FsY19tc29fc2l6ZXMoKTsKKworICAgICMgRW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIHdvcmtzaGVldCBoYXMgYmVlbiBzZWxlY3RlZC4KKyAgICBpZiAoJHNlbGYtPntfYWN0aXZlc2hlZXR9ID09IDApIHsKKyAgICAgICAgQHskc2VsZi0+e193b3Jrc2hlZXRzfX1bMF0tPntfc2VsZWN0ZWR9ID0gMTsKKyAgICAgICAgQHskc2VsZi0+e193b3Jrc2hlZXRzfX1bMF0tPntfaGlkZGVufSAgID0gMDsKKyAgICB9CisKKyAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIHNoZWV0IHRhYnMgYW5kIHNldCB0aGUgYWN0aXZlIHNoZWV0LgorICAgIGZvcmVhY2ggbXkgJHNoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworICAgICAgICAkc2VsZi0+e19zZWxlY3RlZH0rKyBpZiAkc2hlZXQtPntfc2VsZWN0ZWR9OworICAgICAgICAkc2hlZXQtPntfYWN0aXZlfSA9IDEgaWYgJHNoZWV0LT57X2luZGV4fSA9PSAkc2VsZi0+e19hY3RpdmVzaGVldH07CisgICAgfQorCisgICAgIyBBZGQgV29ya2Jvb2sgZ2xvYmFscworICAgICRzZWxmLT5fc3RvcmVfYm9mKDB4MDAwNSk7CisgICAgJHNlbGYtPl9zdG9yZV9jb2RlcGFnZSgpOworICAgICRzZWxmLT5fc3RvcmVfd2luZG93MSgpOworICAgICRzZWxmLT5fc3RvcmVfaGlkZW9iaigpOworICAgICRzZWxmLT5fc3RvcmVfMTkwNCgpOworICAgICRzZWxmLT5fc3RvcmVfYWxsX2ZvbnRzKCk7CisgICAgJHNlbGYtPl9zdG9yZV9hbGxfbnVtX2Zvcm1hdHMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FsbF94ZnMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FsbF9zdHlsZXMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BhbGV0dGUoKTsKKworICAgICMgQ2FsY3VsYXRlIHRoZSBvZmZzZXRzIHJlcXVpcmVkIGJ5IHRoZSBCT1VORFNIRUVUIHJlY29yZHMKKyAgICAkc2VsZi0+X2NhbGNfc2hlZXRfb2Zmc2V0cygpOworCisgICAgIyBBZGQgQk9VTkRTSEVFVCByZWNvcmRzLgorICAgIGZvcmVhY2ggbXkgJHNoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX2JvdW5kc2hlZXQoJHNoZWV0LT57X25hbWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNoZWV0LT57X29mZnNldH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2hlZXQtPntfc2hlZXRfdHlwZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2hlZXQtPntfaGlkZGVufSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaGVldC0+e19lbmNvZGluZ30pOworICAgIH0KKworICAgICMgTk9URTogSWYgYW55IHJlY29yZHMgYXJlIGFkZGVkIGJldHdlZW4gaGVyZSBhbmQgRU9GIHRoZQorICAgICMgX2NhbGNfc2hlZXRfb2Zmc2V0cygpIHNob3VsZCBiZSB1cGRhdGVkIHRvIGluY2x1ZGUgdGhlIG5ldyBsZW5ndGguCisgICAgJHNlbGYtPl9zdG9yZV9jb3VudHJ5KCk7CisgICAgaWYgKCRzZWxmLT57X2V4dF9yZWZfY291bnR9KSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfc3VwYm9vaygpOworICAgICAgICAkc2VsZi0+X3N0b3JlX2V4dGVybnNoZWV0KCk7CisgICAgICAgICRzZWxmLT5fc3RvcmVfbmFtZXMoKTsKKyAgICB9CisgICAgJHNlbGYtPl9hZGRfbXNvX2RyYXdpbmdfZ3JvdXAoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3NoYXJlZF9zdHJpbmdzKCk7CisgICAgJHNlbGYtPl9zdG9yZV9leHRzc3QoKTsKKworICAgICMgRW5kIFdvcmtib29rIGdsb2JhbHMKKyAgICAkc2VsZi0+X3N0b3JlX2VvZigpOworCisgICAgIyBTdG9yZSB0aGUgd29ya2Jvb2sgaW4gYW4gT0xFIGNvbnRhaW5lcgorICAgIHJldHVybiAkc2VsZi0+X3N0b3JlX09MRV9maWxlKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfT0xFX2ZpbGUoKQorIworIyBTdG9yZSB0aGUgd29ya2Jvb2sgaW4gYW4gT0xFIGNvbnRhaW5lciB1c2luZyB0aGUgZGVmYXVsdCBoYW5kbGVyIG9yIHVzaW5nCisjIE9MRTo6U3RvcmFnZV9MaXRlIGlmIHRoZSB3b3JrYm9vayBkYXRhIGlzID4gfiA3TUIuCisjCitzdWIgX3N0b3JlX09MRV9maWxlIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJG1heHNpemUgPSA3XzA4N18xMDQ7CisKKyAgICBpZiAoISRzZWxmLT57X2FkZF9kb2NfcHJvcGVydGllc30gJiYgJHNlbGYtPntfYmlmZnNpemV9IDw9ICRtYXhzaXplKSB7CisgICAgICAgICMgV3JpdGUgdGhlIE9MRSBmaWxlIHVzaW5nIE9MRXdyaXRlciBpZiBkYXRhIDw9IDdNQgorICAgICAgICBteSAkT0xFICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpPTEV3cml0ZXItPm5ldygkc2VsZi0+e19maF9vdXR9KTsKKworICAgICAgICAjIFdyaXRlIHRoZSBCSUZGIGRhdGEgd2l0aG91dCB0aGUgT0xFIGNvbnRhaW5lciBmb3IgdGVzdGluZy4KKyAgICAgICAgJE9MRS0+e19iaWZmX29ubHl9ID0gJHNlbGYtPntfYmlmZl9vbmx5fTsKKworICAgICAgICAjIEluZGljYXRlIHRoYXQgd2UgY3JlYXRlZCB0aGUgZmlsZWhhbmRsZSBhbmQgd2FudCB0byBjbG9zZSBpdC4KKyAgICAgICAgJE9MRS0+e19pbnRlcm5hbF9maH0gPSAkc2VsZi0+e19pbnRlcm5hbF9maH07CisKKyAgICAgICAgJE9MRS0+c2V0X3NpemUoJHNlbGYtPntfYmlmZnNpemV9KTsKKyAgICAgICAgJE9MRS0+d3JpdGVfaGVhZGVyKCk7CisKKyAgICAgICAgd2hpbGUgKG15ICR0bXAgPSAkc2VsZi0+Z2V0X2RhdGEoKSkgeworICAgICAgICAgICAgJE9MRS0+d3JpdGUoJHRtcCk7CisgICAgICAgIH0KKworICAgICAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKEB7JHNlbGYtPntfd29ya3NoZWV0c319KSB7CisgICAgICAgICAgICB3aGlsZSAobXkgJHRtcCA9ICR3b3Jrc2hlZXQtPmdldF9kYXRhKCkpIHsKKyAgICAgICAgICAgICAgICAkT0xFLT53cml0ZSgkdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkT0xFLT5jbG9zZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBXcml0ZSB0aGUgT0xFIGZpbGUgdXNpbmcgT0xFOjpTdG9yYWdlX0xpdGUgaWYgZGF0YSA+IDdNQgorICAgICAgICBldmFsIHsgcmVxdWlyZSBPTEU6OlN0b3JhZ2VfTGl0ZSB9OworCisgICAgICAgIGlmIChub3QgJEApIHsKKworICAgICAgICAgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICAgICAgbG9jYWwgJFwgPSB1bmRlZjsKKworICAgICAgICAgICAgbXkgQHN0cmVhbXM7CisKKyAgICAgICAgICAgICMgQ3JlYXRlIHRoZSBXb3JrYm9vayBzdHJlYW0uCisgICAgICAgICAgICBteSAkc3RyZWFtICAgPSBwYWNrICd2KicsIHVucGFjayAnQyonLCAnV29ya2Jvb2snOworICAgICAgICAgICAgbXkgJHdvcmtib29rID0gT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6RmlsZS0+bmV3RmlsZSgkc3RyZWFtKTsKKworICAgICAgICAgICAgd2hpbGUgKG15ICR0bXAgPSAkc2VsZi0+Z2V0X2RhdGEoKSkgeworICAgICAgICAgICAgICAgICR3b3JrYm9vay0+YXBwZW5kKCR0bXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKEB7JHNlbGYtPntfd29ya3NoZWV0c319KSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKG15ICR0bXAgPSAkd29ya3NoZWV0LT5nZXRfZGF0YSgpKSB7CisgICAgICAgICAgICAgICAgICAgICR3b3JrYm9vay0+YXBwZW5kKCR0bXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVzaCBAc3RyZWFtcywgJHdvcmtib29rOworCisKKyAgICAgICAgICAgICMgQ3JlYXRlIHRoZSBwcm9wZXJ0aWVzIHN0cmVhbXMsIGlmIGFueS4KKyAgICAgICAgICAgIGlmICgkc2VsZi0+e19hZGRfZG9jX3Byb3BlcnRpZXN9KSB7CisgICAgICAgICAgICAgICAgbXkgJHN0cmVhbTsKKyAgICAgICAgICAgICAgICBteSAkc3VtbWFyeTsKKworICAgICAgICAgICAgICAgICRzdHJlYW0gID0gcGFjayAndionLCB1bnBhY2sgJ0MqJywgIlw1U3VtbWFyeUluZm9ybWF0aW9uIjsKKyAgICAgICAgICAgICAgICAkc3VtbWFyeSA9ICRzZWxmLT57c3VtbWFyeX07CisgICAgICAgICAgICAgICAgJHN1bW1hcnkgPSBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpGaWxlLT5uZXcoJHN0cmVhbSwgJHN1bW1hcnkpOworICAgICAgICAgICAgICAgIHB1c2ggQHN0cmVhbXMsICRzdW1tYXJ5OworCisgICAgICAgICAgICAgICAgJHN0cmVhbSAgPSBwYWNrICd2KicsIHVucGFjayAnQyonLCAiXDVEb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbiI7CisgICAgICAgICAgICAgICAgJHN1bW1hcnkgPSAkc2VsZi0+e2RvY19zdW1tYXJ5fTsKKyAgICAgICAgICAgICAgICAkc3VtbWFyeSA9IE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OkZpbGUtPm5ldygkc3RyZWFtLCAkc3VtbWFyeSk7CisgICAgICAgICAgICAgICAgcHVzaCBAc3RyZWFtcywgJHN1bW1hcnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgQ3JlYXRlIHRoZSBPTEUgcm9vdCBkb2N1bWVudCBhbmQgYWRkIHRoZSBzdWJzdHJlYW1zLgorICAgICAgICAgICAgbXkgQGxvY2FsdGltZSA9IEB7ICRzZWxmLT57X2xvY2FsdGltZX0gfTsKKyAgICAgICAgICAgIHNwbGljZShAbG9jYWx0aW1lLCA2KTsKKworICAgICAgICAgICAgbXkgJG9sZV9yb290ID0gT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6Um9vdC0+bmV3KFxAbG9jYWx0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxAbG9jYWx0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxAc3RyZWFtcyk7CisgICAgICAgICAgICAkb2xlX3Jvb3QtPnNhdmUoJHNlbGYtPntfZmlsZW5hbWV9KTsKKworCisgICAgICAgICAgICAjIENsb3NlIHRoZSBmaWxlaGFuZGxlIGlmIGl0IHdhcyBjcmVhdGVkIGludGVybmFsbHkuCisgICAgICAgICAgICByZXR1cm4gQ09SRTo6Y2xvc2UoJHNlbGYtPntfZmhfb3V0fSkgaWYgJHNlbGYtPntfaW50ZXJuYWxfZmh9OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBGaWxlIGluIGdyZWF0ZXIgdGhhbiBsaW1pdCwgc2V0ICQhIHRvICJGaWxlIHRvbyBsYXJnZSIKKyAgICAgICAgICAgICQhID0gMjc7ICMgUGVybCBlcnJvciBjb2RlICJGaWxlIHRvbyBsYXJnZSIKKworICAgICAgICAgICAgY3JvYWsgIk1heGltdW0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZmlsZXNpemUsICRtYXhzaXplIGJ5dGVzLCAiLgorICAgICAgICAgICAgICAgICAgImV4Y2VlZGVkLiBUbyBjcmVhdGUgZmlsZXMgYmlnZ2VyIHRoYW4gdGhpcyBsaW1pdCBwbGVhc2UgIiAgLgorICAgICAgICAgICAgICAgICAgImluc3RhbGwgT0xFOjpTdG9yYWdlX0xpdGVcbiI7CisKKyAgICAgICAgICAgICMgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2FsY19zaGVldF9vZmZzZXRzKCkKKyMKKyMgQ2FsY3VsYXRlIFdvcmtzaGVldCBCT0Ygb2Zmc2V0cyByZWNvcmRzIGZvciB1c2UgaW4gdGhlIEJPVU5EU0hFRVQgcmVjb3Jkcy4KKyMKK3N1YiBfY2FsY19zaGVldF9vZmZzZXRzIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJEJPRiAgICAgPSAxMjsKKyAgICBteSAkRU9GICAgICA9IDQ7CisgICAgbXkgJG9mZnNldCAgPSAkc2VsZi0+e19kYXRhc2l6ZX07CisKKyAgICAjIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBDT1VOVFJZIHJlY29yZAorICAgICRvZmZzZXQgKz0gODsKKworICAgICMgQWRkIHRoZSBsZW5ndGggb2YgdGhlIFNTVCBhbmQgYXNzb2NpYXRlZCBDT05USU5VRXMKKyAgICAkb2Zmc2V0ICs9ICRzZWxmLT5fY2FsY3VsYXRlX3NoYXJlZF9zdHJpbmdfc2l6ZXMoKTsKKworICAgICMgQWRkIHRoZSBsZW5ndGggb2YgdGhlIEVYVFNTVCByZWNvcmQuCisgICAgJG9mZnNldCArPSAkc2VsZi0+X2NhbGN1bGF0ZV9leHRzc3Rfc2l6ZSgpOworCisgICAgIyBBZGQgdGhlIGxlbmd0aCBvZiB0aGUgU1VQQk9PSywgRVhURVJOU0hFRVQgYW5kIE5BTUUgcmVjb3JkcworICAgICRvZmZzZXQgKz0gJHNlbGYtPl9jYWxjdWxhdGVfZXh0ZXJuX3NpemVzKCk7CisKKyAgICAjIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBNU09EUkFXSU5HR1JPVVAgcmVjb3JkcyBpbmNsdWRpbmcgYW4gZXh0cmEgNCBieXRlcworICAgICMgZm9yIGFueSBDT05USU5VRSBoZWFkZXJzLiBTZWUgX2FkZF9tc29fZHJhd2luZ19ncm91cF9jb250aW51ZSgpLgorICAgIG15ICRtc29fc2l6ZSA9ICRzZWxmLT57X21zb19zaXplfTsKKyAgICAkbXNvX3NpemUgKz0gNCAqIGludCgoJG1zb19zaXplIC0xKSAvICRzZWxmLT57X2xpbWl0fSk7CisgICAgJG9mZnNldCAgICs9ICRtc29fc2l6ZSA7CisKKyAgICBmb3JlYWNoIG15ICRzaGVldCAoQHskc2VsZi0+e193b3Jrc2hlZXRzfX0pIHsKKyAgICAgICAgJG9mZnNldCArPSAkQk9GICsgbGVuZ3RoKCRzaGVldC0+e19uYW1lfSk7CisgICAgfQorCisgICAgJG9mZnNldCArPSAkRU9GOworCisgICAgZm9yZWFjaCBteSAkc2hlZXQgKEB7JHNlbGYtPntfd29ya3NoZWV0c319KSB7CisgICAgICAgICRzaGVldC0+e19vZmZzZXR9ID0gJG9mZnNldDsKKyAgICAgICAgJHNoZWV0LT5fY2xvc2UoKTsKKyAgICAgICAgJG9mZnNldCArPSAkc2hlZXQtPntfZGF0YXNpemV9OworICAgIH0KKworICAgICRzZWxmLT57X2JpZmZzaXplfSA9ICRvZmZzZXQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2FsY19tc29fc2l6ZXMoKQorIworIyBDYWxjdWxhdGUgdGhlIE1TT0RSQVdJTkdHUk9VUCBzaXplcyBhbmQgdGhlIGluZGV4ZXMgb2YgdGhlIFdvcmtzaGVldAorIyBNU09EUkFXSU5HIHJlY29yZHMuCisjCisjIEluIHRoZSBmb2xsb3dpbmcgU1BJRCBpcyBzaGFwZSBpZCwgYWNjb3JkaW5nIHRvIEVzY2hlciBub21lbmNsYXR1cmUuCisjCitzdWIgX2NhbGNfbXNvX3NpemVzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRtc29fc2l6ZSAgICAgICAgPSAwOyAgICAjIFNpemUgb2YgdGhlIE1TT0RSQVdJTkdHUk9VUCByZWNvcmQKKyAgICBteSAkc3RhcnRfc3BpZCAgICAgID0gMTAyNDsgIyBJbml0aWFsIHNwaWQgZm9yIGVhY2ggc2hlZXQKKyAgICBteSAkbWF4X3NwaWQgICAgICAgID0gMTAyNDsgIyBzcGlkTWF4CisgICAgbXkgJG51bV9jbHVzdGVycyAgICA9IDE7ICAgICMgY2lkY2wKKyAgICBteSAkc2hhcGVzX3NhdmVkICAgID0gMDsgICAgIyBjc3BTYXZlZAorICAgIG15ICRkcmF3aW5nc19zYXZlZCAgPSAwOyAgICAjIGNkZ1NhdmVkCisgICAgbXkgQGNsdXN0ZXJzICAgICAgICA9ICgpOworCisKKyAgICAkc2VsZi0+X3Byb2Nlc3NfaW1hZ2VzKCk7CisKKyAgICAjIEFkZCBCc3RvcmUgY29udGFpbmVyIHNpemUgaWYgdGhlcmUgYXJlIGltYWdlcy4KKyAgICAkbXNvX3NpemUgKz0gOCBpZiBAeyRzZWxmLT57X2ltYWdlc19kYXRhfX07CisKKworICAgICMgSXRlcmF0ZSB0aHJvdWdoIHRoZSB3b3Jrc2hlZXRzLCBjYWxjdWxhdGUgdGhlIE1TT0RSQVdJTkdHUk9VUCBwYXJhbWV0ZXJzCisgICAgIyBhbmQgc3BhY2UgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIHJlY29yZCBhbmQgdGhlIE1TT0RSQVdJTkcgcGFyYW1ldGVycworICAgICMgcmVxdWlyZWQgYnkgZWFjaCB3b3Jrc2hlZXQuCisgICAgIworICAgIGZvcmVhY2ggbXkgJHNoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworICAgICAgICBuZXh0IHVubGVzcyAkc2hlZXQtPntfc2hlZXRfdHlwZX0gPT0gMHgwMDAwOyAjIElnbm9yZSBjaGFydHMuCisKKyAgICAgICAgbXkgJG51bV9pbWFnZXMgICAgID0gJHNoZWV0LT57X251bV9pbWFnZXN9IHx8IDA7CisgICAgICAgIG15ICRpbWFnZV9tc29fc2l6ZSA9ICRzaGVldC0+e19pbWFnZV9tc29fc2l6ZX0gfHwgMDsKKyAgICAgICAgbXkgJG51bV9jb21tZW50cyAgID0gJHNoZWV0LT5fcHJlcGFyZV9jb21tZW50cygpOworICAgICAgICBteSAkbnVtX2NoYXJ0cyAgICAgPSAkc2hlZXQtPl9wcmVwYXJlX2NoYXJ0cygpOworICAgICAgICBteSAkbnVtX2ZpbHRlcnMgICAgPSAkc2hlZXQtPntfZmlsdGVyX2NvdW50fTsKKworICAgICAgICBuZXh0IHVubGVzcyAkbnVtX2ltYWdlcyArICRudW1fY29tbWVudHMgKyAkbnVtX2NoYXJ0cyArJG51bV9maWx0ZXJzOworCisKKyAgICAgICAgIyBJbmNsdWRlIDEgcGFyZW50IE1TT0RSQVdJTkcgc2hhcGUsIHBlciBzaGVldCwgaW4gdGhlIHNoYXBlIGNvdW50LgorICAgICAgICBteSAkbnVtX3NoYXBlcyAgICs9IDEgKyAkbnVtX2ltYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAkbnVtX2NvbW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICRudW1fY2hhcnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICRudW1fZmlsdGVyczsKKyAgICAgICAgICAgJHNoYXBlc19zYXZlZCArPSAkbnVtX3NoYXBlczsKKyAgICAgICAgICAgJG1zb19zaXplICAgICArPSAkaW1hZ2VfbXNvX3NpemU7CisKKworICAgICAgICAjIEFkZCBhIGRyYXdpbmcgb2JqZWN0IGZvciBlYWNoIHNoZWV0IHdpdGggY29tbWVudHMuCisgICAgICAgICRkcmF3aW5nc19zYXZlZCsrOworCisKKyAgICAgICAgIyBGb3IgZWFjaCBzaGVldCBzdGFydCB0aGUgc3BpZHMgYXQgdGhlIG5leHQgMTAyNCBpbnRlcnZhbC4KKyAgICAgICAgJG1heF9zcGlkICAgPSAxMDI0ICogKDEgKyBpbnQoKCRtYXhfc3BpZCAtMSkvMTAyNCkpOworICAgICAgICAkc3RhcnRfc3BpZCA9ICRtYXhfc3BpZDsKKworCisgICAgICAgICMgTWF4IHNwaWQgZm9yIGVhY2ggc2hlZXQgYW5kIGV2ZW50dWFsbHkgZm9yIHRoZSB3b3JrYm9vay4KKyAgICAgICAgJG1heF9zcGlkICArPSAkbnVtX3NoYXBlczsKKworCisgICAgICAgICMgU3RvcmUgdGhlIGNsdXN0ZXIgaWRzCisgICAgICAgIGZvciAobXkgJGkgPSAkbnVtX3NoYXBlczsgJGkgPiAwOyAkaSAtPSAxMDI0KSB7CisgICAgICAgICAgICAkbnVtX2NsdXN0ZXJzICArPSAxOworICAgICAgICAgICAgJG1zb19zaXplICAgICAgKz0gODsKKyAgICAgICAgICAgIG15ICRzaXplICAgICAgICA9ICRpID4gMTAyNCA/IDEwMjQgOiAkaTsKKworICAgICAgICAgICAgcHVzaCBAY2x1c3RlcnMsIFskZHJhd2luZ3Nfc2F2ZWQsICRzaXplXTsKKyAgICAgICAgfQorCisKKyAgICAgICAgIyBQYXNzIGNhbGN1bGF0ZWQgdmFsdWVzIGJhY2sgdG8gdGhlIHdvcmtzaGVldAorICAgICAgICAkc2hlZXQtPntfb2JqZWN0X2lkc30gPSBbJHN0YXJ0X3NwaWQsICRkcmF3aW5nc19zYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbnVtX3NoYXBlcywgJG1heF9zcGlkIC0xXTsKKyAgICB9CisKKworICAgICMgQ2FsY3VsYXRlIHRoZSBNU09EUkFXSU5HR1JPVVAgc2l6ZSBpZiB3ZSBoYXZlIHN0b3JlZCBzb21lIHNoYXBlcy4KKyAgICAkbXNvX3NpemUgICAgICAgICAgICAgICs9IDg2IGlmICRtc29fc2l6ZTsgIyBTbWFsbGVzdCBzaXplIGlzIDg2Kzg9OTQKKworCisgICAgJHNlbGYtPntfbXNvX3NpemV9ICAgICAgPSAkbXNvX3NpemU7CisgICAgJHNlbGYtPntfbXNvX2NsdXN0ZXJzfSAgPSBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXhfc3BpZCwgJG51bV9jbHVzdGVycywgJHNoYXBlc19zYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRyYXdpbmdzX3NhdmVkLCBbQGNsdXN0ZXJzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKK30KKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3Byb2Nlc3NfaW1hZ2VzKCkKKyMKKyMgV2UgbmVlZCB0byBwcm9jZXNzIGVhY2ggaW1hZ2UgaW4gZWFjaCB3b3Jrc2hlZXQgYW5kIGV4dHJhY3QgaW5mb3JtYXRpb24uCisjIFNvbWUgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgYW5kIHVzZWQgaW4gdGhlIFdvcmtib29rIGFuZCBzb21lIGlzCisjIHBhc3NlZCBiYWNrIGludG8gZWFjaCBXb3Jrc2hlZXQuIFRoZSBvdmVyYWxsIHNpemUgZm9yIHRoZSBpbWFnZSByZWxhdGVkCisjIEJJRkYgc3RydWN0dXJlcyBpbiB0aGUgV29ya2Jvb2sgaXMgY2FsY3VsYXRlZCBoZXJlLgorIworIyBNU08gc2l6ZSA9ICA4IGJ5dGVzIGZvciBic3RvcmVfY29udGFpbmVyICsKKyMgICAgICAgICAgICA0NCBieXRlcyBmb3IgYmxpcF9zdG9yZV9lbnRyeSArCisjICAgICAgICAgICAgMjUgYnl0ZXMgZm9yIGJsaXAKKyMgICAgICAgICAgPSA3NyArIGltYWdlIHNpemUuCisjCitzdWIgX3Byb2Nlc3NfaW1hZ2VzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAlaW1hZ2VzX3NlZW47CisgICAgbXkgQGltYWdlX2RhdGE7CisgICAgbXkgQHByZXZpb3VzX2ltYWdlczsKKyAgICBteSAkaW1hZ2VfaWQgICAgPSAxOworICAgIG15ICRpbWFnZXNfc2l6ZSA9IDA7CisKKworICAgIGZvcmVhY2ggbXkgJHNoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworICAgICAgICBuZXh0IHVubGVzcyAkc2hlZXQtPntfc2hlZXRfdHlwZX0gPT0gMHgwMDAwOyAjIElnbm9yZSBjaGFydHMuCisgICAgICAgIG5leHQgdW5sZXNzICRzaGVldC0+X3ByZXBhcmVfaW1hZ2VzKCk7CisKKyAgICAgICAgbXkgJG51bV9pbWFnZXMgICAgICA9IDA7CisgICAgICAgIG15ICRpbWFnZV9tc29fc2l6ZSAgPSAwOworCisKKyAgICAgICAgZm9yIG15ICRpbWFnZV9yZWYgKEB7JHNoZWV0LT57X2ltYWdlc19hcnJheX19KSB7CisgICAgICAgICAgICBteSAkZmlsZW5hbWUgPSAkaW1hZ2VfcmVmLT5bMl07CisgICAgICAgICAgICAkbnVtX2ltYWdlcysrOworCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIEZvciBlYWNoIFdvcmtzaGVldCBpbWFnZSB3ZSBnZXQgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzCisgICAgICAgICAgICAjIFsKKyAgICAgICAgICAgICMgICAkcm93LAorICAgICAgICAgICAgIyAgICRjb2wsCisgICAgICAgICAgICAjICAgJG5hbWUsCisgICAgICAgICAgICAjICAgJHhfb2Zmc2V0LAorICAgICAgICAgICAgIyAgICR5X29mZnNldCwKKyAgICAgICAgICAgICMgICAkc2NhbGVfeCwKKyAgICAgICAgICAgICMgICAkc2NhbGVfeSwKKyAgICAgICAgICAgICMgXQorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBBbmQgd2UgYWRkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjICAgJGltYWdlX2lkLAorICAgICAgICAgICAgIyAgICR0eXBlLAorICAgICAgICAgICAgIyAgICR3aWR0aCwKKyAgICAgICAgICAgICMgICAkaGVpZ2h0OworCisgICAgICAgICAgICBpZiAobm90IGV4aXN0cyAkaW1hZ2VzX3NlZW57JGZpbGVuYW1lfSkgeworICAgICAgICAgICAgICAgICMgVE9ETyBzaG91bGQgYWxzbyBtYXRjaCBzZWVuIGltYWdlcyBiYXNlZCBvbiBjaGVja3N1bS4KKworICAgICAgICAgICAgICAgICMgT3BlbiB0aGUgaW1hZ2UgZmlsZSBhbmQgaW1wb3J0IHRoZSBkYXRhLgorICAgICAgICAgICAgICAgIG15ICRmaCA9IEZpbGVIYW5kbGUtPm5ldygkZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIGNyb2FrICJDb3VsZG4ndCBpbXBvcnQgJGZpbGVuYW1lOiAkISIgdW5sZXNzIGRlZmluZWQgJGZoOworICAgICAgICAgICAgICAgIGJpbm1vZGUgJGZoOworCisgICAgICAgICAgICAgICAgIyBTbHVycCB0aGUgZmlsZSBpbnRvIGEgc3RyaW5nIGFuZCBkbyBzb21lIHNpemUgY2FsY3MuCisgICAgICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gZG8ge2xvY2FsICQvOyA8JGZoPn07CisgICAgICAgICAgICAgICAgbXkgJHNpemUgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgICAgICAgICAgICAgIG15ICRjaGVja3N1bTEgICA9ICRzZWxmLT5faW1hZ2VfY2hlY2tzdW0oJGRhdGEsICRpbWFnZV9pZCk7CisgICAgICAgICAgICAgICAgbXkgJGNoZWNrc3VtMiAgID0gJGNoZWNrc3VtMTsKKyAgICAgICAgICAgICAgICBteSAkcmVmX2NvdW50ICAgPSAxOworCisKKyAgICAgICAgICAgICAgICAjIFByb2Nlc3MgdGhlIGltYWdlIGFuZCBleHRyYWN0IGRpbWVuc2lvbnMuCisgICAgICAgICAgICAgICAgbXkgKCR0eXBlLCAkd2lkdGgsICRoZWlnaHQpOworCisgICAgICAgICAgICAgICAgIyBUZXN0IGZvciBQTkdzLi4uCisgICAgICAgICAgICAgICAgaWYgICAgKHVucGFjaygneCBBMycsICRkYXRhKSBlcSAnUE5HJykgeworICAgICAgICAgICAgICAgICAgICAoJHR5cGUsICR3aWR0aCwgJGhlaWdodCkgPSAkc2VsZi0+X3Byb2Nlc3NfcG5nKCRkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIyBUZXN0IGZvciBKRklGIGFuZCBFeGlmIEpQRUdzLi4uCisgICAgICAgICAgICAgICAgZWxzaWYgKCAodW5wYWNrKCduJywgJGRhdGEpID09IDB4RkZEOCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICh1bnBhY2soJ3g2IEE0JywgJGRhdGEpIGVxICdKRklGJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnBhY2soJ3g2IEE0JywgJGRhdGEpIGVxICdFeGlmJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKCR0eXBlLCAkd2lkdGgsICRoZWlnaHQpID0gJHNlbGYtPl9wcm9jZXNzX2pwZygkZGF0YSwgJGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIyBUZXN0IGZvciBCTVBzLi4uCisgICAgICAgICAgICAgICAgZWxzaWYgKHVucGFjaygnQTInLCAgICRkYXRhKSBlcSAnQk0nKSB7CisgICAgICAgICAgICAgICAgICAgICgkdHlwZSwgJHdpZHRoLCAkaGVpZ2h0KSA9ICRzZWxmLT5fcHJvY2Vzc19ibXAoJGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgMTQgYnl0ZSBoZWFkZXIgb2YgdGhlIEJNUCBpcyBzdHJpcHBlZCBvZmYuCisgICAgICAgICAgICAgICAgICAgICRkYXRhICAgICAgID0gc3Vic3RyICRkYXRhLCAxNDsKKworICAgICAgICAgICAgICAgICAgICAjIEEgY2hlY2tzdW0gb2YgdGhlIG5ldyBpbWFnZSBkYXRhIGlzIGFsc28gcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgICRjaGVja3N1bTIgID0gJHNlbGYtPl9pbWFnZV9jaGVja3N1bSgkZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZV9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgICAgICAjIEFkanVzdCBzaXplIC0xNCAoaGVhZGVyKSArIDE2IChleHRyYSBjaGVja3N1bSkuCisgICAgICAgICAgICAgICAgICAgICRzaXplICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjcm9hayAiVW5zdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0IGZvciBmaWxlOiAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAjIFB1c2ggdGhlIG5ldyBkYXRhIGJhY2sgaW50byB0aGUgV29ya3NoZWV0IGFycmF5OworICAgICAgICAgICAgICAgIHB1c2ggQCRpbWFnZV9yZWYsICRpbWFnZV9pZCwgJHR5cGUsICR3aWR0aCwgJGhlaWdodDsKKworICAgICAgICAgICAgICAgICMgQWxzbyBzdG9yZSBuZXcgZGF0YSBmb3IgdXNlIGluIGR1cGxpY2F0ZSBpbWFnZXMuCisgICAgICAgICAgICAgICAgcHVzaCBAcHJldmlvdXNfaW1hZ2VzLCBbJGltYWdlX2lkLCAkdHlwZSwgJHdpZHRoLCAkaGVpZ2h0XTsKKworCisgICAgICAgICAgICAgICAgIyBTdG9yZSBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgV29ya2Jvb2suCisgICAgICAgICAgICAgICAgcHVzaCBAaW1hZ2VfZGF0YSwgWyRyZWZfY291bnQsICR0eXBlLCAkZGF0YSwgJHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGVja3N1bTEsICRjaGVja3N1bTJdOworCisgICAgICAgICAgICAgICAgIyBLZWVwIHRyYWNrIG9mIG92ZXJhbGwgZGF0YSBzaXplLgorICAgICAgICAgICAgICAgICRpbWFnZXNfc2l6ZSAgICAgICArPSAkc2l6ZSArNjE7ICMgU2l6ZSBmb3IgYnN0b3JlIGNvbnRhaW5lci4KKyAgICAgICAgICAgICAgICAkaW1hZ2VfbXNvX3NpemUgICAgKz0gJHNpemUgKzY5OyAjIFNpemUgZm9yIGRnZyBjb250YWluZXIuCisKKyAgICAgICAgICAgICAgICAkaW1hZ2VzX3NlZW57JGZpbGVuYW1lfSA9ICRpbWFnZV9pZCsrOworICAgICAgICAgICAgICAgICRmaC0+Y2xvc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAjIFdlJ3ZlIHByb2Nlc3NlZCB0aGlzIGZpbGUgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICBteSAkaW5kZXggPSAkaW1hZ2VzX3NlZW57JGZpbGVuYW1lfSAtMTsKKworICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgaW1hZ2UgcmVmZXJlbmNlIGNvdW50LgorICAgICAgICAgICAgICAgICRpbWFnZV9kYXRhWyRpbmRleF0tPlswXSsrOworCisgICAgICAgICAgICAgICAgIyBBZGQgcHJldmlvdXNseSBjYWxjdWxhdGVkIGRhdGEgYmFjayBvbnRvIHRoZSBXb3Jrc2hlZXQgYXJyYXkuCisgICAgICAgICAgICAgICAgIyAkaW1hZ2VfaWQsICR0eXBlLCAkd2lkdGgsICRoZWlnaHQKKyAgICAgICAgICAgICAgICBteSAkYV9yZWYgPSAkc2hlZXQtPntfaW1hZ2VzX2FycmF5fS0+WyRpbmRleF07CisgICAgICAgICAgICAgICAgcHVzaCBAJGltYWdlX3JlZiwgQHskcHJldmlvdXNfaW1hZ2VzWyRpbmRleF19OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBTdG9yZSBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgV29ya3NoZWV0LgorICAgICAgICAkc2hlZXQtPntfbnVtX2ltYWdlc30gICAgID0gJG51bV9pbWFnZXM7CisgICAgICAgICRzaGVldC0+e19pbWFnZV9tc29fc2l6ZX0gPSAkaW1hZ2VfbXNvX3NpemU7CisKKyAgICB9CisKKworICAgICMgU3RvcmUgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgdGhlIFdvcmtib29rLgorICAgICRzZWxmLT57X2ltYWdlc19zaXplfSA9ICRpbWFnZXNfc2l6ZTsKKyAgICAkc2VsZi0+e19pbWFnZXNfZGF0YX0gPSBcQGltYWdlX2RhdGE7ICMgU3RvcmUgdGhlIGRhdGEgZm9yIE1TT0RSQVdJTkdHUk9VUC4KKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2ltYWdlX2NoZWNrc3VtKCkKKyMKKyMgR2VuZXJhdGUgYSBjaGVja3N1bSBmb3IgdGhlIGltYWdlIHVzaW5nIHdoaWNoZXZlciBtb2R1bGUgaXMgYXZhaWxhYmxlLi5UaGUKKyMgYXZhaWxhYmxlIG1vZHVsZXMgYXJlIGNoZWNrZWQgaW4gX2dldF9jaGVja3N1bV9tZXRob2QoKS4gRXhjZWwgdXNlcyBhbiBNRDQKKyMgY2hlY2tzdW0gYnV0IGFueSBvdGhlciB3aWxsIGRvLiBJbiB0aGUgZXZlbnQgb2Ygbm8gY2hlY2tzdW0gbW9kdWxlIGJlaW5nCisjIGF2YWlsYWJsZSB3ZSBzaW11bGF0ZSBhIGNoZWNrc3VtIHVzaW5nIHRoZSBpbWFnZSBpbmRleC4KKyMKK3N1YiBfaW1hZ2VfY2hlY2tzdW0geworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIG15ICRkYXRhICAgID0gJF9bMF07CisgICAgbXkgJGluZGV4MSAgPSAkX1sxXTsKKyAgICBteSAkaW5kZXgyICA9ICRfWzJdIHx8IDA7CisKKyAgICBpZiAgICAoJHNlbGYtPntfY2hlY2tzdW1fbWV0aG9kfSA9PSAxKSB7CisgICAgICAgICMgRGlnZXN0OjpNRDQKKyAgICAgICAgcmV0dXJuIERpZ2VzdDo6TUQ0OjptZDRfaGV4KCRkYXRhKTsKKyAgICB9CisgICAgZWxzaWYgKCRzZWxmLT57X2NoZWNrc3VtX21ldGhvZH0gPT0gMikgeworICAgICAgICAjIERpZ2VzdDo6UGVybDo6TUQ0CisgICAgICAgIHJldHVybiBEaWdlc3Q6OlBlcmw6Ok1ENDo6bWQ0X2hleCgkZGF0YSk7CisgICAgfQorICAgIGVsc2lmICgkc2VsZi0+e19jaGVja3N1bV9tZXRob2R9ID09IDMpIHsKKyAgICAgICAgIyBEaWdlc3Q6Ok1ENQorICAgICAgICByZXR1cm4gRGlnZXN0OjpNRDU6Om1kNV9oZXgoJGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBEZWZhdWx0CisgICAgICAgIHJldHVybiBzcHJpbnRmICclMDE2WCUwMTZYJywgJGluZGV4MiwgJGluZGV4MTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcHJvY2Vzc19wbmcoKQorIworIyBFeHRyYWN0IHdpZHRoIGFuZCBoZWlnaHQgaW5mb3JtYXRpb24gZnJvbSBhIFBORyBmaWxlLgorIworc3ViIF9wcm9jZXNzX3BuZyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgPSA2OyAjIEV4Y2VsIEJsaXAgdHlwZSAoTVNPQkxJUFRZUEUpLgorICAgIG15ICR3aWR0aCAgID0gdW5wYWNrICJOIiwgc3Vic3RyICRfWzBdLCAxNiwgNDsKKyAgICBteSAkaGVpZ2h0ICA9IHVucGFjayAiTiIsIHN1YnN0ciAkX1swXSwgMjAsIDQ7CisKKyAgICByZXR1cm4gKCR0eXBlLCAkd2lkdGgsICRoZWlnaHQpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3Byb2Nlc3NfYm1wKCkKKyMKKyMgRXh0cmFjdCB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uIGZyb20gYSBCTVAgZmlsZS4KKyMKKyMgTW9zdCBvZiB0aGVzZSBjaGVja3MgY2FtZSBmcm9tIHRoZSBvbGQgV29ya3NoZWV0OjpfcHJvY2Vzc19iaXRtYXAoKSBtZXRob2QuCisjCitzdWIgX3Byb2Nlc3NfYm1wIHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRkYXRhICAgICA9ICRfWzBdOworICAgIG15ICRmaWxlbmFtZSA9ICRfWzFdOworICAgIG15ICR0eXBlICAgICA9IDc7ICMgRXhjZWwgQmxpcCB0eXBlIChNU09CTElQVFlQRSkuCisKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgZmlsZSBpcyBiaWcgZW5vdWdoIHRvIGJlIGEgYml0bWFwLgorICAgIGlmIChsZW5ndGggJGRhdGEgPD0gMHgzNikgeworICAgICAgICBjcm9hayAiJGZpbGVuYW1lIGRvZXNuJ3QgY29udGFpbiBlbm91Z2ggZGF0YS4iOworICAgIH0KKworCisgICAgIyBSZWFkIHRoZSBiaXRtYXAgd2lkdGggYW5kIGhlaWdodC4gVmVyaWZ5IHRoZSBzaXplcy4KKyAgICBteSAoJHdpZHRoLCAkaGVpZ2h0KSA9IHVucGFjayAieDE4IFYyIiwgJGRhdGE7CisKKyAgICBpZiAoJHdpZHRoID4gMHhGRkZGKSB7CisgICAgICAgIGNyb2FrICIkZmlsZW5hbWU6IGxhcmdlc3QgaW1hZ2Ugd2lkdGggJHdpZHRoIHN1cHBvcnRlZCBpcyA2NWsuIjsKKyAgICB9CisKKyAgICBpZiAoJGhlaWdodCA+IDB4RkZGRikgeworICAgICAgICBjcm9hayAiJGZpbGVuYW1lOiBsYXJnZXN0IGltYWdlIGhlaWdodCBzdXBwb3J0ZWQgaXMgNjVrLiI7CisgICAgfQorCisgICAgIyBSZWFkIHRoZSBiaXRtYXAgcGxhbmVzIGFuZCBicHAgZGF0YS4gVmVyaWZ5IHRoZW0uCisgICAgbXkgKCRwbGFuZXMsICRiaXRjb3VudCkgPSB1bnBhY2sgIngyNiB2MiIsICRkYXRhOworCisgICAgaWYgKCRiaXRjb3VudCAhPSAyNCkgeworICAgICAgICBjcm9hayAiJGZpbGVuYW1lIGlzbid0IGEgMjRiaXQgdHJ1ZSBjb2xvciBiaXRtYXAuIjsKKyAgICB9CisKKyAgICBpZiAoJHBsYW5lcyAhPSAxKSB7CisgICAgICAgIGNyb2FrICIkZmlsZW5hbWU6IG9ubHkgMSBwbGFuZSBzdXBwb3J0ZWQgaW4gYml0bWFwIGltYWdlLiI7CisgICAgfQorCisKKyAgICAjIFJlYWQgdGhlIGJpdG1hcCBjb21wcmVzc2lvbi4gVmVyaWZ5IGNvbXByZXNzaW9uLgorICAgIG15ICRjb21wcmVzc2lvbiA9IHVucGFjayAieDMwIFYiLCAkZGF0YTsKKworICAgIGlmICgkY29tcHJlc3Npb24gIT0gMCkgeworICAgICAgICBjcm9hayAiJGZpbGVuYW1lOiBjb21wcmVzc2lvbiBub3Qgc3VwcG9ydGVkIGluIGJpdG1hcCBpbWFnZS4iOworICAgIH0KKworICAgIHJldHVybiAoJHR5cGUsICR3aWR0aCwgJGhlaWdodCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcHJvY2Vzc19qcGcoKQorIworIyBFeHRyYWN0IHdpZHRoIGFuZCBoZWlnaHQgaW5mb3JtYXRpb24gZnJvbSBhIEpQRUcgZmlsZS4KKyMKK3N1YiBfcHJvY2Vzc19qcGcgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJGRhdGEgICAgID0gJF9bMF07CisgICAgbXkgJGZpbGVuYW1lID0gJF9bMV07CisgICAgbXkgJHR5cGUgICAgID0gNTsgIyBFeGNlbCBCbGlwIHR5cGUgKE1TT0JMSVBUWVBFKS4KKyAgICBteSAkd2lkdGg7CisgICAgbXkgJGhlaWdodDsKKworICAgIG15ICRvZmZzZXQgPSAyOworICAgIG15ICRkYXRhX2xlbmd0aCA9IGxlbmd0aCAkZGF0YTsKKworICAgICMgU2VhcmNoIHRocm91Z2ggdGhlIGltYWdlIGRhdGEgdG8gZmluZCB0aGUgMHhGRkMwIG1hcmtlci4gVGhlIGhlaWdodCBhbmQKKyAgICAjIHdpZHRoIGFyZSBjb250YWluZWQgaW4gdGhlIGRhdGEgZm9yIHRoYXQgc3ViIGVsZW1lbnQuCisgICAgd2hpbGUgKCRvZmZzZXQgPCAkZGF0YV9sZW5ndGgpIHsKKworICAgICAgICBteSAkbWFya2VyICA9IHVucGFjayAibiIsIHN1YnN0ciAkZGF0YSwgJG9mZnNldCwgICAgMjsKKyAgICAgICAgbXkgJGxlbmd0aCAgPSB1bnBhY2sgIm4iLCBzdWJzdHIgJGRhdGEsICRvZmZzZXQgKzIsIDI7CisKKyAgICAgICAgaWYgKCRtYXJrZXIgPT0gMHhGRkMwIHx8ICRtYXJrZXIgPT0gMHhGRkMyKSB7CisgICAgICAgICAgICAkaGVpZ2h0ID0gdW5wYWNrICJuIiwgc3Vic3RyICRkYXRhLCAkb2Zmc2V0ICs1LCAyOworICAgICAgICAgICAgJHdpZHRoICA9IHVucGFjayAibiIsIHN1YnN0ciAkZGF0YSwgJG9mZnNldCArNywgMjsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKworICAgICAgICAkb2Zmc2V0ID0gJG9mZnNldCArICRsZW5ndGggKyAyOworICAgICAgICBsYXN0IGlmICRtYXJrZXIgPT0gMHhGRkRBOworICAgIH0KKworICAgIGlmIChub3QgZGVmaW5lZCAkaGVpZ2h0KSB7CisgICAgICAgIGNyb2FrICIkZmlsZW5hbWU6IG5vIHNpemUgZGF0YSBmb3VuZCBpbiBqcGVnIGltYWdlLlxuIjsKKyAgICB9CisKKyAgICByZXR1cm4gKCR0eXBlLCAkd2lkdGgsICRoZWlnaHQpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2FsbF9mb250cygpCisjCisjIFN0b3JlIHRoZSBFeGNlbCBGT05UIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX2FsbF9mb250cyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJGZvcm1hdCAgPSAkc2VsZi0+e19mb3JtYXRzfS0+WzE1XTsgIyBUaGUgZGVmYXVsdCBjZWxsIGZvcm1hdC4KKyAgICBteSAkZm9udCAgICA9ICRmb3JtYXQtPmdldF9mb250KCk7CisKKyAgICAjIEZvbnRzIGFyZSAwLWluZGV4ZWQuIEFjY29yZGluZyB0byB0aGUgU0RLIHRoZXJlIGlzIG5vIGluZGV4IDQsCisgICAgZm9yICgwLi4zKSB7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCRmb250KTsKKyAgICB9CisKKworICAgICMgQWRkIHRoZSBkZWZhdWx0IGZvbnRzIGZvciBjaGFydHMgYW5kIGNvbW1lbnRzLiBUaGlzIGFyZW4ndCBjb25uZWN0ZWQKKyAgICAjIHRvIFhGIGZvcm1hdHMuIE5vdGUsIHRoZSBmb250IHNpemUsIGFuZCBzb21lIG90aGVyIHByb3BlcnRpZXMgb2YKKyAgICAjIGNoYXJ0IGZvbnRzIGFyZSBzZXQgaW4gdGhlIEZCSSByZWNvcmQgb2YgdGhlIGNoYXJ0LgorICAgIG15ICR0bXBfZm9ybWF0OworCisgICAgIyBJbmRleCA1LiBBeGlzIG51bWJlcnMuCisgICAgJHRtcF9mb3JtYXQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0LT5uZXcoCisgICAgICAgIHVuZGVmLAorICAgICAgICBmb250X29ubHkgPT4gMSwKKyAgICApOworICAgICRzZWxmLT5fYXBwZW5kKCAkdG1wX2Zvcm1hdC0+Z2V0X2ZvbnQoKSApOworCisgICAgIyBJbmRleCA2LiBTZXJpZXMgbmFtZXMuCisgICAgJHRtcF9mb3JtYXQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0LT5uZXcoCisgICAgICAgIHVuZGVmLAorICAgICAgICBmb250X29ubHkgPT4gMSwKKyAgICApOworICAgICRzZWxmLT5fYXBwZW5kKCAkdG1wX2Zvcm1hdC0+Z2V0X2ZvbnQoKSApOworCisgICAgIyBJbmRleCA3LiBUaXRsZS4KKyAgICAkdG1wX2Zvcm1hdCA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQtPm5ldygKKyAgICAgICAgdW5kZWYsCisgICAgICAgIGZvbnRfb25seSA9PiAxLAorICAgICAgICBib2xkICAgICAgPT4gMSwKKyAgICApOworICAgICRzZWxmLT5fYXBwZW5kKCAkdG1wX2Zvcm1hdC0+Z2V0X2ZvbnQoKSApOworCisgICAgIyBJbmRleCA4LiBBeGVzLgorICAgICR0bXBfZm9ybWF0ID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdC0+bmV3KAorICAgICAgICB1bmRlZiwKKyAgICAgICAgZm9udF9vbmx5ID0+IDEsCisgICAgICAgIGJvbGQgICAgICA9PiAxLAorICAgICk7CisgICAgJHNlbGYtPl9hcHBlbmQoICR0bXBfZm9ybWF0LT5nZXRfZm9udCgpICk7CisKKyAgICAjIEluZGV4IDkuIENvbW1lbnRzLgorICAgICR0bXBfZm9ybWF0ID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdC0+bmV3KAorICAgICAgICB1bmRlZiwKKyAgICAgICAgZm9udF9vbmx5ID0+IDEsCisgICAgICAgIGZvbnQgICAgICA9PiAnVGFob21hJywKKyAgICAgICAgc2l6ZSAgICAgID0+IDgsCisgICAgKTsKKyAgICAkc2VsZi0+X2FwcGVuZCggJHRtcF9mb3JtYXQtPmdldF9mb250KCkgKTsKKworCisgICAgIyBJdGVyYXRlIHRocm91Z2ggdGhlIFhGIG9iamVjdHMgYW5kIHdyaXRlIGEgRk9OVCByZWNvcmQgaWYgaXQgaXNuJ3QgdGhlCisgICAgIyBzYW1lIGFzIHRoZSBkZWZhdWx0IEZPTlQgYW5kIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gdXNlZC4KKyAgICAjCisgICAgbXkgJWZvbnRzOworICAgIG15ICRrZXk7CisgICAgbXkgJGluZGV4ID0gMTA7ICAgICAgICAgICAgICAgICAgIyBUaGUgZmlyc3QgdXNlciBkZWZpbmVkIEZPTlQKKworICAgICRrZXkgPSAkZm9ybWF0LT5nZXRfZm9udF9rZXkoKTsgIyBUaGUgZGVmYXVsdCBmb250IGZvciBjZWxsIGZvcm1hdHMuCisgICAgJGZvbnRzeyRrZXl9ID0gMDsgICAgICAgICAgICAgICAjIEluZGV4IG9mIHRoZSBkZWZhdWx0IGZvbnQKKworICAgICMgRm9udHMgdGhhdCBhcmUgbWFya2VkIGFzICdfZm9udF9vbmx5JyBhcmUgYWx3YXlzIHN0b3JlZC4gVGhlc2UgYXJlIHVzZWQKKyAgICAjIG1haW5seSBmb3IgY2hhcnRzIGFuZCBtYXkgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBYRiByZWNvcmQuCisKKyAgICBmb3JlYWNoICRmb3JtYXQgKEB7JHNlbGYtPntfZm9ybWF0c319KSB7CisgICAgICAgICRrZXkgPSAkZm9ybWF0LT5nZXRfZm9udF9rZXkoKTsKKworICAgICAgICBpZiAobm90ICRmb3JtYXQtPntfZm9udF9vbmx5fSBhbmQgZXhpc3RzICRmb250c3ska2V5fSkgeworICAgICAgICAgICAgIyBGT05UIGhhcyBhbHJlYWR5IGJlZW4gdXNlZAorICAgICAgICAgICAgJGZvcm1hdC0+e19mb250X2luZGV4fSA9ICRmb250c3ska2V5fTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgQWRkIGEgbmV3IEZPTlQgcmVjb3JkCisKKyAgICAgICAgICAgIGlmIChub3QgJGZvcm1hdC0+e19mb250X29ubHl9KSB7CisgICAgICAgICAgICAgICAgJGZvbnRzeyRrZXl9ID0gJGluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkZm9ybWF0LT57X2ZvbnRfaW5kZXh9ID0gJGluZGV4OworICAgICAgICAgICAgJGluZGV4Kys7CisgICAgICAgICAgICAkZm9udCA9ICRmb3JtYXQtPmdldF9mb250KCk7CisgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkZm9udCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYWxsX251bV9mb3JtYXRzKCkKKyMKKyMgU3RvcmUgdXNlciBkZWZpbmVkIG51bWVyaWNhbCBmb3JtYXRzIGkuZS4gRk9STUFUIHJlY29yZHMKKyMKK3N1YiBfc3RvcmVfYWxsX251bV9mb3JtYXRzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAlbnVtX2Zvcm1hdHM7CisgICAgbXkgQG51bV9mb3JtYXRzOworICAgIG15ICRudW1fZm9ybWF0OworICAgIG15ICRpbmRleCA9IDE2NDsgIyBVc2VyIGRlZmluZWQgRk9STUFUIHJlY29yZHMgc3RhcnQgZnJvbSAweEE0CisKKworICAgICMgSXRlcmF0ZSB0aHJvdWdoIHRoZSBYRiBvYmplY3RzIGFuZCB3cml0ZSBhIEZPUk1BVCByZWNvcmQgaWYgaXQgaXNuJ3QgYQorICAgICMgYnVpbHQtaW4gZm9ybWF0IHR5cGUgYW5kIGlmIHRoZSBGT1JNQVQgc3RyaW5nIGhhc24ndCBhbHJlYWR5IGJlZW4gdXNlZC4KKyAgICAjCisgICAgZm9yZWFjaCBteSAkZm9ybWF0IChAeyRzZWxmLT57X2Zvcm1hdHN9fSkgeworICAgICAgICBteSAkbnVtX2Zvcm1hdCA9ICRmb3JtYXQtPntfbnVtX2Zvcm1hdH07CisgICAgICAgIG15ICRlbmNvZGluZyAgID0gJGZvcm1hdC0+e19udW1fZm9ybWF0X2VuY307CisKKyAgICAgICAgIyBDaGVjayBpZiAkbnVtX2Zvcm1hdCBpcyBhbiBpbmRleCB0byBhIGJ1aWx0LWluIGZvcm1hdC4KKyAgICAgICAgIyBBbHNvIGNoZWNrIGZvciBhIHN0cmluZyBvZiB6ZXJvcywgd2hpY2ggaXMgYSB2YWxpZCBmb3JtYXQgc3RyaW5nCisgICAgICAgICMgYnV0IHdvdWxkIGV2YWx1YXRlIHRvIHplcm8uCisgICAgICAgICMKKyAgICAgICAgaWYgKCRudW1fZm9ybWF0ICF+IG0vXjArXGQvKSB7CisgICAgICAgICAgICBuZXh0IGlmICRudW1fZm9ybWF0ID1+IG0vXlxkKyQvOyAjIGJ1aWx0LWluCisgICAgICAgIH0KKworICAgICAgICBpZiAoZXhpc3RzKCRudW1fZm9ybWF0c3skbnVtX2Zvcm1hdH0pKSB7CisgICAgICAgICAgICAjIEZPUk1BVCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQKKyAgICAgICAgICAgICRmb3JtYXQtPntfbnVtX2Zvcm1hdH0gPSAkbnVtX2Zvcm1hdHN7JG51bV9mb3JtYXR9OworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICAjIEFkZCBhIG5ldyBGT1JNQVQKKyAgICAgICAgICAgICRudW1fZm9ybWF0c3skbnVtX2Zvcm1hdH0gPSAkaW5kZXg7CisgICAgICAgICAgICAkZm9ybWF0LT57X251bV9mb3JtYXR9ICAgID0gJGluZGV4OworICAgICAgICAgICAgJHNlbGYtPl9zdG9yZV9udW1fZm9ybWF0KCRudW1fZm9ybWF0LCAkaW5kZXgsICRlbmNvZGluZyk7CisgICAgICAgICAgICAkaW5kZXgrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9hbGxfeGZzKCkKKyMKKyMgV3JpdGUgYWxsIFhGIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX2FsbF94ZnMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGZvcmVhY2ggbXkgJGZvcm1hdCAoQHskc2VsZi0+e19mb3JtYXRzfX0pIHsKKyAgICAgICAgbXkgJHhmID0gJGZvcm1hdC0+Z2V0X3hmKCk7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCR4Zik7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2FsbF9zdHlsZXMoKQorIworIyBXcml0ZSBhbGwgU1RZTEUgcmVjb3Jkcy4KKyMKK3N1YiBfc3RvcmVfYWxsX3N0eWxlcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBFeGNlbCBhZGRzIHRoZSBidWlsdC1pbiBzdHlsZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgorICAgIG15IEBidWlsdF9pbnMgPSAoCisgICAgICAgIFsweDAzLCAxNl0sICMgQ29tbWEKKyAgICAgICAgWzB4MDYsIDE3XSwgIyBDb21tYVswXQorICAgICAgICBbMHgwNCwgMThdLCAjIEN1cnJlbmN5CisgICAgICAgIFsweDA3LCAxOV0sICMgQ3VycmVuY3lbMF0KKyAgICAgICAgWzB4MDAsICAwXSwgIyBOb3JtYWwKKyAgICAgICAgWzB4MDUsIDIwXSwgIyBQZXJjZW50CisKKyAgICAgICAgIyBXZSBkb24ndCBkZWFsIHdpdGggdGhlc2Ugc3R5bGVzIHlldC4KKyAgICAgICAgI1sweDA4LCAyMV0sICMgSHlwZXJsaW5rCisgICAgICAgICNbMHgwMiwgIDhdLCAjIENvbExldmVsX24KKyAgICAgICAgI1sweDAxLCAgMV0sICMgUm93TGV2ZWxfbgorICAgICk7CisKKworICAgIGZvciBteSAkYXJlZiAoQGJ1aWx0X2lucykgeworICAgICAgICBteSAkdHlwZSAgICAgPSAkYXJlZi0+WzBdOworICAgICAgICBteSAkeGZfaW5kZXggPSAkYXJlZi0+WzFdOworCisgICAgICAgICRzZWxmLT5fc3RvcmVfc3R5bGUoJHR5cGUsICR4Zl9pbmRleCk7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX25hbWVzKCkKKyMKKyMgV3JpdGUgdGhlIE5BTUUgcmVjb3JkIHRvIGRlZmluZSB0aGUgcHJpbnQgYXJlYSBhbmQgdGhlIHJlcGVhdCByb3dzIGFuZCBjb2xzLgorIworc3ViIF9zdG9yZV9uYW1lcyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkaW5kZXg7CisgICAgbXkgJWV4dF9yZWZzICAgID0gJXskc2VsZi0+e19leHRfcmVmc319OworCisKKyAgICAjIENyZWF0ZSB0aGUgdXNlciBkZWZpbmVkIG5hbWVzLgorICAgIGZvciBteSAkZGVmaW5lZF9uYW1lIChAeyRzZWxmLT57X2RlZmluZWRfbmFtZXN9fSkgeworCisgICAgICAgICRzZWxmLT5fc3RvcmVfbmFtZSgKKyAgICAgICAgICAgICRkZWZpbmVkX25hbWUtPntuYW1lfSwKKyAgICAgICAgICAgICRkZWZpbmVkX25hbWUtPntlbmNvZGluZ30sCisgICAgICAgICAgICAkZGVmaW5lZF9uYW1lLT57c2hlZXRfaW5kZXh9LAorICAgICAgICAgICAgJGRlZmluZWRfbmFtZS0+e2Zvcm11bGF9LAorICAgICAgICApOworICAgIH0KKworICAgICMgU29ydCB0aGUgd29ya3NoZWV0cyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlciBieSBuYW1lLiBUaGlzIGlzIGEKKyAgICAjIHJlcXVpcmVtZW50IGZvciBzb21lIG5vbi1FbmdsaXNoIGxhbmd1YWdlIEV4Y2VsIHBhdGNoIGxldmVscy4KKyAgICBteSBAd29ya3NoZWV0cyA9IEB7JHNlbGYtPntfd29ya3NoZWV0c319OworICAgICAgIEB3b3Jrc2hlZXRzID0gc29ydCB7ICRhLT57X25hbWV9IGNtcCAkYi0+e19uYW1lfSB9IEB3b3Jrc2hlZXRzOworCisgICAgIyBDcmVhdGUgdGhlIGF1dG9maWx0ZXIgTkFNRSByZWNvcmRzCisgICAgZm9yZWFjaCBteSAkd29ya3NoZWV0IChAd29ya3NoZWV0cykgeworICAgICAgICAkaW5kZXggID0gJHdvcmtzaGVldC0+e19pbmRleH07CisgICAgICAgIG15ICRrZXkgPSAiJGluZGV4OiRpbmRleCI7CisgICAgICAgIG15ICRyZWYgPSAkZXh0X3JlZnN7JGtleX07CisKKyAgICAgICAgIyBXcml0ZSBhIE5hbWUgcmVjb3JkIGlmIEF1dG9maWx0ZXIgaGFzIGJlZW4gZGVmaW5lZAorICAgICAgICBpZiAoJHdvcmtzaGVldC0+e19maWx0ZXJfY291bnR9KSB7CisgICAgICAgICAgICAkc2VsZi0+X3N0b3JlX25hbWVfc2hvcnQoCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19pbmRleH0sCisgICAgICAgICAgICAgICAgMHgwRCwgIyBOQU1FIHR5cGUgPSBGaWx0ZXIgRGF0YWJhc2UKKyAgICAgICAgICAgICAgICAkcmVmLAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfZmlsdGVyX2FyZWF9LT5bMF0sCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19maWx0ZXJfYXJlYX0tPlsxXSwKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT57X2ZpbHRlcl9hcmVhfS0+WzJdLAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfZmlsdGVyX2FyZWF9LT5bM10sCisgICAgICAgICAgICAgICAgMSwgIyBIaWRkZW4KKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIENyZWF0ZSB0aGUgcHJpbnQgYXJlYSBOQU1FIHJlY29yZHMKKyAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKEB3b3Jrc2hlZXRzKSB7CisgICAgICAgICRpbmRleCAgPSAkd29ya3NoZWV0LT57X2luZGV4fTsKKyAgICAgICAgbXkgJGtleSA9ICIkaW5kZXg6JGluZGV4IjsKKyAgICAgICAgbXkgJHJlZiA9ICRleHRfcmVmc3ska2V5fTsKKworICAgICAgICAjIFdyaXRlIGEgTmFtZSByZWNvcmQgaWYgdGhlIHByaW50IGFyZWEgaGFzIGJlZW4gZGVmaW5lZAorICAgICAgICBpZiAoZGVmaW5lZCAkd29ya3NoZWV0LT57X3ByaW50X3Jvd21pbn0pIHsKKyAgICAgICAgICAgICRzZWxmLT5fc3RvcmVfbmFtZV9zaG9ydCgKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT57X2luZGV4fSwKKyAgICAgICAgICAgICAgICAweDA2LCAjIE5BTUUgdHlwZSA9IFByaW50X0FyZWEKKyAgICAgICAgICAgICAgICAkcmVmLAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfcHJpbnRfcm93bWlufSwKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT57X3ByaW50X3Jvd21heH0sCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19wcmludF9jb2xtaW59LAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfcHJpbnRfY29sbWF4fQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgQ3JlYXRlIHRoZSBwcmludCB0aXRsZSBOQU1FIHJlY29yZHMKKyAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKEB3b3Jrc2hlZXRzKSB7CisgICAgICAgICRpbmRleCAgPSAkd29ya3NoZWV0LT57X2luZGV4fTsKKworICAgICAgICBteSAkcm93bWluID0gJHdvcmtzaGVldC0+e190aXRsZV9yb3dtaW59OworICAgICAgICBteSAkcm93bWF4ID0gJHdvcmtzaGVldC0+e190aXRsZV9yb3dtYXh9OworICAgICAgICBteSAkY29sbWluID0gJHdvcmtzaGVldC0+e190aXRsZV9jb2xtaW59OworICAgICAgICBteSAkY29sbWF4ID0gJHdvcmtzaGVldC0+e190aXRsZV9jb2xtYXh9OworICAgICAgICBteSAka2V5ICAgID0gIiRpbmRleDokaW5kZXgiOworICAgICAgICBteSAkcmVmICAgID0gJGV4dF9yZWZzeyRrZXl9OworCisgICAgICAgICMgRGV0ZXJtaW5lIGlmIHJvdyArIGNvbCwgcm93LCBjb2wgb3Igbm90aGluZyBoYXMgYmVlbiBkZWZpbmVkCisgICAgICAgICMgYW5kIHdyaXRlIHRoZSBhcHByb3ByaWF0ZSByZWNvcmQKKyAgICAgICAgIworICAgICAgICBpZiAoZGVmaW5lZCAkcm93bWluICYmIGRlZmluZWQgJGNvbG1pbikgeworICAgICAgICAgICAgIyBSb3cgYW5kIGNvbHVtbiB0aXRsZXMgaGF2ZSBiZWVuIGRlZmluZWQuCisgICAgICAgICAgICAjIFJvdyB0aXRsZSBoYXMgYmVlbiBkZWZpbmVkLgorICAgICAgICAgICAgJHNlbGYtPl9zdG9yZV9uYW1lX2xvbmcoCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19pbmRleH0sCisgICAgICAgICAgICAgICAgMHgwNywgIyBOQU1FIHR5cGUgPSBQcmludF9UaXRsZXMKKyAgICAgICAgICAgICAgICAkcmVmLAorICAgICAgICAgICAgICAgICRyb3dtaW4sCisgICAgICAgICAgICAgICAgJHJvd21heCwKKyAgICAgICAgICAgICAgICAkY29sbWluLAorICAgICAgICAgICAgICAgICRjb2xtYXgKKyAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoZGVmaW5lZCAkcm93bWluKSB7CisgICAgICAgICAgICAjIFJvdyB0aXRsZSBoYXMgYmVlbiBkZWZpbmVkLgorICAgICAgICAgICAgJHNlbGYtPl9zdG9yZV9uYW1lX3Nob3J0KAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfaW5kZXh9LAorICAgICAgICAgICAgICAgIDB4MDcsICMgTkFNRSB0eXBlID0gUHJpbnRfVGl0bGVzCisgICAgICAgICAgICAgICAgJHJlZiwKKyAgICAgICAgICAgICAgICAkcm93bWluLAorICAgICAgICAgICAgICAgICRyb3dtYXgsCisgICAgICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgICAgICAweGZmCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGVsc2lmIChkZWZpbmVkICRjb2xtaW4pIHsKKyAgICAgICAgICAgICMgQ29sdW1uIHRpdGxlIGhhcyBiZWVuIGRlZmluZWQuCisgICAgICAgICAgICAkc2VsZi0+X3N0b3JlX25hbWVfc2hvcnQoCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19pbmRleH0sCisgICAgICAgICAgICAgICAgMHgwNywgIyBOQU1FIHR5cGUgPSBQcmludF9UaXRsZXMKKyAgICAgICAgICAgICAgICAkcmVmLAorICAgICAgICAgICAgICAgIDB4MDAwMCwKKyAgICAgICAgICAgICAgICAweGZmZmYsCisgICAgICAgICAgICAgICAgJGNvbG1pbiwKKyAgICAgICAgICAgICAgICAkY29sbWF4CisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBOb3RoaW5nIGxlZnQgdG8gZG8KKyAgICAgICAgfQorICAgIH0KK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBCSUZGIFJFQ09SRFMKKyMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV93aW5kb3cxKCkKKyMKKyMgV3JpdGUgRXhjZWwgQklGRiBXSU5ET1cxIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfd2luZG93MSB7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgwMDNEOyAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMTI7ICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICR4V24gICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgICAjIEhvcml6b250YWwgcG9zaXRpb24gb2Ygd2luZG93CisgICAgbXkgJHlXbiAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAgICMgVmVydGljYWwgcG9zaXRpb24gb2Ygd2luZG93CisgICAgbXkgJGR4V24gICAgICA9IDB4MzU1QzsgICAgICAgICAgICAgICAgICMgV2lkdGggb2Ygd2luZG93CisgICAgbXkgJGR5V24gICAgICA9IDB4MzBFRDsgICAgICAgICAgICAgICAgICMgSGVpZ2h0IG9mIHdpbmRvdworCisgICAgbXkgJGdyYml0ICAgICA9IDB4MDAzODsgICAgICAgICAgICAgICAgICMgT3B0aW9uIGZsYWdzCisgICAgbXkgJGN0YWJzZWwgICA9ICRzZWxmLT57X3NlbGVjdGVkfTsgICAgICMgTnVtYmVyIG9mIHdvcmtib29rIHRhYnMgc2VsZWN0ZWQKKyAgICBteSAkd1RhYlJhdGlvID0gMHgwMjU4OyAgICAgICAgICAgICAgICAgIyBUYWIgdG8gc2Nyb2xsYmFyIHJhdGlvCisKKyAgICBteSAkaXRhYkZpcnN0ID0gJHNlbGYtPntfZmlyc3RzaGVldH07ICAgIyAxc3QgZGlzcGxheWVkIHdvcmtzaGVldAorICAgIG15ICRpdGFiQ3VyICAgPSAkc2VsZi0+e19hY3RpdmVzaGVldH07ICAjIEFjdGl2ZSB3b3Jrc2hlZXQKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygidnZ2dnZ2dnZ2IiwgJHhXbiwgJHlXbiwgJGR4V24sICRkeVduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ3JiaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGFiQ3VyLCAkaXRhYkZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY3RhYnNlbCwgJHdUYWJSYXRpbyk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYm91bmRzaGVldCgpCisjCisjIFdyaXRlcyBFeGNlbCBCSUZGIEJPVU5EU0hFRVQgcmVjb3JkLgorIworc3ViIF9zdG9yZV9ib3VuZHNoZWV0IHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDAwODU7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgPSAweDA4ICsgbGVuZ3RoKCRfWzBdKTsgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkc2hlZXRuYW1lID0gJF9bMF07ICAgICAgICAgICAgICAgICMgV29ya3NoZWV0IG5hbWUKKyAgICBteSAkb2Zmc2V0ICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICMgTG9jYXRpb24gb2Ygd29ya3NoZWV0IEJPRgorICAgIG15ICR0eXBlICAgICAgPSAkX1syXTsgICAgICAgICAgICAgICAgIyBXb3Jrc2hlZXQgdHlwZQorICAgIG15ICRoaWRkZW4gICAgPSAkX1szXTsgICAgICAgICAgICAgICAgIyBXb3Jrc2hlZXQgaGlkZGVuIGZsYWcKKyAgICBteSAkZW5jb2RpbmcgID0gJF9bNF07ICAgICAgICAgICAgICAgICMgU2hlZXQgbmFtZSBlbmNvZGluZworICAgIG15ICRjY2ggICAgICAgPSBsZW5ndGgoJHNoZWV0bmFtZSk7ICAgIyBMZW5ndGggb2Ygc2hlZXQgbmFtZQorCisgICAgbXkgJGdyYml0ICAgICA9ICR0eXBlIHwgJGhpZGRlbjsKKworICAgICMgQ2hhcmFjdGVyIGxlbmd0aCBpcyBudW0gb2YgY2hhcnMgbm90IG51bSBvZiBieXRlcworICAgICRjY2ggLz0gMiBpZiAkZW5jb2Rpbmc7CisKKyAgICAjIENoYW5nZSB0aGUgVVRGLTE2IG5hbWUgZnJvbSBCRSB0byBMRQorICAgICRzaGVldG5hbWUgPSBwYWNrICduKicsIHVucGFjayAndionLCAkc2hlZXRuYW1lIGlmICRlbmNvZGluZzsKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soIlZ2Q0MiLCAkb2Zmc2V0LCAkZ3JiaXQsICRjY2gsICRlbmNvZGluZyk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSwgJHNoZWV0bmFtZSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfc3R5bGUoKQorIworIyBXcml0ZSBFeGNlbCBCSUZGIFNUWUxFIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX3N0eWxlIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDAyOTM7ICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDA0OyAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHR5cGUgICAgICA9ICRfWzBdOyAgIyBCdWlsdC1pbiBzdHlsZQorICAgIG15ICR4Zl9pbmRleCAgPSAkX1sxXTsgICMgSW5kZXggdG8gc3R5bGUgWEYKKyAgICBteSAkbGV2ZWwgICAgID0gMHhmZjsgICAjIE91dGxpbmUgc3R5bGUgbGV2ZWwKKworICAgICR4Zl9pbmRleCAgICB8PSAweDgwMDA7ICMgQWRkIGZsYWcgdG8gaW5kaWNhdGUgYnVpbHQtaW4gc3R5bGUuCisKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygidkNDIiwgJHhmX2luZGV4LCAkdHlwZSwgJGxldmVsKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9udW1fZm9ybWF0KCkKKyMKKyMgV3JpdGVzIEV4Y2VsIEZPUk1BVCByZWNvcmQgZm9yIG5vbiAiYnVpbHQtaW4iIG51bWVyaWNhbCBmb3JtYXRzLgorIworc3ViIF9zdG9yZV9udW1fZm9ybWF0IHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDA0MUU7ICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZm9ybWF0ICAgID0gJF9bMF07ICAgICAgICAgICMgQ3VzdG9tIGZvcm1hdCBzdHJpbmcKKyAgICBteSAkaWZtdCAgICAgID0gJF9bMV07ICAgICAgICAgICMgRm9ybWF0IGluZGV4IGNvZGUKKyAgICBteSAkZW5jb2RpbmcgID0gJF9bMl07ICAgICAgICAgICMgQ2hhciBlbmNvZGluZyBmb3IgZm9ybWF0IHN0cmluZworCisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJGZvcm1hdCkpIHsKKyAgICAgICAgICAgICRmb3JtYXQgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2QkUiLCAkZm9ybWF0KTsKKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgQ2hhciBsZW5ndGggb2YgZm9ybWF0IHN0cmluZworICAgIG15ICRjY2ggPSBsZW5ndGggJGZvcm1hdDsKKworCisgICAgIyBIYW5kbGUgVW5pY29kZSBmb3JtYXQgc3RyaW5ncy4KKyAgICBpZiAoJGVuY29kaW5nID09IDEpIHsKKyAgICAgICAgY3JvYWsgIlVuZXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gVW5pY29kZSBmb250IG5hbWUiIGlmICRjY2ggJSAyOworICAgICAgICAkY2NoICAgIC89IDIgaWYgJGVuY29kaW5nOworICAgICAgICAkZm9ybWF0ICA9IHBhY2sgJ3YqJywgdW5wYWNrICduKicsICRmb3JtYXQ7CisgICAgfQorCisKKyAgICAjIFNwZWNpYWwgY2FzZSB0byBoYW5kbGUgRXVybyBzeW1ib2wsIDB4ODAsIGluIG5vbi1Vbmljb2RlIHN0cmluZ3MuCisgICAgaWYgKCRlbmNvZGluZyA9PSAwIGFuZCAkZm9ybWF0ID1+IC9ceDgwLykgeworICAgICAgICAkZm9ybWF0ICAgPSAgcGFjayAndionLCB1bnBhY2sgJ0MqJywgJGZvcm1hdDsKKyAgICAgICAgJGZvcm1hdCAgID1+IHMvXHg4MFx4MDAvXHhBQ1x4MjAvZzsKKyAgICAgICAgJGVuY29kaW5nID0gIDE7CisgICAgfQorCisgICAgJGxlbmd0aCAgICAgICA9IDB4MDUgKyBsZW5ndGggJGZvcm1hdDsKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2dkMiLCAkaWZtdCwgJGNjaCwgJGVuY29kaW5nKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhLCAkZm9ybWF0KTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV8xOTA0KCkKKyMKKyMgV3JpdGUgRXhjZWwgMTkwNCByZWNvcmQgdG8gaW5kaWNhdGUgdGhlIGRhdGUgc3lzdGVtIGluIHVzZS4KKyMKK3N1YiBfc3RvcmVfMTkwNCB7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgwMDIyOyAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDAyOyAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZjE5MDQgICAgID0gJHNlbGYtPntfMTkwNH07ICMgRmxhZyBmb3IgMTkwNCBkYXRlIHN5c3RlbQorCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2IiwgJGYxOTA0KTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zdXBib29rKCkKKyMKKyMgV3JpdGUgQklGRiByZWNvcmQgU1VQQk9PSyB0byBpbmRpY2F0ZSB0aGF0IHRoZSB3b3JrYm9vayBjb250YWlucyBleHRlcm5hbAorIyByZWZlcmVuY2VzLCBpbiBvdXIgY2FzZSwgZm9ybXVsYSwgcHJpbnQgYXJlYSBhbmQgcHJpbnQgdGl0bGUgcmVmcy4KKyMKK3N1YiBfc3RvcmVfc3VwYm9vayB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDFBRTsgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwNDsgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkY3RhYnMgICAgICAgPSBAeyRzZWxmLT57X3dvcmtzaGVldHN9fTsgICMgTnVtYmVyIG9mIHdvcmtzaGVldHMKKyAgICBteSAkU3RWaXJ0UGF0aCAgPSAweDA0MDE7ICAgICAgICAgICAgICAgICAgICMgRW5jb2RlZCB3b3JrYm9vayBmaWxlbmFtZQorCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2diIsICRjdGFicywgJFN0VmlydFBhdGgpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2V4dGVybnNoZWV0KCkKKyMKKyMgV3JpdGVzIHRoZSBFeGNlbCBCSUZGIEVYVEVSTlNIRUVUIHJlY29yZC4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgdXNlZCBieQorIyBmb3JtdWxhcy4gVE9ETyBOQU1FIHJlY29yZCBpcyByZXF1aXJlZCB0byBkZWZpbmUgdGhlIHByaW50IGFyZWEgYW5kIHRoZQorIyByZXBlYXQgcm93cyBhbmQgY29sdW1ucy4KKyMKK3N1YiBfc3RvcmVfZXh0ZXJuc2hlZXQgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwMTc7ICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisKKyAgICAjIEdldCB0aGUgZXh0ZXJuYWwgcmVmcworICAgIG15ICVleHRfcmVmcyA9ICV7JHNlbGYtPntfZXh0X3JlZnN9fTsKKyAgICBteSBAZXh0X3JlZnMgPSBzb3J0IHskZXh0X3JlZnN7JGF9IDw9PiAkZXh0X3JlZnN7JGJ9fSBrZXlzICVleHRfcmVmczsKKworICAgICMgQ2hhbmdlIHRoZSBleHRlcm5hbCByZWZzIGZyb20gc3RyaW5naWZpZWQgIjE6MSIgdG8gWzEsIDFdCisgICAgZm9yZWFjaCBteSAkcmVmIChAZXh0X3JlZnMpIHsKKyAgICAgICAgJHJlZiA9IFtzcGxpdCAvOi8sICRyZWZdOworICAgIH0KKworCisgICAgbXkgJGN4dGkgICAgICAgID0gc2NhbGFyIEBleHRfcmVmczsgICAgICAgICAjIE51bWJlciBvZiBFeGNlbCBYVEkgc3RydWN0dXJlcworICAgIG15ICRyZ3h0aSAgICAgICA9ICcnOyAgICAgICAgICAgICAgICAgICAgICAgIyBBcnJheSBvZiBYVEkgc3RydWN0dXJlcworCisgICAgIyBXcml0ZSB0aGUgWFRJIHN0cnVjdHMKKyAgICBmb3JlYWNoIG15ICRleHRfcmVmIChAZXh0X3JlZnMpIHsKKyAgICAgICAgJHJneHRpIC49IHBhY2soInZ2diIsIDAsICRleHRfcmVmLT5bMF0sICRleHRfcmVmLT5bMV0pCisgICAgfQorCisKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2IiwgJGN4dGkpIC4gJHJneHRpOworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgbGVuZ3RoICRkYXRhKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9uYW1lKCkKKyMKKyMKKyMgU3RvcmUgdGhlIE5BTUUgcmVjb3JkIHVzZWQgZm9yIHN0b3JpbmcgdGhlIHByaW50IGFyZWEsIHJlcGVhdCByb3dzLCByZXBlYXQKKyMgY29sdW1ucywgYXV0b2ZpbHRlcnMgYW5kIGRlZmluZWQgbmFtZXMuCisjCisjIFRPRE8uIFRoaXMgaXMgYSBtb3JlIGdlbmVyaWMgdmVyc2lvbiB0aGF0IHdpbGwgcmVwbGFjZSBfc3RvcmVfbmFtZV9zaG9ydCgpCisjICAgICAgIGFuZCBfc3RvcmVfbmFtZV9sb25nKCkuCisjCitzdWIgX3N0b3JlX25hbWUgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICAgICA9IDB4MDAxODsgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG5hbWUgICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRlbmNvZGluZyAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkc2hlZXRfaW5kZXggICAgID0gc2hpZnQ7CisgICAgbXkgJGZvcm11bGEgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHRleHRfbGVuZ3RoICAgICA9IGxlbmd0aCAkbmFtZTsKKyAgICBteSAkZm9ybXVsYV9sZW5ndGggID0gbGVuZ3RoICRmb3JtdWxhOworCisgICAgIyBVVEYtMTYgc3RyaW5nIGxlbmd0aCBpcyBpbiBjaGFyYWN0ZXJzIG5vdCBieXRlcy4KKyAgICAkdGV4dF9sZW5ndGggICAgICAgLz0gMiBpZiAkZW5jb2Rpbmc7CisKKworICAgIG15ICRncmJpdCAgICAgICAgICAgPSAweDAwMDA7ICAgICAgICMgT3B0aW9uIGZsYWdzCisgICAgbXkgJHNob3J0Y3V0ICAgICAgICA9IDB4MDA7ICAgICAgICAgIyBLZXlib2FyZCBzaG9ydGN1dAorICAgIG15ICRpeGFscyAgICAgICAgICAgPSAweDAwMDA7ICAgICAgICMgVW51c2VkIGluZGV4LgorICAgIG15ICRtZW51X2xlbmd0aCAgICAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIGN1c3QgbWVudSB0ZXh0CisgICAgbXkgJGRlc2NfbGVuZ3RoICAgICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2YgZGVzY3JpcHRpb24gdGV4dAorICAgIG15ICRoZWxwX2xlbmd0aCAgICAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIGhlbHAgdG9waWMgdGV4dAorICAgIG15ICRzdGF0dXNfbGVuZ3RoICAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIHN0YXR1cyBiYXIgdGV4dAorCisgICAgIyBTZXQgZ3JiaXQgYnVpbHQtaW4gZmxhZyBhbmQgdGhlIGhpZGRlbiBmbGFnIGZvciBhdXRvZmlsdGVycy4KKyAgICBpZiAoJHRleHRfbGVuZ3RoID09IDEpIHsKKyAgICAgICAgJGdyYml0ID0gMHgwMDIwIGlmIG9yZCAkbmFtZSA9PSAweDA2OyAjIFByaW50IGFyZWEKKyAgICAgICAgJGdyYml0ID0gMHgwMDIwIGlmIG9yZCAkbmFtZSA9PSAweDA3OyAjIFByaW50IHRpdGxlcworICAgICAgICAkZ3JiaXQgPSAweDAwMjEgaWYgb3JkICRuYW1lID09IDB4MEQ7ICMgQXV0b2ZpbHRlcgorICAgIH0KKworICAgIG15ICRkYXRhICAgICAgICAgICAgPSBwYWNrICJ2IiwgJGdyYml0OworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJHNob3J0Y3V0OworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJHRleHRfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJ2IiwgJGZvcm11bGFfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJ2IiwgJGl4YWxzOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJ2IiwgJHNoZWV0X2luZGV4OworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJG1lbnVfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJGRlc2NfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJGhlbHBfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJHN0YXR1c19sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgIkMiLCAkZW5jb2Rpbmc7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49ICRuYW1lOworICAgICRkYXRhICAgICAgICAgICAgICAuPSAkZm9ybXVsYTsKKworICAgIG15ICRoZWFkZXIgICAgICAgICAgPSBwYWNrICJ2diIsICRyZWNvcmQsIGxlbmd0aCAkZGF0YTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9uYW1lX3Nob3J0KCkKKyMKKyMKKyMgU3RvcmUgdGhlIE5BTUUgcmVjb3JkIGluIHRoZSBzaG9ydCBmb3JtYXQgdGhhdCBpcyB1c2VkIGZvciBzdG9yaW5nIHRoZSBwcmludAorIyBhcmVhLCByZXBlYXQgcm93cyBvbmx5IGFuZCByZXBlYXQgY29sdW1ucyBvbmx5LgorIworc3ViIF9zdG9yZV9uYW1lX3Nob3J0IHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwMTg7ICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDFiOyAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRpbmRleCAgICAgICAgICAgPSBzaGlmdDsgICAgICAgICMgU2hlZXQgaW5kZXgKKyAgICBteSAkdHlwZSAgICAgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJGV4dF9yZWYgICAgICAgICA9IHNoaWZ0OyAgICAgICAgIyBUT0RPCisKKyAgICBteSAkZ3JiaXQgICAgICAgICAgID0gMHgwMDIwOyAgICAgICAjIE9wdGlvbiBmbGFncworICAgIG15ICRjaEtleSAgICAgICAgICAgPSAweDAwOyAgICAgICAgICMgS2V5Ym9hcmQgc2hvcnRjdXQKKyAgICBteSAkY2NoICAgICAgICAgICAgID0gMHgwMTsgICAgICAgICAjIExlbmd0aCBvZiB0ZXh0IG5hbWUKKyAgICBteSAkY2NlICAgICAgICAgICAgID0gMHgwMDBiOyAgICAgICAjIExlbmd0aCBvZiB0ZXh0IGRlZmluaXRpb24KKyAgICBteSAkdW5rbm93bjAxICAgICAgID0gMHgwMDAwOyAgICAgICAjCisgICAgbXkgJGl4YWxzICAgICAgICAgICA9ICRpbmRleCArMTsgICAgIyBTaGVldCBpbmRleAorICAgIG15ICR1bmtub3duMDIgICAgICAgPSAweDAwOyAgICAgICAgICMKKyAgICBteSAkY2NoQ3VzdE1lbnUgICAgID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBjdXN0IG1lbnUgdGV4dAorICAgIG15ICRjY2hEZXNjcmlwdGlvbiAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIGRlc2NyaXB0aW9uIHRleHQKKyAgICBteSAkY2NoSGVscHRvcGljICAgID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBoZWxwIHRvcGljIHRleHQKKyAgICBteSAkY2NoU3RhdHVzdGV4dCAgID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBzdGF0dXMgYmFyIHRleHQKKyAgICBteSAkcmdjaCAgICAgICAgICAgID0gJHR5cGU7ICAgICAgICAjIEJ1aWx0LWluIG5hbWUgdHlwZQorICAgIG15ICR1bmtub3duMDMgICAgICAgPSAweDNiOyAgICAgICAgICMKKworICAgIG15ICRyb3dtaW4gICAgICAgICAgPSAkX1swXTsgICAgICAgICMgU3RhcnQgcm93CisgICAgbXkgJHJvd21heCAgICAgICAgICA9ICRfWzFdOyAgICAgICAgIyBFbmQgcm93CisgICAgbXkgJGNvbG1pbiAgICAgICAgICA9ICRfWzJdOyAgICAgICAgIyBTdGFydCBjb2x1bW4KKyAgICBteSAkY29sbWF4ICAgICAgICAgID0gJF9bM107ICAgICAgICAjIGVuZCBjb2x1bW4KKworICAgIG15ICRoaWRkZW4gICAgICAgICAgPSAkX1s0XTsgICAgICAgICMgTmFtZSBpcyBoaWRkZW4KKyAgICAkZ3JiaXQgICAgICAgICAgICAgID0gMHgwMDIxIGlmICRoaWRkZW47CisKKyAgICBteSAkaGVhZGVyICAgICAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgICAgID0gcGFjaygidiIsICAkZ3JiaXQpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRjaEtleSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNjaCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJGNjZSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJHVua25vd24wMSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJGl4YWxzKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkdW5rbm93bjAyKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoQ3VzdE1lbnUpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRjY2hEZXNjcmlwdGlvbik7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNjaEhlbHB0b3BpYyk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNjaFN0YXR1c3RleHQpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRyZ2NoKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkdW5rbm93bjAzKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkZXh0X3JlZik7CisKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkcm93bWluKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkcm93bWF4KTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkY29sbWluKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkY29sbWF4KTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9uYW1lX2xvbmcoKQorIworIworIyBTdG9yZSB0aGUgTkFNRSByZWNvcmQgaW4gdGhlIGxvbmcgZm9ybWF0IHRoYXQgaXMgdXNlZCBmb3Igc3RvcmluZyB0aGUgcmVwZWF0CisjIHJvd3MgYW5kIGNvbHVtbnMgd2hlbiBib3RoIGFyZSBzcGVjaWZpZWQuIFRoaXMgc2hhcmUgYSBsb3Qgb2YgY29kZSB3aXRoCisjIF9zdG9yZV9uYW1lX3Nob3J0KCkgYnV0IHdlIHVzZSBhIHNlcGFyYXRlIG1ldGhvZCB0byBrZWVwIHRoZSBjb2RlIGNsZWFuLgorIyBDb2RlIGFic3RyYWN0aW9uIGZvciByZXVzZSBjYW4gYmUgY2FycmllZCB0b28gZmFyLCBhbmQgSSBzaG91bGQga25vdy4gOy0pCisjCitzdWIgX3N0b3JlX25hbWVfbG9uZyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMDE4OyAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDB4MDAyYTsgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkaW5kZXggICAgICAgICAgID0gc2hpZnQ7ICAgICAgICAjIFNoZWV0IGluZGV4CisgICAgbXkgJHR5cGUgICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRleHRfcmVmICAgICAgICAgPSBzaGlmdDsgICAgICAgICMgVE9ETworCisgICAgbXkgJGdyYml0ICAgICAgICAgICA9IDB4MDAyMDsgICAgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkY2hLZXkgICAgICAgICAgID0gMHgwMDsgICAgICAgICAjIEtleWJvYXJkIHNob3J0Y3V0CisgICAgbXkgJGNjaCAgICAgICAgICAgICA9IDB4MDE7ICAgICAgICAgIyBMZW5ndGggb2YgdGV4dCBuYW1lCisgICAgbXkgJGNjZSAgICAgICAgICAgICA9IDB4MDAxYTsgICAgICAgIyBMZW5ndGggb2YgdGV4dCBkZWZpbml0aW9uCisgICAgbXkgJHVua25vd24wMSAgICAgICA9IDB4MDAwMDsgICAgICAgIworICAgIG15ICRpeGFscyAgICAgICAgICAgPSAkaW5kZXggKzE7ICAgICMgU2hlZXQgaW5kZXgKKyAgICBteSAkdW5rbm93bjAyICAgICAgID0gMHgwMDsgICAgICAgICAjCisgICAgbXkgJGNjaEN1c3RNZW51ICAgICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2YgY3VzdCBtZW51IHRleHQKKyAgICBteSAkY2NoRGVzY3JpcHRpb24gID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBkZXNjcmlwdGlvbiB0ZXh0CisgICAgbXkgJGNjaEhlbHB0b3BpYyAgICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2YgaGVscCB0b3BpYyB0ZXh0CisgICAgbXkgJGNjaFN0YXR1c3RleHQgICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2Ygc3RhdHVzIGJhciB0ZXh0CisgICAgbXkgJHJnY2ggICAgICAgICAgICA9ICR0eXBlOyAgICAgICAgIyBCdWlsdC1pbiBuYW1lIHR5cGUKKworICAgIG15ICR1bmtub3duMDMgICAgICAgPSAweDI5OworICAgIG15ICR1bmtub3duMDQgICAgICAgPSAweDAwMTc7CisgICAgbXkgJHVua25vd24wNSAgICAgICA9IDB4M2I7CisKKyAgICBteSAkcm93bWluICAgICAgICAgID0gJF9bMF07ICAgICAgICAjIFN0YXJ0IHJvdworICAgIG15ICRyb3dtYXggICAgICAgICAgPSAkX1sxXTsgICAgICAgICMgRW5kIHJvdworICAgIG15ICRjb2xtaW4gICAgICAgICAgPSAkX1syXTsgICAgICAgICMgU3RhcnQgY29sdW1uCisgICAgbXkgJGNvbG1heCAgICAgICAgICA9ICRfWzNdOyAgICAgICAgIyBlbmQgY29sdW1uCisKKworICAgIG15ICRoZWFkZXIgICAgICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICAgICAgPSBwYWNrKCJ2IiwgICRncmJpdCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNoS2V5KTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkY2NlKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkdW5rbm93bjAxKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkaXhhbHMpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICR1bmtub3duMDIpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRjY2hDdXN0TWVudSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNjaERlc2NyaXB0aW9uKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoSGVscHRvcGljKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoU3RhdHVzdGV4dCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJHJnY2gpOworCisgICAgIyBDb2x1bW4gZGVmaW5pdGlvbgorICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICR1bmtub3duMDMpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICR1bmtub3duMDQpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICR1bmtub3duMDUpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRleHRfcmVmKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAweDAwMDApOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgIDB4ZmZmZik7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJGNvbG1pbik7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJGNvbG1heCk7CisKKyAgICAjIFJvdyBkZWZpbml0aW9uCisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJHVua25vd24wNSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJGV4dF9yZWYpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRyb3dtaW4pOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRyb3dtYXgpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgIDB4MDApOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgIDB4ZmYpOworICAgICMgRW5kIG9mIGRhdGEKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAweDEwKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9wYWxldHRlKCkKKyMKKyMgU3RvcmVzIHRoZSBQQUxFVFRFIGJpZmYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9wYWxldHRlIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRhcmVmICAgICAgICAgICAgPSAkc2VsZi0+e19wYWxldHRlfTsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwOTI7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDIgKyA0ICogQCRhcmVmOyAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRjY3YgICAgICAgICAgICAgPSAgICAgICAgIEAkYXJlZjsgICAjIE51bWJlciBvZiBSR0IgdmFsdWVzIHRvIGZvbGxvdworICAgIG15ICRkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBSR0IgZGF0YQorCisgICAgIyBQYWNrIHRoZSBSR0IgZGF0YQorICAgICRkYXRhIC49IHBhY2sgIkNDQ0MiLCBAJF8gZm9yIEAkYXJlZjsKKworICAgIG15ICRoZWFkZXIgPSBwYWNrKCJ2dnYiLCAgJHJlY29yZCwgJGxlbmd0aCwgJGNjdik7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY29kZXBhZ2UoKQorIworIyBTdG9yZXMgdGhlIENPREVQQUdFIGJpZmYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9jb2RlcGFnZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMDQyOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDAyOyAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRjdiAgICAgICAgICAgICAgPSAkc2VsZi0+e19jb2RlcGFnZX07ICAgIyBUaGUgY29kZSBwYWdlCisKKyAgICBteSAkaGVhZGVyICAgICAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgICAgID0gcGFjaygidiIsICAkY3YpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NvdW50cnkoKQorIworIyBTdG9yZXMgdGhlIENPVU5UUlkgYmlmZiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2NvdW50cnkgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICAgICA9IDB4MDA4QzsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDB4MDAwNDsgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKyAgICBteSAkY291bnRyeV9kZWZhdWx0ID0gJHNlbGYtPntfY291bnRyeX07CisgICAgbXkgJGNvdW50cnlfd2luX2luaSA9ICRzZWxmLT57X2NvdW50cnl9OworCisgICAgbXkgJGhlYWRlciAgICAgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgICAgICA9IHBhY2soInZ2IiwgJGNvdW50cnlfZGVmYXVsdCwgJGNvdW50cnlfd2luX2luaSk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfaGlkZW9iaigpCisjCisjIFN0b3JlcyB0aGUgSElERU9CSiBiaWZmIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfaGlkZW9iaiB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMDhEOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDAyOyAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRoaWRlICAgICAgICAgICAgPSAkc2VsZi0+e19oaWRlb2JqfTsgICAgIyBPcHRpb24gdG8gaGlkZSBvYmplY3RzCisKKyAgICBteSAkaGVhZGVyICAgICAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgICAgID0gcGFjaygidiIsICAkaGlkZSk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2FsY3VsYXRlX2V4dGVybl9zaXplcygpCisjCisjIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBzcGFjZSByZXF1aXJlZCBieSB0aGUgU1VQQk9PSywgRVhURVJOU0hFRVQgYW5kIE5BTUUKKyMgcmVjb3JkcyBzbyB0aGF0IGl0IGNhbiBiZSBhZGRlZCB0byB0aGUgQk9VTkRTSEVFVCBvZmZzZXRzLgorIworc3ViIF9jYWxjdWxhdGVfZXh0ZXJuX3NpemVzIHsKKworICAgIG15ICRzZWxmICAgPSBzaGlmdDsKKworCisgICAgbXkgJWV4dF9yZWZzICAgICAgICA9ICRzZWxmLT57X3BhcnNlcn0tPmdldF9leHRfc2hlZXRzKCk7CisgICAgbXkgJGV4dF9yZWZfY291bnQgICA9IHNjYWxhciBrZXlzICVleHRfcmVmczsKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMDsKKyAgICBteSAkaW5kZXggICAgICAgICAgID0gMDsKKworCisgICAgaWYgKEB7JHNlbGYtPntfZGVmaW5lZF9uYW1lc319KSB7CisgICAgICAgIG15ICRpbmRleCAgID0gMDsKKyAgICAgICAgbXkgJGtleSAgICAgPSAiJGluZGV4OiRpbmRleCI7CisKKyAgICAgICAgaWYgKG5vdCBleGlzdHMgJGV4dF9yZWZzeyRrZXl9KSB7CisgICAgICAgICAgICAkZXh0X3JlZnN7JGtleX0gPSAkZXh0X3JlZl9jb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIG15ICRkZWZpbmVkX25hbWUgKEB7JHNlbGYtPntfZGVmaW5lZF9uYW1lc319KSB7CisgICAgICAgICRsZW5ndGggKz0gMTkKKyAgICAgICAgICAgICAgICAgICArIGxlbmd0aCgkZGVmaW5lZF9uYW1lLT57bmFtZX0pCisgICAgICAgICAgICAgICAgICAgKyBsZW5ndGgoJGRlZmluZWRfbmFtZS0+e2Zvcm11bGF9KTsKKyAgICB9CisKKworICAgIGZvcmVhY2ggbXkgJHdvcmtzaGVldCAoQHskc2VsZi0+e193b3Jrc2hlZXRzfX0pIHsKKworICAgICAgICBteSAkcm93bWluICAgICAgPSAkd29ya3NoZWV0LT57X3RpdGxlX3Jvd21pbn07CisgICAgICAgIG15ICRjb2xtaW4gICAgICA9ICR3b3Jrc2hlZXQtPntfdGl0bGVfY29sbWlufTsKKyAgICAgICAgbXkgJGZpbHRlciAgICAgID0gJHdvcmtzaGVldC0+e19maWx0ZXJfY291bnR9OworICAgICAgICBteSAka2V5ICAgICAgICAgPSAiJGluZGV4OiRpbmRleCI7CisgICAgICAgICRpbmRleCsrOworCisKKyAgICAgICAgIyBBZGQgYXJlYSBOQU1FIHJlY29yZHMKKyAgICAgICAgIworICAgICAgICBpZiAoZGVmaW5lZCAkd29ya3NoZWV0LT57X3ByaW50X3Jvd21pbn0pIHsKKyAgICAgICAgICAgICRleHRfcmVmc3ska2V5fSA9ICRleHRfcmVmX2NvdW50KysgaWYgbm90IGV4aXN0cyAkZXh0X3JlZnN7JGtleX07CisKKyAgICAgICAgICAgICRsZW5ndGggKz0gMzEgOworICAgICAgICB9CisKKworICAgICAgICAjIEFkZCB0aXRsZSAgTkFNRSByZWNvcmRzCisgICAgICAgICMKKyAgICAgICAgaWYgKGRlZmluZWQgJHJvd21pbiBhbmQgZGVmaW5lZCAkY29sbWluKSB7CisgICAgICAgICAgICAkZXh0X3JlZnN7JGtleX0gPSAkZXh0X3JlZl9jb3VudCsrIGlmIG5vdCBleGlzdHMgJGV4dF9yZWZzeyRrZXl9OworCisgICAgICAgICAgICAkbGVuZ3RoICs9IDQ2OworICAgICAgICB9CisgICAgICAgIGVsc2lmIChkZWZpbmVkICRyb3dtaW4gb3IgZGVmaW5lZCAkY29sbWluKSB7CisgICAgICAgICAgICAkZXh0X3JlZnN7JGtleX0gPSAkZXh0X3JlZl9jb3VudCsrIGlmIG5vdCBleGlzdHMgJGV4dF9yZWZzeyRrZXl9OworCisgICAgICAgICAgICAkbGVuZ3RoICs9IDMxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBUT0RPLCBtYXkgbmVlZCB0aGlzIGxhdGVyLgorICAgICAgICB9CisKKworICAgICAgICAjIEFkZCBBdXRvZmlsdGVyICBOQU1FIHJlY29yZHMKKyAgICAgICAgIworICAgICAgICBpZiAoJGZpbHRlcikgeworICAgICAgICAgICAgJGV4dF9yZWZzeyRrZXl9ID0gJGV4dF9yZWZfY291bnQrKyBpZiBub3QgZXhpc3RzICRleHRfcmVmc3ska2V5fTsKKworICAgICAgICAgICAgJGxlbmd0aCArPSAzMTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBVcGRhdGUgdGhlIHJlZiBjb3VudHMuCisgICAgJHNlbGYtPntfZXh0X3JlZl9jb3VudH0gPSAkZXh0X3JlZl9jb3VudDsKKyAgICAkc2VsZi0+e19leHRfcmVmc30gICAgICA9IHslZXh0X3JlZnN9OworCisKKyAgICAjIElmIHRoZXJlIGFyZSBubyBleHRlcm5hbCByZWZzIHRoZW4gd2UgZG9uJ3Qgd3JpdGUsIFNVUEJPT0ssIEVYVEVSTlNIRUVUCisgICAgIyBhbmQgTkFNRS4gVGhlcmVmb3JlIHRoZSBsZW5ndGggaXMgMC4KKworICAgIHJldHVybiAkbGVuZ3RoID0gMCBpZiAkZXh0X3JlZl9jb3VudCA9PSAwOworCisKKyAgICAjIFRoZSBTVVBCT09LIHJlY29yZCBpcyA4IGJ5dGVzCisgICAgJGxlbmd0aCArPSA4OworCisgICAgIyBUaGUgRVhURVJOU0hFRVQgcmVjb3JkIGlzIDYgYnl0ZXMgKyA2IGJ5dGVzIGZvciBlYWNoIGV4dGVybmFsIHJlZgorICAgICRsZW5ndGggKz0gNiAqICgxICsgJGV4dF9yZWZfY291bnQpOworCisgICAgcmV0dXJuICRsZW5ndGg7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2FsY3VsYXRlX3NoYXJlZF9zdHJpbmdfc2l6ZXMoKQorIworIyBIYW5kbGluZyBvZiB0aGUgU1NUIGNvbnRpbnVlIGJsb2NrcyBpcyBjb21wbGljYXRlZCBieSB0aGUgbmVlZCB0byBpbmNsdWRlIGFuCisjIGFkZGl0aW9uYWwgY29udGludWF0aW9uIGJ5dGUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHN0cmluZyBpcyBzcGxpdCBiZXR3ZWVuCisjIGJsb2NrcyBvciB3aGV0aGVyIGl0IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jay4gKFRoZXJlIGFyZSBhbHNvCisjIGFkZGl0aW9uYWwgY29tcGxpY2F0aW9ucyB0aGF0IHdpbGwgYXJpc2UgbGF0ZXIgd2hlbi9pZiBSaWNoIFN0cmluZ3MgYXJlCisjIHN1cHBvcnRlZCkuIEFzIHN1Y2ggd2UgY2Fubm90IHVzZSB0aGUgc2ltcGxlIENPTlRJTlVFIG1lY2hhbmlzbSBwcm92aWRlZCBieQorIyB0aGUgX2FkZF9jb250aW51ZSgpIG1ldGhvZCBpbiBCSUZGd3JpdGVyLnBtLiBUaHVzIHdlIGhhdmUgdG8gbWFrZSB0d28gcGFzc2VzCisjIHRocm91Z2ggdGhlIHN0cmluZ3MgZGF0YS4gVGhlIGZpcnN0IGlzIHRvIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgYmxvY2sgc2l6ZXMKKyMgYW5kIHRoZSBzZWNvbmQsIGluIF9zdG9yZV9zaGFyZWRfc3RyaW5ncygpLCBpcyB0byB3cml0ZSB0aGUgYWN0dWFsIHN0cmluZ3MuCisjIFRoZSBmaXJzdCBwYXNzIHRocm91Z2ggdGhlIGRhdGEgaXMgYWxzbyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgU1NUCisjIGFuZCBDT05USU5VRSByZWNvcmRzIGZvciB1c2UgaW4gc2V0dGluZyB0aGUgQk9VTkRTSEVFVCByZWNvcmQgb2Zmc2V0cy4gVGhlCisjIGRvd25zaWRlIG9mIHRoaXMgaXMgdGhhdCB0aGUgc2FtZSBhbGdvcml0aG0gcmVwZWF0ZWQgaW4gX3N0b3JlX3NoYXJlZF9zdHJpbmdzLgorIworc3ViIF9jYWxjdWxhdGVfc2hhcmVkX3N0cmluZ19zaXplcyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgQHN0cmluZ3M7CisgICAgJCNzdHJpbmdzID0gJHNlbGYtPntfc3RyX3VuaXF1ZX0gLTE7ICMgUHJlLWV4dGVuZCBhcnJheQorCisgICAgd2hpbGUgKG15ICRrZXkgPSBlYWNoICV7JHNlbGYtPntfc3RyX3RhYmxlfX0pIHsKKyAgICAgICAgJHN0cmluZ3NbJHNlbGYtPntfc3RyX3RhYmxlfS0+eyRrZXl9XSA9ICRrZXk7CisgICAgfQorCisgICAgIyBUaGUgU1NUIGRhdGEgY291bGQgYmUgdmVyeSBsYXJnZSwgZnJlZSBzb21lIG1lbW9yeSAobWF5YmUpLgorICAgICRzZWxmLT57X3N0cl90YWJsZX0gPSB1bmRlZjsKKyAgICAkc2VsZi0+e19zdHJfYXJyYXl9ID0gW0BzdHJpbmdzXTsKKworCisgICAgIyBJdGVyYXRlIHRocm91Z2ggdGhlIHN0cmluZ3MgdG8gY2FsY3VsYXRlIHRoZSBDT05USU5VRSBibG9jayBzaXplcy4KKyAgICAjCisgICAgIyBUaGUgU1NUIGJsb2NrcyByZXF1aXJlcyBhIHNwZWNpYWxpc2VkIENPTlRJTlVFIGJsb2NrLCBzbyB3ZSBoYXZlIHRvCisgICAgIyBlbnN1cmUgdGhhdCB0aGUgbWF4aW11bSBkYXRhIGJsb2NrIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBsaW1pdCB1c2VkIGJ5CisgICAgIyBfYWRkX2NvbnRpbnVlKCkgaW4gQklGRndyaXRlci5wbS4gRm9yIHNpbXBsaWNpdHkgd2UgdXNlIHRoZSBzYW1lIHNpemUKKyAgICAjIGZvciB0aGUgU1NUIGFuZCBDT05USU5VRSByZWNvcmRzOgorICAgICMgICA4MjI4IDogTWF4aW11bSBFeGNlbDk3IGJsb2NrIHNpemUKKyAgICAjICAgICAtNCA6IExlbmd0aCBvZiBibG9jayBoZWFkZXIKKyAgICAjICAgICAtOCA6IExlbmd0aCBvZiBhZGRpdGlvbmFsIFNTVCBoZWFkZXIgaW5mb3JtYXRpb24KKyAgICAjICAgICAtOCA6IEFyYml0cmFyeSBudW1iZXIgdG8ga2VlcCB3aXRoaW4gX2FkZF9jb250aW51ZSgpIGxpbWl0CisgICAgIyA9IDgyMDgKKyAgICAjCisgICAgbXkgJGNvbnRpbnVlX2xpbWl0ID0gODIwODsKKyAgICBteSAkYmxvY2tfbGVuZ3RoICAgPSAwOworICAgIG15ICR3cml0dGVuICAgICAgICA9IDA7CisgICAgbXkgQGJsb2NrX3NpemVzOworICAgIG15ICRjb250aW51ZSAgICAgICA9IDA7CisKKyAgICBmb3IgbXkgJHN0cmluZyAoQHN0cmluZ3MpIHsKKworICAgICAgICBteSAkc3RyaW5nX2xlbmd0aCA9IGxlbmd0aCAkc3RyaW5nOworICAgICAgICBteSAkZW5jb2RpbmcgICAgICA9IHVucGFjayAieHggQyIsICRzdHJpbmc7CisgICAgICAgIG15ICRzcGxpdF9zdHJpbmcgID0gMDsKKworCisgICAgICAgICMgQmxvY2sgbGVuZ3RoIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHN0cmluZ3MgdGhhdCB3aWxsIGJlCisgICAgICAgICMgd3JpdHRlbiBvdXQgaW4gYSBzaW5nbGUgU1NUIG9yIENPTlRJTlVFIGJsb2NrLgorICAgICAgICAjCisgICAgICAgICRibG9ja19sZW5ndGggKz0gJHN0cmluZ19sZW5ndGg7CisKKworICAgICAgICAjIFdlIGNhbiB3cml0ZSB0aGUgc3RyaW5nIGlmIGl0IGRvZXNuJ3QgY3Jvc3MgYSBDT05USU5VRSBib3VuZGFyeQorICAgICAgICBpZiAoJGJsb2NrX2xlbmd0aCA8ICRjb250aW51ZV9saW1pdCkgeworICAgICAgICAgICAgJHdyaXR0ZW4gKz0gJHN0cmluZ19sZW5ndGg7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKworICAgICAgICAjIERlYWwgd2l0aCB0aGUgY2FzZXMgd2hlcmUgdGhlIG5leHQgc3RyaW5nIHRvIGJlIHdyaXR0ZW4gd2lsbCBleGNlZWQKKyAgICAgICAgIyB0aGUgQ09OVElOVUUgYm91bmRhcnkuIElmIHRoZSBzdHJpbmcgaXMgdmVyeSBsb25nIGl0IG1heSBuZWVkIHRvIGJlCisgICAgICAgICMgd3JpdHRlbiBpbiBtb3JlIHRoYW4gb25lIENPTlRJTlVFIHJlY29yZC4KKyAgICAgICAgIworICAgICAgICB3aGlsZSAoJGJsb2NrX2xlbmd0aCA+PSAkY29udGludWVfbGltaXQpIHsKKworICAgICAgICAgICAgIyBXZSBuZWVkIHRvIGF2b2lkIHRoZSBjYXNlIHdoZXJlIGEgc3RyaW5nIGlzIGNvbnRpbnVlZCBpbiB0aGUgZmlyc3QKKyAgICAgICAgICAgICMgbiBieXRlcyB0aGF0IGNvbnRhaW4gdGhlIHN0cmluZyBoZWFkZXIgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAjCisgICAgICAgICAgICBteSAkaGVhZGVyX2xlbmd0aCAgID0gMzsgIyBNaW4gc3RyaW5nICsgaGVhZGVyIHNpemUgLTEKKyAgICAgICAgICAgIG15ICRzcGFjZV9yZW1haW5pbmcgPSAkY29udGludWVfbGltaXQgLSR3cml0dGVuIC0kY29udGludWU7CisKKworICAgICAgICAgICAgIyBVbmljb2RlIGRhdGEgc2hvdWxkIG9ubHkgYmUgc3BsaXQgb24gY2hhciAoMiBieXRlKSBib3VuZGFyaWVzLgorICAgICAgICAgICAgIyBUaGVyZWZvcmUsIGluIHNvbWUgY2FzZXMgd2UgbmVlZCB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUKKyAgICAgICAgICAgICMgc3BhY2UgYnkgMSBieXRlIHRvIGVuc3VyZSB0aGUgY29ycmVjdCBhbGlnbm1lbnQuCisgICAgICAgICAgICBteSAkYWxpZ24gPSAwOworCisgICAgICAgICAgICAjIE9ubHkgYXBwbGllcyB0byBVbmljb2RlIHN0cmluZ3MKKyAgICAgICAgICAgIGlmICgkZW5jb2RpbmcgPT0gMSkgeworICAgICAgICAgICAgICAgICMgTWluIHN0cmluZyArIGhlYWRlciBzaXplIC0xCisgICAgICAgICAgICAgICAgJGhlYWRlcl9sZW5ndGggPSA0OworCisgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9yZW1haW5pbmcgPiAkaGVhZGVyX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAjIFN0cmluZyBjb250YWlucyAzIGJ5dGUgaGVhZGVyID0+IHNwbGl0IG9uIG9kZCBib3VuZGFyeQorICAgICAgICAgICAgICAgICAgICBpZiAobm90ICRzcGxpdF9zdHJpbmcgYW5kICRzcGFjZV9yZW1haW5pbmcgJSAyICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzcGFjZV9yZW1haW5pbmctLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRhbGlnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIyBTcGxpdCBzZWN0aW9uIHdpdGhvdXQgaGVhZGVyID0+IHNwbGl0IG9uIGV2ZW4gYm91bmRhcnkKKyAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCRzcGxpdF9zdHJpbmcgYW5kICRzcGFjZV9yZW1haW5pbmcgJSAyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzcGFjZV9yZW1haW5pbmctLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRhbGlnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAkc3BsaXRfc3RyaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCRzcGFjZV9yZW1haW5pbmcgPiAkaGVhZGVyX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICMgV3JpdGUgYXMgbXVjaCBhcyBwb3NzaWJsZSBvZiB0aGUgc3RyaW5nIGluIHRoZSBjdXJyZW50IGJsb2NrCisgICAgICAgICAgICAgICAgJHdyaXR0ZW4gICAgICArPSAkc3BhY2VfcmVtYWluaW5nOworCisgICAgICAgICAgICAgICAgIyBSZWR1Y2UgdGhlIGN1cnJlbnQgYmxvY2sgbGVuZ3RoIGJ5IHRoZSBhbW91bnQgd3JpdHRlbgorICAgICAgICAgICAgICAgICRibG9ja19sZW5ndGggLT0gJGNvbnRpbnVlX2xpbWl0IC0kY29udGludWUgLSRhbGlnbjsKKworICAgICAgICAgICAgICAgICMgU3RvcmUgdGhlIG1heCBzaXplIGZvciB0aGlzIGJsb2NrCisgICAgICAgICAgICAgICAgcHVzaCBAYmxvY2tfc2l6ZXMsICRjb250aW51ZV9saW1pdCAtJGFsaWduOworCisgICAgICAgICAgICAgICAgIyBJZiB0aGUgY3VycmVudCBzdHJpbmcgd2FzIHNwbGl0IHRoZW4gdGhlIG5leHQgQ09OVElOVUUgYmxvY2sKKyAgICAgICAgICAgICAgICAjIHNob3VsZCBoYXZlIHRoZSBzdHJpbmcgY29udGludWUgZmxhZyAoZ3JiaXQpIHNldCB1bmxlc3MgdGhlCisgICAgICAgICAgICAgICAgIyBzcGxpdCBzdHJpbmcgZml0cyBleGFjdGx5IGludG8gdGhlIHJlbWFpbmluZyBzcGFjZS4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgaWYgKCRibG9ja19sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICRjb250aW51ZSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkY29udGludWUgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgIyBTdG9yZSB0aGUgbWF4IHNpemUgZm9yIHRoaXMgYmxvY2sKKyAgICAgICAgICAgICAgICBwdXNoIEBibG9ja19zaXplcywgJHdyaXR0ZW4gKyRjb250aW51ZTsKKworICAgICAgICAgICAgICAgICMgTm90IGVub3VnaCBzcGFjZSB0byBzdGFydCB0aGUgc3RyaW5nIGluIHRoZSBjdXJyZW50IGJsb2NrCisgICAgICAgICAgICAgICAgJGJsb2NrX2xlbmd0aCAtPSAkY29udGludWVfbGltaXQgLSRzcGFjZV9yZW1haW5pbmcgLSRjb250aW51ZTsKKyAgICAgICAgICAgICAgICAkY29udGludWUgPSAwOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgSWYgdGhlIHN0cmluZyAob3Igc3Vic3RyKSBpcyBzbWFsbCBlbm91Z2ggd2UgY2FuIHdyaXRlIGl0IGluIHRoZQorICAgICAgICAgICAgIyBuZXcgQ09OVElOVUUgYmxvY2suIEVsc2UsIGdvIHRocm91Z2ggdGhlIGxvb3AgYWdhaW4gdG8gd3JpdGUgaXQgaW4KKyAgICAgICAgICAgICMgb25lIG9yIG1vcmUgQ09OVElOVUUgYmxvY2tzCisgICAgICAgICAgICAjCisgICAgICAgICAgICBpZiAoJGJsb2NrX2xlbmd0aCA8ICRjb250aW51ZV9saW1pdCkgeworICAgICAgICAgICAgICAgICR3cml0dGVuID0gJGJsb2NrX2xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICMgU3RvcmUgdGhlIG1heCBzaXplIGZvciB0aGUgbGFzdCBibG9jayB1bmxlc3MgaXQgaXMgZW1wdHkKKyAgICBwdXNoIEBibG9ja19zaXplcywgJHdyaXR0ZW4gKyRjb250aW51ZSBpZiAkd3JpdHRlbiArJGNvbnRpbnVlOworCisKKyAgICAkc2VsZi0+e19zdHJfYmxvY2tfc2l6ZXN9ID0gW0BibG9ja19zaXplc107CisKKworICAgICMgQ2FsY3VsYXRlIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIFNTVCBhbmQgYXNzb2NpYXRlZCBDT05USU5VRXMgKGlmIGFueSkuCisgICAgIyBUaGUgU1NUIHJlY29yZCB3aWxsIGhhdmUgYSBsZW5ndGggZXZlbiBpZiBpdCBjb250YWlucyBubyBzdHJpbmdzLgorICAgICMgVGhpcyBsZW5ndGggaXMgcmVxdWlyZWQgdG8gc2V0IHRoZSBvZmZzZXRzIGluIHRoZSBCT1VORFNIRUVUIHJlY29yZHMgc2luY2UKKyAgICAjIHRoZXkgbXVzdCBiZSB3cml0dGVuIGJlZm9yZSB0aGUgU1NUIHJlY29yZHMKKyAgICAjCisgICAgbXkgJGxlbmd0aCAgPSAxMjsKKyAgICAkbGVuZ3RoICAgICs9ICAgICBzaGlmdCBAYmxvY2tfc2l6ZXMgaWYgICAgQGJsb2NrX3NpemVzOyAjIFNTVAorICAgICRsZW5ndGggICAgKz0gNCArIHNoaWZ0IEBibG9ja19zaXplcyB3aGlsZSBAYmxvY2tfc2l6ZXM7ICMgQ09OVElOVUVzCisKKyAgICByZXR1cm4gJGxlbmd0aDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zaGFyZWRfc3RyaW5ncygpCisjCisjIFdyaXRlIGFsbCBvZiB0aGUgd29ya2Jvb2tzIHN0cmluZ3MgaW50byBhbiBpbmRleGVkIGFycmF5LgorIworIyBTZWUgdGhlIGNvbW1lbnRzIGluIF9jYWxjdWxhdGVfc2hhcmVkX3N0cmluZ19zaXplcygpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIworIyBXZSBhbHNvIHVzZSB0aGlzIHJvdXRpbmUgdG8gcmVjb3JkIHRoZSBvZmZzZXRzIHJlcXVpcmVkIGJ5IHRoZSBFWFRTU1QgdGFibGUuCisjIEluIG9yZGVyIHRvIGRvIHRoaXMgd2UgZmlyc3QgaWRlbnRpZnkgdGhlIGZpcnN0IHN0cmluZyBpbiBhbiBFWFRTU1QgYnVja2V0CisjIGFuZCB0aGVuIHN0b3JlIGl0cyBnbG9iYWwgYW5kIGxvY2FsIG9mZnNldCB3aXRoaW4gdGhlIFNTVCB0YWJsZS4gVGhlIG9mZnNldAorIyBvY2N1cnMgd2hlcmV2ZXIgdGhlIHN0YXJ0IG9mIHRoZSBidWNrZXQgc3RyaW5nIGlzIHdyaXR0ZW4gb3V0IHZpYSBhcHBlbmQoKS4KKyMKK3N1YiBfc3RvcmVfc2hhcmVkX3N0cmluZ3MgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15IEBzdHJpbmdzID0gQHskc2VsZi0+e19zdHJfYXJyYXl9fTsKKworCisgICAgbXkgJHJlY29yZCAgICAgICAgICAgICAgPSAweDAwRkM7ICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgICAgICAgID0gMHgwMDA4OyAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICR0b3RhbCAgICAgICAgICAgICAgID0gMHgwMDAwOworCisgICAgIyBJdGVyYXRlIHRocm91Z2ggdGhlIHN0cmluZ3MgdG8gY2FsY3VsYXRlIHRoZSBDT05USU5VRSBibG9jayBzaXplcworICAgIG15ICRjb250aW51ZV9saW1pdCA9IDgyMDg7CisgICAgbXkgJGJsb2NrX2xlbmd0aCAgID0gMDsKKyAgICBteSAkd3JpdHRlbiAgICAgICAgPSAwOworICAgIG15ICRjb250aW51ZSAgICAgICA9IDA7CisKKyAgICAjIFRoZSBTU1QgYW5kIENPTlRJTlVFIGJsb2NrIHNpemVzIGhhdmUgYmVlbiBwcmUtY2FsY3VsYXRlZCBieQorICAgICMgX2NhbGN1bGF0ZV9zaGFyZWRfc3RyaW5nX3NpemVzKCkKKyAgICBteSBAYmxvY2tfc2l6ZXMgICAgPSBAeyRzZWxmLT57X3N0cl9ibG9ja19zaXplc319OworCisKKyAgICAjIFRoZSBTU1QgcmVjb3JkIGlzIHJlcXVpcmVkIGV2ZW4gaWYgaXQgY29udGFpbnMgbm8gc3RyaW5ncy4gVGh1cyB3ZSB3aWxsCisgICAgIyBhbHdheXMgaGF2ZSBhIGxlbmd0aAorICAgICMKKyAgICBpZiAoQGJsb2NrX3NpemVzKSB7CisgICAgICAgICRsZW5ndGggPSA4ICsgc2hpZnQgQGJsb2NrX3NpemVzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBObyBzdHJpbmdzCisgICAgICAgICRsZW5ndGggPSA4OworICAgIH0KKworCisgICAgIyBJbml0aWFsaXNlIHZhcmlhYmxlcyB1c2VkIHRvIHRyYWNrIEVYVFNTVCBidWNrZXQgb2Zmc2V0cy4KKyAgICBteSAkZXh0c3N0X3N0cl9udW0gID0gLTE7CisgICAgbXkgJHNzdF9ibG9ja19zdGFydCA9ICRzZWxmLT57X2RhdGFzaXplfTsKKworCisgICAgIyBXcml0ZSB0aGUgU1NUIGJsb2NrIGhlYWRlciBpbmZvcm1hdGlvbgorICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygiVlYiLCAkc2VsZi0+e19zdHJfdG90YWx9LCAkc2VsZi0+e19zdHJfdW5pcXVlfSk7CisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisKKyAgICAjIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc3RyaW5ncyBhbmQgd3JpdGUgdGhlbSBvdXQKKyAgICBmb3IgbXkgJHN0cmluZyAoQHN0cmluZ3MpIHsKKworICAgICAgICBteSAkc3RyaW5nX2xlbmd0aCA9IGxlbmd0aCAkc3RyaW5nOworICAgICAgICBteSAkZW5jb2RpbmcgICAgICA9IHVucGFjayAieHggQyIsICRzdHJpbmc7CisgICAgICAgIG15ICRzcGxpdF9zdHJpbmcgID0gMDsKKyAgICAgICAgbXkgJGJ1Y2tldF9zdHJpbmcgPSAwOyAjIFVzZWQgdG8gdHJhY2sgRVhUU1NUIGJ1Y2tldCBvZmZzZXRzLgorCisKKyAgICAgICAgIyBDaGVjayBpZiB0aGUgc3RyaW5nIGlzIGF0IHRoZSBzdGFydCBvZiBhIEVYVFNTVCBidWNrZXQuCisgICAgICAgIGlmICgrKyRleHRzc3Rfc3RyX251bSAlICRzZWxmLT57X2V4dHNzdF9idWNrZXRfc2l6ZX0gPT0gMCkgeworICAgICAgICAgICAgJGJ1Y2tldF9zdHJpbmcgPSAxOworICAgICAgICB9CisKKworICAgICAgICAjIEJsb2NrIGxlbmd0aCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBzdHJpbmdzIHRoYXQgd2lsbCBiZQorICAgICAgICAjIHdyaXR0ZW4gb3V0IGluIGEgc2luZ2xlIFNTVCBvciBDT05USU5VRSBibG9jay4KKyAgICAgICAgIworICAgICAgICAkYmxvY2tfbGVuZ3RoICs9ICRzdHJpbmdfbGVuZ3RoOworCisKKyAgICAgICAgIyBXZSBjYW4gd3JpdGUgdGhlIHN0cmluZyBpZiBpdCBkb2Vzbid0IGNyb3NzIGEgQ09OVElOVUUgYm91bmRhcnkKKyAgICAgICAgaWYgKCRibG9ja19sZW5ndGggPCAkY29udGludWVfbGltaXQpIHsKKworICAgICAgICAgICAgIyBTdG9yZSBsb2NhdGlvbiBvZiBFWFRTU1QgYnVja2V0IHN0cmluZy4KKyAgICAgICAgICAgIGlmICgkYnVja2V0X3N0cmluZykgeworICAgICAgICAgICAgICAgIG15ICRnbG9iYWxfb2Zmc2V0ICAgPSAkc2VsZi0+e19kYXRhc2l6ZX07CisgICAgICAgICAgICAgICAgbXkgJGxvY2FsX29mZnNldCAgICA9ICRzZWxmLT57X2RhdGFzaXplfSAtICRzc3RfYmxvY2tfc3RhcnQ7CisKKyAgICAgICAgICAgICAgICBwdXNoIEB7JHNlbGYtPntfZXh0c3N0X29mZnNldHN9fSwgWyRnbG9iYWxfb2Zmc2V0LCAkbG9jYWxfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAkYnVja2V0X3N0cmluZyA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRzdHJpbmcpOworICAgICAgICAgICAgJHdyaXR0ZW4gKz0gJHN0cmluZ19sZW5ndGg7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKworICAgICAgICAjIERlYWwgd2l0aCB0aGUgY2FzZXMgd2hlcmUgdGhlIG5leHQgc3RyaW5nIHRvIGJlIHdyaXR0ZW4gd2lsbCBleGNlZWQKKyAgICAgICAgIyB0aGUgQ09OVElOVUUgYm91bmRhcnkuIElmIHRoZSBzdHJpbmcgaXMgdmVyeSBsb25nIGl0IG1heSBuZWVkIHRvIGJlCisgICAgICAgICMgd3JpdHRlbiBpbiBtb3JlIHRoYW4gb25lIENPTlRJTlVFIHJlY29yZC4KKyAgICAgICAgIworICAgICAgICB3aGlsZSAoJGJsb2NrX2xlbmd0aCA+PSAkY29udGludWVfbGltaXQpIHsKKworICAgICAgICAgICAgIyBXZSBuZWVkIHRvIGF2b2lkIHRoZSBjYXNlIHdoZXJlIGEgc3RyaW5nIGlzIGNvbnRpbnVlZCBpbiB0aGUgZmlyc3QKKyAgICAgICAgICAgICMgbiBieXRlcyB0aGF0IGNvbnRhaW4gdGhlIHN0cmluZyBoZWFkZXIgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAjCisgICAgICAgICAgICBteSAkaGVhZGVyX2xlbmd0aCAgID0gMzsgIyBNaW4gc3RyaW5nICsgaGVhZGVyIHNpemUgLTEKKyAgICAgICAgICAgIG15ICRzcGFjZV9yZW1haW5pbmcgPSAkY29udGludWVfbGltaXQgLSR3cml0dGVuIC0kY29udGludWU7CisKKworICAgICAgICAgICAgIyBVbmljb2RlIGRhdGEgc2hvdWxkIG9ubHkgYmUgc3BsaXQgb24gY2hhciAoMiBieXRlKSBib3VuZGFyaWVzLgorICAgICAgICAgICAgIyBUaGVyZWZvcmUsIGluIHNvbWUgY2FzZXMgd2UgbmVlZCB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUKKyAgICAgICAgICAgICMgc3BhY2UgYnkgMSBieXRlIHRvIGVuc3VyZSB0aGUgY29ycmVjdCBhbGlnbm1lbnQuCisgICAgICAgICAgICBteSAkYWxpZ24gPSAwOworCisgICAgICAgICAgICAjIE9ubHkgYXBwbGllcyB0byBVbmljb2RlIHN0cmluZ3MKKyAgICAgICAgICAgIGlmICgkZW5jb2RpbmcgPT0gMSkgeworICAgICAgICAgICAgICAgICMgTWluIHN0cmluZyArIGhlYWRlciBzaXplIC0xCisgICAgICAgICAgICAgICAgJGhlYWRlcl9sZW5ndGggPSA0OworCisgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9yZW1haW5pbmcgPiAkaGVhZGVyX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAjIFN0cmluZyBjb250YWlucyAzIGJ5dGUgaGVhZGVyID0+IHNwbGl0IG9uIG9kZCBib3VuZGFyeQorICAgICAgICAgICAgICAgICAgICBpZiAobm90ICRzcGxpdF9zdHJpbmcgYW5kICRzcGFjZV9yZW1haW5pbmcgJSAyICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzcGFjZV9yZW1haW5pbmctLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRhbGlnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIyBTcGxpdCBzZWN0aW9uIHdpdGhvdXQgaGVhZGVyID0+IHNwbGl0IG9uIGV2ZW4gYm91bmRhcnkKKyAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCRzcGxpdF9zdHJpbmcgYW5kICRzcGFjZV9yZW1haW5pbmcgJSAyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzcGFjZV9yZW1haW5pbmctLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRhbGlnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAkc3BsaXRfc3RyaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCRzcGFjZV9yZW1haW5pbmcgPiAkaGVhZGVyX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICMgV3JpdGUgYXMgbXVjaCBhcyBwb3NzaWJsZSBvZiB0aGUgc3RyaW5nIGluIHRoZSBjdXJyZW50IGJsb2NrCisgICAgICAgICAgICAgICAgbXkgJHRtcCA9IHN1YnN0ciAkc3RyaW5nLCAwLCAkc3BhY2VfcmVtYWluaW5nOworCisgICAgICAgICAgICAgICAgIyBTdG9yZSBsb2NhdGlvbiBvZiBFWFRTU1QgYnVja2V0IHN0cmluZy4KKyAgICAgICAgICAgICAgICBpZiAoJGJ1Y2tldF9zdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGdsb2JhbF9vZmZzZXQgICA9ICRzZWxmLT57X2RhdGFzaXplfTsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGxvY2FsX29mZnNldCAgICA9ICRzZWxmLT57X2RhdGFzaXplfSAtICRzc3RfYmxvY2tfc3RhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyRzZWxmLT57X2V4dHNzdF9vZmZzZXRzfX0sIFskZ2xvYmFsX29mZnNldCwgJGxvY2FsX29mZnNldF07CisgICAgICAgICAgICAgICAgICAgICRidWNrZXRfc3RyaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkdG1wKTsKKworCisgICAgICAgICAgICAgICAgIyBUaGUgcmVtYWluZGVyIHdpbGwgYmUgd3JpdHRlbiBpbiB0aGUgbmV4dCBibG9jayhzKQorICAgICAgICAgICAgICAgICRzdHJpbmcgPSBzdWJzdHIgJHN0cmluZywgJHNwYWNlX3JlbWFpbmluZzsKKworICAgICAgICAgICAgICAgICMgUmVkdWNlIHRoZSBjdXJyZW50IGJsb2NrIGxlbmd0aCBieSB0aGUgYW1vdW50IHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAkYmxvY2tfbGVuZ3RoIC09ICRjb250aW51ZV9saW1pdCAtJGNvbnRpbnVlIC0kYWxpZ247CisKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBjdXJyZW50IHN0cmluZyB3YXMgc3BsaXQgdGhlbiB0aGUgbmV4dCBDT05USU5VRSBibG9jaworICAgICAgICAgICAgICAgICMgc2hvdWxkIGhhdmUgdGhlIHN0cmluZyBjb250aW51ZSBmbGFnIChncmJpdCkgc2V0IHVubGVzcyB0aGUKKyAgICAgICAgICAgICAgICAjIHNwbGl0IHN0cmluZyBmaXRzIGV4YWN0bHkgaW50byB0aGUgcmVtYWluaW5nIHNwYWNlLgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICBpZiAoJGJsb2NrX2xlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgJGNvbnRpbnVlID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRjb250aW51ZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgIyBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0YXJ0IHRoZSBzdHJpbmcgaW4gdGhlIGN1cnJlbnQgYmxvY2sKKyAgICAgICAgICAgICAgICAkYmxvY2tfbGVuZ3RoIC09ICRjb250aW51ZV9saW1pdCAtJHNwYWNlX3JlbWFpbmluZyAtJGNvbnRpbnVlOworICAgICAgICAgICAgICAgICRjb250aW51ZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIENPTlRJTlVFIGJsb2NrIGhlYWRlcgorICAgICAgICAgICAgaWYgKEBibG9ja19zaXplcykgeworICAgICAgICAgICAgICAgICRzc3RfYmxvY2tfc3RhcnQ9ICRzZWxmLT57X2RhdGFzaXplfTsgIyBSZXNldCBFWFRTU1Qgb2Zmc2V0LgorCisgICAgICAgICAgICAgICAgJHJlY29yZCAgICAgICAgID0gMHgwMDNDOworICAgICAgICAgICAgICAgICRsZW5ndGggICAgICAgICA9IHNoaWZ0IEBibG9ja19zaXplczsKKworICAgICAgICAgICAgICAgICRoZWFkZXIgICAgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgICAgICAgICAgICAgJGhlYWRlciAgICAgICAgLj0gcGFjaygiQyIsICRlbmNvZGluZykgaWYgJGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgSWYgdGhlIHN0cmluZyAob3Igc3Vic3RyKSBpcyBzbWFsbCBlbm91Z2ggd2UgY2FuIHdyaXRlIGl0IGluIHRoZQorICAgICAgICAgICAgIyBuZXcgQ09OVElOVUUgYmxvY2suIEVsc2UsIGdvIHRocm91Z2ggdGhlIGxvb3AgYWdhaW4gdG8gd3JpdGUgaXQgaW4KKyAgICAgICAgICAgICMgb25lIG9yIG1vcmUgQ09OVElOVUUgYmxvY2tzCisgICAgICAgICAgICAjCisgICAgICAgICAgICBpZiAoJGJsb2NrX2xlbmd0aCA8ICRjb250aW51ZV9saW1pdCkgeworCisgICAgICAgICAgICAgICAgIyBTdG9yZSBsb2NhdGlvbiBvZiBFWFRTU1QgYnVja2V0IHN0cmluZy4KKyAgICAgICAgICAgICAgICBpZiAoJGJ1Y2tldF9zdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGdsb2JhbF9vZmZzZXQgICA9ICRzZWxmLT57X2RhdGFzaXplfTsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGxvY2FsX29mZnNldCAgICA9ICRzZWxmLT57X2RhdGFzaXplfSAtICRzc3RfYmxvY2tfc3RhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyRzZWxmLT57X2V4dHNzdF9vZmZzZXRzfX0sIFskZ2xvYmFsX29mZnNldCwgJGxvY2FsX29mZnNldF07CisKKyAgICAgICAgICAgICAgICAgICAgJGJ1Y2tldF9zdHJpbmcgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkc3RyaW5nKTsKKworICAgICAgICAgICAgICAgICR3cml0dGVuID0gJGJsb2NrX2xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jYWxjdWxhdGVfZXh0c3N0X3NpemUKKyMKKyMgVGhlIG51bWJlciBvZiBidWNrZXRzIHVzZWQgaW4gdGhlIEVYVFNTVCBpcyBiZXR3ZWVuIDAgYW5kIDEyOC4gVGhlIG51bWJlciBvZgorIyBzdHJpbmdzIHBlciBidWNrZXQgKGJ1Y2tldCBzaXplKSBoYXMgYSBtaW5pbXVtIHZhbHVlIG9mIDggYW5kIGEgdGhlb3JldGljYWwKKyMgbWF4aW11bSBvZiAyXjE2LiBGb3IgIm51bWJlciBvZiBzdHJpbmdzIiA8IDEwMjQgdGhlcmUgaXMgYSBjb25zdGFudCBidWNrZXQKKyMgc2l6ZSBvZiA4LiBUaGUgZm9sbG93aW5nIGFsZ29yaXRobSBnZW5lcmF0ZXMgdGhlIHNhbWUgc2l6ZS9idWNrZXQgcmF0aW8KKyMgYXMgRXhjZWwuCisjCitzdWIgX2NhbGN1bGF0ZV9leHRzc3Rfc2l6ZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdW5pcXVlX3N0cmluZ3MgID0gJHNlbGYtPntfc3RyX3VuaXF1ZX07CisKKyAgICBteSAkYnVja2V0X3NpemU7CisgICAgbXkgJGJ1Y2tldHM7CisKKyAgICBpZiAoJHVuaXF1ZV9zdHJpbmdzIDwgMTAyNCkgeworICAgICAgICAkYnVja2V0X3NpemUgPSA4OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGJ1Y2tldF9zaXplID0gMSArIGludCgkdW5pcXVlX3N0cmluZ3MgLyAxMjgpOworICAgIH0KKworICAgICRidWNrZXRzID0gaW50KCgkdW5pcXVlX3N0cmluZ3MgKyAkYnVja2V0X3NpemUgLTEpICAvICRidWNrZXRfc2l6ZSk7CisKKworICAgICRzZWxmLT57X2V4dHNzdF9idWNrZXRzfSAgICAgICAgPSAkYnVja2V0cyA7CisgICAgJHNlbGYtPntfZXh0c3N0X2J1Y2tldF9zaXplfSAgICA9ICRidWNrZXRfc2l6ZTsKKworCisgICAgcmV0dXJuIDYgKyA4ICogJGJ1Y2tldHM7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZXh0c3N0CisjCisjIFdyaXRlIEVYVFNTVCB0YWJsZSB1c2luZyB0aGUgb2Zmc2V0cyBjYWxjdWxhdGVkIGluIF9zdG9yZV9zaGFyZWRfc3RyaW5ncygpLgorIworc3ViIF9zdG9yZV9leHRzc3QgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15IEBvZmZzZXRzICAgICA9IEB7JHNlbGYtPntfZXh0c3N0X29mZnNldHN9fTsKKyAgICBteSAkYnVja2V0X3NpemUgPSAkc2VsZi0+e19leHRzc3RfYnVja2V0X3NpemV9OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMEZGOyAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMiArIDggKiBAb2Zmc2V0czsgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjayAndnYnLCAgICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjayAndicsICAgICRidWNrZXRfc2l6ZSw7CisKKyAgICBmb3IgbXkgJG9mZnNldCAoQG9mZnNldHMpIHsKKyAgICAgICAkZGF0YSAuPSBwYWNrICdWdnYnLCAkb2Zmc2V0LT5bMF0sICRvZmZzZXQtPlsxXSwgMDsKKyAgICB9CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisKKworIworIyBNZXRob2RzIHJlbGF0ZWQgdG8gY29tbWVudHMgYW5kIE1TTyBvYmplY3RzLgorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9hZGRfbXNvX2RyYXdpbmdfZ3JvdXAoKQorIworIyBXcml0ZSB0aGUgTVNPRFJBV0lOR0dST1VQIHJlY29yZCB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoZSBFc2NoZXIgZHJhd2luZworIyBvYmplY3RzIGluIHRoZSBmaWxlIHN1Y2ggYXMgaW1hZ2VzLCBjb21tZW50cyBhbmQgZmlsdGVycy4KKyMKK3N1YiBfYWRkX21zb19kcmF3aW5nX2dyb3VwIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X21zb19zaXplfTsKKworICAgIG15ICRyZWNvcmQgID0gMHgwMEVCOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwMDsgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRkYXRhICAgID0gJHNlbGYtPl9zdG9yZV9tc29fZGdnX2NvbnRhaW5lcigpOworICAgICAgICRkYXRhICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fZGdnKEB7JHNlbGYtPntfbXNvX2NsdXN0ZXJzfX0pOworICAgICAgICRkYXRhICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fYnN0b3JlX2NvbnRhaW5lcigpOworICAgICAgICRkYXRhICAgLj0gJHNlbGYtPl9zdG9yZV9tc29faW1hZ2VzKEAkXykgZm9yIEB7JHNlbGYtPntfaW1hZ2VzX2RhdGF9fTsKKyAgICAgICAkZGF0YSAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdCgpOworICAgICAgICRkYXRhICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BsaXRfbWVudV9jb2xvcnMoKTsKKworICAgICAgICRsZW5ndGggID0gbGVuZ3RoICRkYXRhOworICAgIG15ICRoZWFkZXIgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYWRkX21zb19kcmF3aW5nX2dyb3VwX2NvbnRpbnVlKCRoZWFkZXIgLiAkZGF0YSk7CisKKyAgICByZXR1cm4gJGhlYWRlciAuICRkYXRhOyAjIEZvciB0ZXN0aW5nIG9ubHkuCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfYWRkX21zb19kcmF3aW5nX2dyb3VwX2NvbnRpbnVlKCkKKyMKKyMgU2VlIGZpcnN0IHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlcjo6X2FkZF9jb250aW51ZSgpIG1ldGhvZC4KKyMKKyMgQWRkIHNwZWNpYWxpc2VkIENPTlRJTlVFIGhlYWRlcnMgdG8gbGFyZ2UgTVNPRFJBV0lOR0dST1VQIGRhdGEgYmxvY2suCisjIFdlIHVzZSB0aGUgRXhjZWwgOTcgbWF4IGJsb2NrIHNpemUgb2YgODIyOCAtIDQgYnl0ZXMgZm9yIHRoZSBoZWFkZXIgPSA4MjI0LgorIworIyBUaGUgc3RydWN0dXJlIGRlcGVuZHMgb24gdGhlIHNpemUgb2YgdGhlIGRhdGEgYmxvY2s6CisjCisjICAgICBDYXNlIDE6ICA8PSAgIDgyMjQgYnl0ZXMgICAgICAxIE1TT0RSQVdJTkdHUk9VUAorIyAgICAgQ2FzZSAyOiAgPD0gMio4MjI0IGJ5dGVzICAgICAgMSBNU09EUkFXSU5HR1JPVVAgKyAxIENPTlRJTlVFCisjICAgICBDYXNlIDM6ICA+ICAyKjgyMjQgYnl0ZXMgICAgICAyIE1TT0RSQVdJTkdHUk9VUCArIG4gQ09OVElOVUUKKyMKK3N1YiBfYWRkX21zb19kcmF3aW5nX2dyb3VwX2NvbnRpbnVlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJGRhdGEgICAgICAgID0gJF9bMF07CisgICAgbXkgJGxpbWl0ICAgICAgID0gODIyOCAtNDsKKyAgICBteSAkbXNvX2dyb3VwICAgPSAweDAwRUI7ICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkY29udGludWUgICAgPSAweDAwM0M7ICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkYmxvY2tfY291bnQgPSAxOworICAgIG15ICRoZWFkZXI7CisgICAgbXkgJHRtcDsKKworICAgICMgSWdub3JlIHRoZSBiYXNlIGNsYXNzIF9hZGRfY29udGludWUoKSBtZXRob2QuCisgICAgJHNlbGYtPntfaWdub3JlX2NvbnRpbnVlfSA9IDE7CisKKyAgICAjIENhc2UgMSBhYm92ZS4gSnVzdCByZXR1cm4gdGhlIGRhdGEgYXMgaXQgaXMuCisgICAgaWYgKGxlbmd0aCAkZGF0YSA8PSAkbGltaXQpIHsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGRhdGEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgIyBDaGFuZ2UgbGVuZ3RoIGZpZWxkIG9mIHRoZSBmaXJzdCBNU09EUkFXSU5HR1JPVVAgYmxvY2suIENhc2UgMiBhbmQgMy4KKyAgICAkdG1wID0gc3Vic3RyKCRkYXRhLCAwLCAkbGltaXQgKzQsICIiKTsKKyAgICBzdWJzdHIoJHRtcCwgMiwgMiwgcGFjaygidiIsICRsaW1pdCkpOworICAgICRzZWxmLT5fYXBwZW5kKCR0bXApOworCisKKyAgICAjIEFkZCBNU09EUkFXSU5HR1JPVVAgYW5kIENPTlRJTlVFIGJsb2NrcyBmb3IgQ2FzZSAzIGFib3ZlLgorICAgIHdoaWxlIChsZW5ndGgoJGRhdGEpID4gJGxpbWl0KSB7CisgICAgICAgIGlmICgkYmxvY2tfY291bnQgPT0gMSkgeworICAgICAgICAgICAgIyBBZGQgZXh0cmEgTVNPRFJBV0lOR0dST1VQIGJsb2NrIGhlYWRlci4KKyAgICAgICAgICAgICRoZWFkZXIgPSBwYWNrKCJ2diIsICRtc29fZ3JvdXAsICRsaW1pdCk7CisgICAgICAgICAgICAkYmxvY2tfY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgQWRkIG5vcm1hbCBDT05USU5VRSBoZWFkZXIuCisgICAgICAgICAgICAkaGVhZGVyID0gcGFjaygidnYiLCAkY29udGludWUsICRsaW1pdCk7CisgICAgICAgIH0KKworICAgICAgICAkdG1wID0gc3Vic3RyKCRkYXRhLCAwLCAkbGltaXQsICIiKTsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJHRtcCk7CisgICAgfQorCisKKyAgICAjIExhc3QgQ09OVElOVUUgYmxvY2sgZm9yIHJlbWFpbmluZyBkYXRhLiBDYXNlIDIgYW5kIDMgYWJvdmUuCisgICAgJGhlYWRlciA9IHBhY2soInZ2IiwgJGNvbnRpbnVlLCBsZW5ndGgoJGRhdGEpKTsKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKworICAgICMgVHVybiB0aGUgYmFzZSBjbGFzcyBfYWRkX2NvbnRpbnVlKCkgbWV0aG9kIGJhY2sgb24uCisgICAgJHNlbGYtPntfaWdub3JlX2NvbnRpbnVlfSA9IDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX2RnZ19jb250YWluZXIoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIERnZ0NvbnRhaW5lciByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkdHUk9VUC4KKyMKK3N1YiBfc3RvcmVfbXNvX2RnZ19jb250YWluZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDA7CisgICAgbXkgJHZlcnNpb24gICAgID0gMTU7CisgICAgbXkgJGluc3RhbmNlICAgID0gMDsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAkc2VsZi0+e19tc29fc2l6ZX0gLTEyOyAjIC00IChiaWZmIGhlYWRlcikgLTggKGZvciB0aGlzKS4KKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX2RnZygpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgRGdnIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lOR0dST1VQLgorIworc3ViIF9zdG9yZV9tc29fZGdnIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICAgICAgPSAweEYwMDY7CisgICAgbXkgJHZlcnNpb24gICAgICAgICA9IDA7CisgICAgbXkgJGluc3RhbmNlICAgICAgICA9IDA7CisgICAgbXkgJGRhdGEgICAgICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICAgICAgPSB1bmRlZjsgIyBDYWxjdWxhdGUgYXV0b21hdGljYWxseS4KKworICAgIG15ICRtYXhfc3BpZCAgICAgICAgPSAkX1swXTsKKyAgICBteSAkbnVtX2NsdXN0ZXJzICAgID0gJF9bMV07CisgICAgbXkgJHNoYXBlc19zYXZlZCAgICA9ICRfWzJdOworICAgIG15ICRkcmF3aW5nc19zYXZlZCAgPSAkX1szXTsKKyAgICBteSAkY2x1c3RlcnMgICAgICAgID0gJF9bNF07CisKKyAgICAkZGF0YSAgICAgICAgICAgICAgID0gcGFjayAiVlZWViIsICAkbWF4X3NwaWQsICAgICAkbnVtX2NsdXN0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaGFwZXNfc2F2ZWQsICRkcmF3aW5nc19zYXZlZDsKKworICAgIGZvciBteSAkYXJlZiAoQCRjbHVzdGVycykgeworICAgICAgICBteSAkZHJhd2luZ19pZCAgICAgID0gJGFyZWYtPlswXTsKKyAgICAgICAgbXkgJHNoYXBlX2lkc191c2VkICA9ICRhcmVmLT5bMV07CisKKyAgICAgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgIlZWIiwgICRkcmF3aW5nX2lkLCAkc2hhcGVfaWRzX3VzZWQ7CisgICAgfQorCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fYnN0b3JlX2NvbnRhaW5lcigpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgQnN0b3JlQ29udGFpbmVyIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lOR0dST1VQLgorIworc3ViIF9zdG9yZV9tc29fYnN0b3JlX2NvbnRhaW5lciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIHJldHVybiAnJyB1bmxlc3MgJHNlbGYtPntfaW1hZ2VzX3NpemV9OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDAxOworICAgIG15ICR2ZXJzaW9uICAgICA9IDE1OworICAgIG15ICRpbnN0YW5jZSAgICA9IEB7JHNlbGYtPntfaW1hZ2VzX2RhdGF9fTsgIyBOdW1iZXIgb2YgaW1hZ2VzLgorICAgIG15ICRkYXRhICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICA9ICRzZWxmLT57X2ltYWdlc19zaXplfSArOCAqJGluc3RhbmNlOworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29faW1hZ2VzKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBCc3RvcmVDb250YWluZXIgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HR1JPVVAuCisjCitzdWIgX3N0b3JlX21zb19pbWFnZXMgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVmX2NvdW50ICAgPSAkX1swXTsKKyAgICBteSAkaW1hZ2VfdHlwZSAgPSAkX1sxXTsKKyAgICBteSAkaW1hZ2UgICAgICAgPSAkX1syXTsKKyAgICBteSAkc2l6ZSAgICAgICAgPSAkX1szXTsKKyAgICBteSAkY2hlY2tzdW0xICAgPSAkX1s0XTsKKyAgICBteSAkY2hlY2tzdW0yICAgPSAkX1s1XTsKKworICAgIG15ICRibGlwX3N0b3JlX2VudHJ5ID0gICRzZWxmLT5fc3RvcmVfbXNvX2JsaXBfc3RvcmVfZW50cnkoJHJlZl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hlY2tzdW0xKTsKKworICAgIG15ICRibGlwICAgICAgICAgICAgID0gICRzZWxmLT5fc3RvcmVfbXNvX2JsaXAoJGltYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGVja3N1bTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hlY2tzdW0yKTsKKworICAgIHJldHVybiAkYmxpcF9zdG9yZV9lbnRyeSAuICRibGlwOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX2JsaXBfc3RvcmVfZW50cnkoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIEJsaXBTdG9yZUVudHJ5IHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lOR0dST1VQLgorIworc3ViIF9zdG9yZV9tc29fYmxpcF9zdG9yZV9lbnRyeSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWZfY291bnQgICA9ICRfWzBdOworICAgIG15ICRpbWFnZV90eXBlICA9ICRfWzFdOworICAgIG15ICRzaXplICAgICAgICA9ICRfWzJdOworICAgIG15ICRjaGVja3N1bTEgICA9ICRfWzNdOworCisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDc7CisgICAgbXkgJHZlcnNpb24gICAgID0gMjsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAkaW1hZ2VfdHlwZTsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAkc2l6ZSArNjE7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygnQycsICAkaW1hZ2VfdHlwZSkgICAjIFdpbjMyCisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnQycsICAkaW1hZ2VfdHlwZSkgICAjIE1hYworICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ0gqJywgJGNoZWNrc3VtMSkgICAgIyBVaWQgY2hlY2tzdW0KKyAgICAgICAgICAgICAgICAgICAgLiBwYWNrKCd2JywgIDB4RkYpICAgICAgICAgICMgVGFnCisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnVicsICAkc2l6ZSArMjUpICAgICAjIE5leHQgQmxpcCBzaXplCisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnVicsICAkcmVmX2NvdW50KSAgICAjIEltYWdlIHJlZiBjb3VudAorICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ1YnLCAgMHgwMDAwMDAwMCkgICAgIyBGaWxlIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ0MnLCAgMHgwMCkgICAgICAgICAgIyBVc2FnZQorICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ0MnLCAgMHgwMCkgICAgICAgICAgIyBOYW1lIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ0MnLCAgMHgwMCkgICAgICAgICAgIyBVbnVzZWQKKyAgICAgICAgICAgICAgICAgICAgLiBwYWNrKCdDJywgIDB4MDApICAgICAgICAgICMgVW51c2VkCisgICAgICAgICAgICAgICAgICAgIDsKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19ibGlwKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBCbGlwIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lOR0dST1VQLgorIworc3ViIF9zdG9yZV9tc29fYmxpcCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRpbWFnZV90eXBlICA9ICRfWzBdOworICAgIG15ICRpbWFnZV9kYXRhICA9ICRfWzFdOworICAgIG15ICRzaXplICAgICAgICA9ICRfWzJdOworICAgIG15ICRjaGVja3N1bTEgICA9ICRfWzNdOworICAgIG15ICRjaGVja3N1bTIgICA9ICRfWzRdOworICAgIG15ICRpbnN0YW5jZTsKKworICAgICRpbnN0YW5jZSA9IDB4MDQ2QSBpZiAkaW1hZ2VfdHlwZSA9PSA1OyAjIEpQRworICAgICRpbnN0YW5jZSA9IDB4MDZFMCBpZiAkaW1hZ2VfdHlwZSA9PSA2OyAjIFBORworICAgICRpbnN0YW5jZSA9IDB4MDdBOSBpZiAkaW1hZ2VfdHlwZSA9PSA3OyAjIEJNUAorCisgICAgIyBCTVBzIGNvbnRhaW4gYW4gZXh0cmEgY2hlY2tzdW0gZm9yIHRoZSBzdHJpcHBlZCBkYXRhLgorICAgIGlmICggJGltYWdlX3R5cGUgPT0gNykgeworICAgICAgICAkY2hlY2tzdW0xID0gJGNoZWNrc3VtMiAuICRjaGVja3N1bTE7CisgICAgfQorCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDE4ICsgJGltYWdlX3R5cGU7CisgICAgbXkgJHZlcnNpb24gICAgID0gMHgwMDAwOworICAgIG15ICRsZW5ndGggICAgICA9ICRzaXplICsxNzsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCdIKicsICRjaGVja3N1bTEpICMgVWlkIGNoZWNrc3VtCisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnQycsICAweEZGKSAgICAgICAjIFRhZworICAgICAgICAgICAgICAgICAgICAuICRpbWFnZV9kYXRhICAgICAgICAgICAgIyBJbWFnZQorICAgICAgICAgICAgICAgICAgICA7CisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19vcHQoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIE9wdCByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkdHUk9VUC4KKyMKK3N1YiBfc3RvcmVfbXNvX29wdCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwQjsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAzOworICAgIG15ICRpbnN0YW5jZSAgICA9IDM7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gMTg7CisKKyAgICAkZGF0YSAgICAgICAgICAgPSBwYWNrICJIKiIsICdCRjAwMDgwMDA4MDA4MTAxMDkwMDAwMDhDMDAxNDAwMCcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzAwMDgnOworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fc3BsaXRfbWVudV9jb2xvcnMoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIFNwbGl0TWVudUNvbG9ycyByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkdHUk9VUC4KKyMKK3N1YiBfc3RvcmVfbXNvX3NwbGl0X21lbnVfY29sb3JzIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMTFFOworICAgIG15ICR2ZXJzaW9uICAgICA9IDA7CisgICAgbXkgJGluc3RhbmNlICAgID0gNDsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAxNjsKKworICAgICRkYXRhICAgICAgICAgICA9IHBhY2sgIkgqIiwgJzBEMDAwMDA4MEMwMDAwMDgxNzAwMDAwOEY3MDAwMDEwJzsKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK1dvcmtib29rIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIFdvcmtib29rcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK6kgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1dvcmtzaGVldC5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvV29ya3NoZWV0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTQyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1dvcmtzaGVldC5wbQpAQCAtMCwwICsxLDc2MzQgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBXb3Jrc2hlZXQgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgV29ya3NoZWV0cy4KKyMKKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIEV4cG9ydGVyOwordXNlIHN0cmljdDsKK3VzZSBDYXJwOwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpCSUZGd3JpdGVyOwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQ7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm11bGE7CisKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjIENvbnN0cnVjdG9yLiBDcmVhdGVzIGEgbmV3IFdvcmtzaGVldCBvYmplY3QgZnJvbSBhIEJJRkZ3cml0ZXIgb2JqZWN0CisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyAgICAgICAgICAgICAgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICAgICAgICAgICAgICAgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlci0+bmV3KCk7CisgICAgbXkgJHJvd21heCAgICAgICAgICAgICAgICAgICAgPSA2NTUzNjsKKyAgICBteSAkY29sbWF4ICAgICAgICAgICAgICAgICAgICA9IDI1NjsKKyAgICBteSAkc3RybWF4ICAgICAgICAgICAgICAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19uYW1lfSAgICAgICAgICAgICAgICA9ICRfWzBdOworICAgICRzZWxmLT57X2luZGV4fSAgICAgICAgICAgICAgID0gJF9bMV07CisgICAgJHNlbGYtPntfZW5jb2Rpbmd9ICAgICAgICAgICAgPSAkX1syXTsKKyAgICAkc2VsZi0+e19hY3RpdmVzaGVldH0gICAgICAgICA9ICRfWzNdOworICAgICRzZWxmLT57X2ZpcnN0c2hlZXR9ICAgICAgICAgID0gJF9bNF07CisgICAgJHNlbGYtPntfdXJsX2Zvcm1hdH0gICAgICAgICAgPSAkX1s1XTsKKyAgICAkc2VsZi0+e19wYXJzZXJ9ICAgICAgICAgICAgICA9ICRfWzZdOworICAgICRzZWxmLT57X3RlbXBkaXJ9ICAgICAgICAgICAgID0gJF9bN107CisKKyAgICAkc2VsZi0+e19zdHJfdG90YWx9ICAgICAgICAgICA9ICRfWzhdOworICAgICRzZWxmLT57X3N0cl91bmlxdWV9ICAgICAgICAgID0gJF9bOV07CisgICAgJHNlbGYtPntfc3RyX3RhYmxlfSAgICAgICAgICAgPSAkX1sxMF07CisgICAgJHNlbGYtPntfMTkwNH0gICAgICAgICAgICAgICAgPSAkX1sxMV07CisgICAgJHNlbGYtPntfY29tcGF0aWJpbGl0eX0gICAgICAgPSAkX1sxMl07CisgICAgJHNlbGYtPntfcGFsZXR0ZX0gICAgICAgICAgICAgPSAkX1sxM107CisKKyAgICAkc2VsZi0+e19zaGVldF90eXBlfSAgICAgICAgICA9IDB4MDAwMDsKKyAgICAkc2VsZi0+e19leHRfc2hlZXRzfSAgICAgICAgICA9IFtdOworICAgICRzZWxmLT57X3VzaW5nX3RtcGZpbGV9ICAgICAgID0gMTsKKyAgICAkc2VsZi0+e19maWxlaGFuZGxlfSAgICAgICAgICA9ICIiOworICAgICRzZWxmLT57X2ZpbGVjbG9zZWR9ICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19vZmZzZXR9ICAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfeGxzX3Jvd21heH0gICAgICAgICAgPSAkcm93bWF4OworICAgICRzZWxmLT57X3hsc19jb2xtYXh9ICAgICAgICAgID0gJGNvbG1heDsKKyAgICAkc2VsZi0+e194bHNfc3RybWF4fSAgICAgICAgICA9ICRzdHJtYXg7CisgICAgJHNlbGYtPntfZGltX3Jvd21pbn0gICAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e19kaW1fcm93bWF4fSAgICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57X2RpbV9jb2xtaW59ICAgICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntfZGltX2NvbG1heH0gICAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e19jb2xpbmZvfSAgICAgICAgICAgICA9IFtdOworICAgICRzZWxmLT57X3NlbGVjdGlvbn0gICAgICAgICAgID0gWzAsIDBdOworICAgICRzZWxmLT57X3BhbmVzfSAgICAgICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfYWN0aXZlX3BhbmV9ICAgICAgICAgPSAzOworICAgICRzZWxmLT57X2Zyb3plbn0gICAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19mcm96ZW5fbm9fc3BsaXR9ICAgICA9IDE7CisgICAgJHNlbGYtPntfc2VsZWN0ZWR9ICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2hpZGRlbn0gICAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19hY3RpdmV9ICAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfdGFiX2NvbG9yfSAgICAgICAgICAgPSAwOworCisgICAgJHNlbGYtPntfZmlyc3Rfcm93fSAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2ZpcnN0X2NvbH0gICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19kaXNwbGF5X2Zvcm11bGFzfSAgICA9IDA7CisgICAgJHNlbGYtPntfZGlzcGxheV9oZWFkZXJzfSAgICAgPSAxOworICAgICRzZWxmLT57X2Rpc3BsYXlfemVyb3N9ICAgICAgID0gMTsKKyAgICAkc2VsZi0+e19kaXNwbGF5X2FyYWJpY30gICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19wYXBlcl9zaXplfSAgICAgICAgICA9IDB4MDsKKyAgICAkc2VsZi0+e19vcmllbnRhdGlvbn0gICAgICAgICA9IDB4MTsKKyAgICAkc2VsZi0+e19oZWFkZXJ9ICAgICAgICAgICAgICA9ICcnOworICAgICRzZWxmLT57X2Zvb3Rlcn0gICAgICAgICAgICAgID0gJyc7CisgICAgJHNlbGYtPntfaGVhZGVyX2VuY29kaW5nfSAgICAgPSAwOworICAgICRzZWxmLT57X2Zvb3Rlcl9lbmNvZGluZ30gICAgID0gMDsKKyAgICAkc2VsZi0+e19oY2VudGVyfSAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfdmNlbnRlcn0gICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X21hcmdpbl9oZWFkZXJ9ICAgICAgID0gMC41MDsKKyAgICAkc2VsZi0+e19tYXJnaW5fZm9vdGVyfSAgICAgICA9IDAuNTA7CisgICAgJHNlbGYtPntfbWFyZ2luX2xlZnR9ICAgICAgICAgPSAwLjc1OworICAgICRzZWxmLT57X21hcmdpbl9yaWdodH0gICAgICAgID0gMC43NTsKKyAgICAkc2VsZi0+e19tYXJnaW5fdG9wfSAgICAgICAgICA9IDEuMDA7CisgICAgJHNlbGYtPntfbWFyZ2luX2JvdHRvbX0gICAgICAgPSAxLjAwOworCisgICAgJHNlbGYtPntfdGl0bGVfcm93bWlufSAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e190aXRsZV9yb3dtYXh9ICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57X3RpdGxlX2NvbG1pbn0gICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntfdGl0bGVfY29sbWF4fSAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e19wcmludF9yb3dtaW59ICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57X3ByaW50X3Jvd21heH0gICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntfcHJpbnRfY29sbWlufSAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e19wcmludF9jb2xtYXh9ICAgICAgICA9IHVuZGVmOworCisgICAgJHNlbGYtPntfcHJpbnRfZ3JpZGxpbmVzfSAgICAgPSAxOworICAgICRzZWxmLT57X3NjcmVlbl9ncmlkbGluZXN9ICAgID0gMTsKKyAgICAkc2VsZi0+e19wcmludF9oZWFkZXJzfSAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19wYWdlX29yZGVyfSAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfYmxhY2tfd2hpdGV9ICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2RyYWZ0X3F1YWxpdHl9ICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19wcmludF9jb21tZW50c30gICAgICA9IDA7CisgICAgJHNlbGYtPntfcGFnZV9zdGFydH0gICAgICAgICAgPSAxOworICAgICRzZWxmLT57X2N1c3RvbV9zdGFydH0gICAgICAgID0gMDsKKworICAgICRzZWxmLT57X2ZpdF9wYWdlfSAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19maXRfd2lkdGh9ICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfZml0X2hlaWdodH0gICAgICAgICAgPSAwOworCisgICAgJHNlbGYtPntfaGJyZWFrc30gICAgICAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e192YnJlYWtzfSAgICAgICAgICAgICA9IFtdOworCisgICAgJHNlbGYtPntfcHJvdGVjdH0gICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X3Bhc3N3b3JkfSAgICAgICAgICAgID0gdW5kZWY7CisKKyAgICAkc2VsZi0+e19jb2xfc2l6ZXN9ICAgICAgICAgICA9IHt9OworICAgICRzZWxmLT57X3Jvd19zaXplc30gICAgICAgICAgID0ge307CisKKyAgICAkc2VsZi0+e19jb2xfZm9ybWF0c30gICAgICAgICA9IHt9OworICAgICRzZWxmLT57X3Jvd19mb3JtYXRzfSAgICAgICAgID0ge307CisKKyAgICAkc2VsZi0+e196b29tfSAgICAgICAgICAgICAgICA9IDEwMDsKKyAgICAkc2VsZi0+e19wcmludF9zY2FsZX0gICAgICAgICA9IDEwMDsKKyAgICAkc2VsZi0+e19wYWdlX3ZpZXd9ICAgICAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19sZWFkaW5nX3plcm9zfSAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19vdXRsaW5lX3Jvd19sZXZlbH0gICA9IDA7CisgICAgJHNlbGYtPntfb3V0bGluZV9zdHlsZX0gICAgICAgPSAwOworICAgICRzZWxmLT57X291dGxpbmVfYmVsb3d9ICAgICAgID0gMTsKKyAgICAkc2VsZi0+e19vdXRsaW5lX3JpZ2h0fSAgICAgICA9IDE7CisgICAgJHNlbGYtPntfb3V0bGluZV9vbn0gICAgICAgICAgPSAxOworCisgICAgJHNlbGYtPntfd3JpdGVfbWF0Y2h9ICAgICAgICAgPSBbXTsKKworICAgICRzZWxmLT57X29iamVjdF9pZHN9ICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfaW1hZ2VzfSAgICAgICAgICAgICAgPSB7fTsKKyAgICAkc2VsZi0+e19pbWFnZXNfYXJyYXl9ICAgICAgICA9IFtdOworICAgICRzZWxmLT57X2NoYXJ0c30gICAgICAgICAgICAgID0ge307CisgICAgJHNlbGYtPntfY2hhcnRzX2FycmF5fSAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19jb21tZW50c30gICAgICAgICAgICA9IHt9OworICAgICRzZWxmLT57X2NvbW1lbnRzX2FycmF5fSAgICAgID0gW107CisgICAgJHNlbGYtPntfY29tbWVudHNfYXV0aG9yfSAgICAgPSAnJzsKKyAgICAkc2VsZi0+e19jb21tZW50c19hdXRob3JfZW5jfSA9IDA7CisgICAgJHNlbGYtPntfY29tbWVudHNfdmlzaWJsZX0gICAgPSAwOworCisgICAgJHNlbGYtPntfZmlsdGVyX2FyZWF9ICAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19maWx0ZXJfY291bnR9ICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfZmlsdGVyX29ufSAgICAgICAgICAgPSAwOworCisgICAgJHNlbGYtPntfd3JpdGluZ191cmx9ICAgICAgICAgPSAwOworCisgICAgJHNlbGYtPntfZGJfaW5kaWNlc30gICAgICAgICAgPSBbXTsKKworICAgICRzZWxmLT57X3ZhbGlkYXRpb25zfSAgICAgICAgID0gW107CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgICRzZWxmLT5faW5pdGlhbGl6ZSgpOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9pbml0aWFsaXplKCkKKyMKKyMgT3BlbiBhIHRtcCBmaWxlIHRvIHN0b3JlIHRoZSBtYWpvcml0eSBvZiB0aGUgV29ya3NoZWV0IGRhdGEuIElmIHRoaXMgZmFpbHMsCisjIGZvciBleGFtcGxlIGR1ZSB0byB3cml0ZSBwZXJtaXNzaW9ucywgc3RvcmUgdGhlIGRhdGEgaW4gbWVtb3J5LiBUaGlzIGNhbiBiZQorIyBzbG93IGZvciBsYXJnZSBmaWxlcy4KKyMKK3N1YiBfaW5pdGlhbGl6ZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRmaDsKKyAgICBteSAkdG1wX2RpcjsKKworICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIGNvbXBsaWNhdGVkIGJ5IFdpbmRvd3MgbGltaXRhdGlvbnMuIFBvcnRlcnMgY2FuCisgICAgIyBjaG9vc2UgYSBtb3JlIGRpcmVjdCBtZXRob2QuCisKKworCisgICAgIyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHVzZSBJTzo6RmlsZS0+bmV3X3RtcGZpbGUoKS4gVGhpcyBtYXkgZmFpbCwgaW4KKyAgICAjIHBhcnRpY3VsYXIgd2l0aCBJSVMgb24gV2luZG93cywgc28gd2UgYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIHRlbXAKKyAgICAjIGRpcmVjdG9yeSB2aWEgRmlsZTo6VGVtcC4KKyAgICAjCisgICAgaWYgKGRlZmluZWQgJHNlbGYtPntfdGVtcGRpcn0pIHsKKworICAgICAgICAjIERlbGF5IGxvYWRpbmcgRmlsZTpUZW1wIHRvIHJlZHVjZSB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcy4KKyAgICAgICAgZXZhbCB7IHJlcXVpcmUgRmlsZTo6VGVtcCB9OworICAgICAgICBkaWUgIlRoZSBGaWxlOjpUZW1wIG1vZHVsZSBtdXN0IGJlIGluc3RhbGxlZCBpbiBvcmRlciAiLgorICAgICAgICAgICAgInRvIGNhbGwgc2V0X3RlbXBkaXIoKS5cbiIgaWYgJEA7CisKKworICAgICAgICAjIFRyYXAgYnV0IGlnbm9yZSBGaWxlOjpUZW1wIGVycm9ycy4KKyAgICAgICAgZXZhbCB7ICRmaCA9IEZpbGU6OlRlbXA6OnRlbXBmaWxlKERJUiA9PiAkc2VsZi0+e190ZW1wZGlyfSkgfTsKKworICAgICAgICAjIFN0b3JlIHRoZSBmYWlsZWQgdG1wIGRpciBpbiBjYXNlIG9mIGVycm9ycy4KKyAgICAgICAgJHRtcF9kaXIgPSAkc2VsZi0+e190ZW1wZGlyfSB8fCBGaWxlOjpTcGVjLT50bXBkaXIgaWYgbm90ICRmaDsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgJGZoID0gSU86OkZpbGUtPm5ld190bXBmaWxlKCk7CisKKyAgICAgICAgIyBTdG9yZSB0aGUgZmFpbGVkIHRtcCBkaXIgaW4gY2FzZSBvZiBlcnJvcnMuCisgICAgICAgICR0bXBfZGlyID0gIlBPU0lYOjp0bXBuYW0oKSBkaXJlY3RvcnkiIGlmIG5vdCAkZmg7CisgICAgfQorCisKKyAgICAjIENoZWNrIGlmIHRoZSB0ZW1wIGZpbGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwuIEVsc2Ugc3RvcmUgZGF0YSBpbiBtZW1vcnkuCisgICAgaWYgKCRmaCkgeworCisgICAgICAgICMgYmlubW9kZSBmaWxlIHdoZXRoZXIgcGxhdGZvcm0gcmVxdWlyZXMgaXQgb3Igbm90LgorICAgICAgICBiaW5tb2RlKCRmaCk7CisKKyAgICAgICAgIyBTdG9yZSBmaWxlaGFuZGxlCisgICAgICAgICRzZWxmLT57X2ZpbGVoYW5kbGV9ID0gJGZoOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAjIFNldCBmbGFnIHRvIHN0b3JlIGRhdGEgaW4gbWVtb3J5IGlmIFhYOjp0ZW1wZmlsZSgpIGZhaWxlZC4KKyAgICAgICAgJHNlbGYtPntfdXNpbmdfdG1wZmlsZX0gPSAwOworCisgICAgICAgIGlmICgkc2VsZi0+e19pbmRleH0gPT0gMCAmJiAkXlcpIHsKKyAgICAgICAgICAgIG15ICRkaXIgPSAkc2VsZi0+e190ZW1wZGlyfSB8fCBGaWxlOjpTcGVjLT50bXBkaXIoKTsKKworICAgICAgICAgICAgd2FybiAiVW5hYmxlIHRvIGNyZWF0ZSB0ZW1wIGZpbGVzIGluICR0bXBfZGlyLiBEYXRhIHdpbGwgYmUgIi4KKyAgICAgICAgICAgICAgICAgInN0b3JlZCBpbiBtZW1vcnkuIFJlZmVyIHRvIHNldF90ZW1wZGlyKCkgaW4gdGhlICIuCisgICAgICAgICAgICAgICAgICJTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uLlxuIiA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2xvc2UoKQorIworIyBBZGQgZGF0YSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3b3JrYm9vayAobm90ZSB0aGUgcmV2ZXJzZSBvcmRlcikKKyMgYW5kIHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtib29rLgorIworc3ViIF9jbG9zZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyBQcmVwZW5kIGluIHJldmVyc2Ugb3JkZXIhIQorICAgICMKKworICAgICMgUHJlcGVuZCB0aGUgc2hlZXQgZGltZW5zaW9ucworICAgICRzZWxmLT5fc3RvcmVfZGltZW5zaW9ucygpOworCisgICAgIyBQcmVwZW5kIHRoZSBhdXRvZmlsdGVyIGZpbHRlcnMuCisgICAgJHNlbGYtPl9zdG9yZV9hdXRvZmlsdGVyczsKKworICAgICMgUHJlcGVuZCB0aGUgc2hlZXQgYXV0b2ZpbHRlciBpbmZvLgorICAgICRzZWxmLT5fc3RvcmVfYXV0b2ZpbHRlcmluZm8oKTsKKworICAgICMgUHJlcGVuZCB0aGUgc2hlZXQgZmlsdGVybW9kZSByZWNvcmQuCisgICAgJHNlbGYtPl9zdG9yZV9maWx0ZXJtb2RlKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIENPTElORk8gcmVjb3JkcyBpZiB0aGV5IGV4aXN0CisgICAgaWYgKEB7JHNlbGYtPntfY29saW5mb319KXsKKyAgICAgICAgbXkgQGNvbGluZm8gPSBAeyRzZWxmLT57X2NvbGluZm99fTsKKyAgICAgICAgd2hpbGUgKEBjb2xpbmZvKSB7CisgICAgICAgICAgICBteSAkYXJyYXlyZWYgPSBwb3AgQGNvbGluZm87CisgICAgICAgICAgICAkc2VsZi0+X3N0b3JlX2NvbGluZm8oQCRhcnJheXJlZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFByZXBlbmQgdGhlIERFRkNPTFdJRFRIIHJlY29yZAorICAgICRzZWxmLT5fc3RvcmVfZGVmY29sKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHNoZWV0IHBhc3N3b3JkCisgICAgJHNlbGYtPl9zdG9yZV9wYXNzd29yZCgpOworCisgICAgIyBQcmVwZW5kIHRoZSBzaGVldCBwcm90ZWN0aW9uCisgICAgJHNlbGYtPl9zdG9yZV9wcm90ZWN0KCk7CisgICAgJHNlbGYtPl9zdG9yZV9vYmpfcHJvdGVjdCgpOworCisgICAgIyBQcmVwZW5kIHRoZSBwYWdlIHNldHVwCisgICAgJHNlbGYtPl9zdG9yZV9zZXR1cCgpOworCisgICAgIyBQcmVwZW5kIHRoZSBib3R0b20gbWFyZ2luCisgICAgJHNlbGYtPl9zdG9yZV9tYXJnaW5fYm90dG9tKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHRvcCBtYXJnaW4KKyAgICAkc2VsZi0+X3N0b3JlX21hcmdpbl90b3AoKTsKKworICAgICMgUHJlcGVuZCB0aGUgcmlnaHQgbWFyZ2luCisgICAgJHNlbGYtPl9zdG9yZV9tYXJnaW5fcmlnaHQoKTsKKworICAgICMgUHJlcGVuZCB0aGUgbGVmdCBtYXJnaW4KKyAgICAkc2VsZi0+X3N0b3JlX21hcmdpbl9sZWZ0KCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHBhZ2UgdmVydGljYWwgY2VudGVyaW5nCisgICAgJHNlbGYtPl9zdG9yZV92Y2VudGVyKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHBhZ2UgaG9yaXpvbnRhbCBjZW50ZXJpbmcKKyAgICAkc2VsZi0+X3N0b3JlX2hjZW50ZXIoKTsKKworICAgICMgUHJlcGVuZCB0aGUgcGFnZSBmb290ZXIKKyAgICAkc2VsZi0+X3N0b3JlX2Zvb3RlcigpOworCisgICAgIyBQcmVwZW5kIHRoZSBwYWdlIGhlYWRlcgorICAgICRzZWxmLT5fc3RvcmVfaGVhZGVyKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHZlcnRpY2FsIHBhZ2UgYnJlYWtzCisgICAgJHNlbGYtPl9zdG9yZV92YnJlYWsoKTsKKworICAgICMgUHJlcGVuZCB0aGUgaG9yaXpvbnRhbCBwYWdlIGJyZWFrcworICAgICRzZWxmLT5fc3RvcmVfaGJyZWFrKCk7CisKKyAgICAjIFByZXBlbmQgV1NCT09MCisgICAgJHNlbGYtPl9zdG9yZV93c2Jvb2woKTsKKworICAgICMgUHJlcGVuZCB0aGUgZGVmYXVsdCByb3cgaGVpZ2h0LgorICAgICRzZWxmLT5fc3RvcmVfZGVmcm93KCk7CisKKyAgICAjIFByZXBlbmQgR1VUUworICAgICRzZWxmLT5fc3RvcmVfZ3V0cygpOworCisgICAgIyBQcmVwZW5kIEdSSURTRVQKKyAgICAkc2VsZi0+X3N0b3JlX2dyaWRzZXQoKTsKKworICAgICMgUHJlcGVuZCBQUklOVEdSSURMSU5FUworICAgICRzZWxmLT5fc3RvcmVfcHJpbnRfZ3JpZGxpbmVzKCk7CisKKyAgICAjIFByZXBlbmQgUFJJTlRIRUFERVJTCisgICAgJHNlbGYtPl9zdG9yZV9wcmludF9oZWFkZXJzKCk7CisKKyAgICAjCisgICAgIyBFbmQgb2YgcHJlcGVuZC4gUmVhZCB1cHdhcmRzIGZyb20gaGVyZS4KKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgQXBwZW5kCisgICAgJHNlbGYtPl9zdG9yZV90YWJsZSgpOworICAgICRzZWxmLT5fc3RvcmVfaW1hZ2VzKCk7CisgICAgJHNlbGYtPl9zdG9yZV9jaGFydHMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2ZpbHRlcnMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2NvbW1lbnRzKCk7CisgICAgJHNlbGYtPl9zdG9yZV93aW5kb3cyKCk7CisgICAgJHNlbGYtPl9zdG9yZV9wYWdlX3ZpZXcoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3pvb20oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BhbmVzKEB7JHNlbGYtPntfcGFuZXN9fSkgaWYgQHskc2VsZi0+e19wYW5lc319OworICAgICRzZWxmLT5fc3RvcmVfc2VsZWN0aW9uKEB7JHNlbGYtPntfc2VsZWN0aW9ufX0pOworICAgICRzZWxmLT5fc3RvcmVfdmFsaWRhdGlvbl9jb3VudCgpOworICAgICRzZWxmLT5fc3RvcmVfdmFsaWRhdGlvbnMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3RhYl9jb2xvcigpOworICAgICRzZWxmLT5fc3RvcmVfZW9mKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIEJPRiBhbmQgSU5ERVggcmVjb3JkcworICAgICRzZWxmLT5fc3RvcmVfaW5kZXgoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2JvZigweDAwMTApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2NvbXBhdGliaWxpdHlfbW9kZSgpCisjCisjIFNldCB0aGUgY29tcGF0aWJpbGl0eSBtb2RlLgorIworIyBTZWUgdGhlIGV4cGxhbmF0aW9uIGluIFdvcmtib29rOjpjb21wYXRpYmlsaXR5X21vZGUoKS4gVGhpcyBwcml2YXRlIG1ldGhvZAorIyBpcyBtYWlubHkgdXNlZCBmb3IgdGVzdCBwdXJwb3Nlcy4KKyMKK3N1YiBfY29tcGF0aWJpbGl0eV9tb2RlIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIGlmIChkZWZpbmVkKCRfWzBdKSkgeworICAgICAgICAkc2VsZi0+e19jb21wYXRpYmlsaXR5fSA9ICRfWzBdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfY29tcGF0aWJpbGl0eX0gPSAxOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9uYW1lKCkuCisjCisjIFJldHJpZXZlIHRoZSB3b3Jrc2hlZXQgbmFtZS4KKyMKKyMgTm90ZSwgdGhlcmUgaXMgbm8gc2V0X25hbWUoKSBtZXRob2QgYmVjYXVzZSBuYW1lcyBhcmUgdXNlZCBpbiBmb3JtdWxhcyBhbmQKKyMgY29udmVydGVkIHRvIGludGVybmFsIGluZGljZXMuIEFsbG93aW5nIHRoZSB1c2VyIHRvIGNoYW5nZSBzaGVldCBuYW1lcworIyBhZnRlciB0aGV5IGhhdmUgYmVlbiBzZXQgaW4gYWRkX3dvcmtzaGVldCgpIGlzIGFza2luZyBmb3IgdHJvdWJsZS4KKyMKK3N1YiBnZXRfbmFtZSB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57X25hbWV9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2RhdGEoKS4KKyMKKyMgUmV0cmlldmVzIGRhdGEgZnJvbSBtZW1vcnkgaW4gb25lIGNodW5rLCBvciBmcm9tIGRpc2sgaW4gJGJ1ZmZlcgorIyBzaXplZCBjaHVua3MuCisjCitzdWIgZ2V0X2RhdGEgeworCisgICAgbXkgJHNlbGYgICA9IHNoaWZ0OworICAgIG15ICRidWZmZXIgPSA0MDk2OworICAgIG15ICR0bXA7CisKKyAgICAjIFJldHVybiBkYXRhIHN0b3JlZCBpbiBtZW1vcnkKKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e19kYXRhfSkgeworICAgICAgICAkdG1wICAgICAgICAgICA9ICRzZWxmLT57X2RhdGF9OworICAgICAgICAkc2VsZi0+e19kYXRhfSA9IHVuZGVmOworICAgICAgICBteSAkZmggICAgICAgICA9ICRzZWxmLT57X2ZpbGVoYW5kbGV9OworICAgICAgICBzZWVrKCRmaCwgMCwgMCkgaWYgJHNlbGYtPntfdXNpbmdfdG1wZmlsZX07CisgICAgICAgIHJldHVybiAkdG1wOworICAgIH0KKworICAgICMgUmV0dXJuIGRhdGEgc3RvcmVkIG9uIGRpc2sKKyAgICBpZiAoJHNlbGYtPntfdXNpbmdfdG1wZmlsZX0pIHsKKyAgICAgICAgcmV0dXJuICR0bXAgaWYgcmVhZCgkc2VsZi0+e19maWxlaGFuZGxlfSwgJHRtcCwgJGJ1ZmZlcik7CisgICAgfQorCisgICAgIyBObyBkYXRhIHRvIHJldHVybgorICAgIHJldHVybiB1bmRlZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNlbGVjdCgpCisjCisjIFNldCB0aGlzIHdvcmtzaGVldCBhcyBhIHNlbGVjdGVkIHdvcmtzaGVldCwgaS5lLiB0aGUgd29ya3NoZWV0IGhhcyBpdHMgdGFiCisjIGhpZ2hsaWdodGVkLgorIworc3ViIHNlbGVjdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfaGlkZGVufSAgICAgICAgID0gMDsgIyBTZWxlY3RlZCB3b3Jrc2hlZXQgY2FuJ3QgYmUgaGlkZGVuLgorICAgICRzZWxmLT57X3NlbGVjdGVkfSAgICAgICA9IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBhY3RpdmF0ZSgpCisjCisjIFNldCB0aGlzIHdvcmtzaGVldCBhcyB0aGUgYWN0aXZlIHdvcmtzaGVldCwgaS5lLiB0aGUgd29ya3NoZWV0IHRoYXQgaXMKKyMgZGlzcGxheWVkIHdoZW4gdGhlIHdvcmtib29rIGlzIG9wZW5lZC4gQWxzbyBzZXQgaXQgYXMgc2VsZWN0ZWQuCisjCitzdWIgYWN0aXZhdGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X2hpZGRlbn0gICAgICAgICA9IDA7ICMgQWN0aXZlIHdvcmtzaGVldCBjYW4ndCBiZSBoaWRkZW4uCisgICAgJHNlbGYtPntfc2VsZWN0ZWR9ICAgICAgID0gMTsKKyAgICAkeyRzZWxmLT57X2FjdGl2ZXNoZWV0fX0gPSAkc2VsZi0+e19pbmRleH07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBoaWRlKCkKKyMKKyMgSGlkZSB0aGlzIHdvcmtzaGVldC4KKyMKK3N1YiBoaWRlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19oaWRkZW59ICAgICAgICAgPSAxOworCisgICAgIyBBIGhpZGRlbiB3b3Jrc2hlZXQgc2hvdWxkbid0IGJlIGFjdGl2ZSBvciBzZWxlY3RlZC4KKyAgICAkc2VsZi0+e19zZWxlY3RlZH0gICAgICAgPSAwOworICAgICR7JHNlbGYtPntfYWN0aXZlc2hlZXR9fSA9IDA7CisgICAgJHskc2VsZi0+e19maXJzdHNoZWV0fX0gID0gMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9maXJzdF9zaGVldCgpCisjCisjIFNldCB0aGlzIHdvcmtzaGVldCBhcyB0aGUgZmlyc3QgdmlzaWJsZSBzaGVldC4gVGhpcyBpcyBuZWNlc3NhcnkKKyMgd2hlbiB0aGVyZSBhcmUgYSBsYXJnZSBudW1iZXIgb2Ygd29ya3NoZWV0cyBhbmQgdGhlIGFjdGl2YXRlZAorIyB3b3Jrc2hlZXQgaXMgbm90IHZpc2libGUgb24gdGhlIHNjcmVlbi4KKyMKK3N1YiBzZXRfZmlyc3Rfc2hlZXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X2hpZGRlbn0gICAgICAgICA9IDA7ICMgQWN0aXZlIHdvcmtzaGVldCBjYW4ndCBiZSBoaWRkZW4uCisgICAgJHskc2VsZi0+e19maXJzdHNoZWV0fX0gID0gJHNlbGYtPntfaW5kZXh9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcHJvdGVjdCgkcGFzc3dvcmQpCisjCisjIFNldCB0aGUgd29ya3NoZWV0IHByb3RlY3Rpb24gZmxhZyB0byBwcmV2ZW50IGFjY2lkZW50YWwgbW9kaWZpY2F0aW9uIGFuZCB0bworIyBoaWRlIGZvcm11bGFzIGlmIHRoZSBsb2NrZWQgYW5kIGhpZGRlbiBmb3JtYXQgcHJvcGVydGllcyBoYXZlIGJlZW4gc2V0LgorIworc3ViIHByb3RlY3QgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X3Byb3RlY3R9ICAgPSAxOworICAgICRzZWxmLT57X3Bhc3N3b3JkfSAgPSAkc2VsZi0+X2VuY29kZV9wYXNzd29yZCgkX1swXSkgaWYgZGVmaW5lZCAkX1swXTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2NvbHVtbigkZmlyc3Rjb2wsICRsYXN0Y29sLCAkd2lkdGgsICRmb3JtYXQsICRoaWRkZW4sICRsZXZlbCkKKyMKKyMgU2V0IHRoZSB3aWR0aCBvZiBhIHNpbmdsZSBjb2x1bW4gb3IgYSByYW5nZSBvZiBjb2x1bW5zLgorIyBTZWUgYWxzbzogX3N0b3JlX2NvbGluZm8KKyMKK3N1YiBzZXRfY29sdW1uIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgQGRhdGEgPSBAXzsKKyAgICBteSAkY2VsbCA9ICRkYXRhWzBdOworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkY2VsbCA9fiAvXlxELykgeworICAgICAgICBAZGF0YSA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKworICAgICAgICAjIFJldHVybmVkIHZhbHVlcyAkcm93MSBhbmQgJHJvdzIgYXJlbid0IHJlcXVpcmVkIGhlcmUuIFJlbW92ZSB0aGVtLgorICAgICAgICBzaGlmdCAgQGRhdGE7ICAgICAgICMgJHJvdzEKKyAgICAgICAgc3BsaWNlIEBkYXRhLCAxLCAxOyAjICRyb3cyCisgICAgfQorCisgICAgcmV0dXJuIGlmIEBkYXRhIDwgMzsgIyBFbnN1cmUgYXQgbGVhc3QgJGZpcnN0Y29sLCAkbGFzdGNvbCBhbmQgJHdpZHRoCisgICAgcmV0dXJuIGlmIG5vdCBkZWZpbmVkICRkYXRhWzBdOyAjIENvbHVtbnMgbXVzdCBiZSBkZWZpbmVkLgorICAgIHJldHVybiBpZiBub3QgZGVmaW5lZCAkZGF0YVsxXTsKKworICAgICMgQXNzdW1lIHNlY29uZCBjb2x1bW4gaXMgdGhlIHNhbWUgYXMgZmlyc3QgaWYgMC4gQXZvaWRzIEtCOTE4NDE5IGJ1Zy4KKyAgICAkZGF0YVsxXSA9ICRkYXRhWzBdIGlmICRkYXRhWzFdID09IDA7CisKKyAgICAjIEVuc3VyZSAybmQgY29sIGlzIGxhcmdlciB0aGFuIGZpcnN0LiBBbHNvIGZvciBLQjkxODQxOSBidWcuCisgICAgKCRkYXRhWzBdLCAkZGF0YVsxXSkgPSAoJGRhdGFbMV0sICRkYXRhWzBdKSBpZiAkZGF0YVswXSA+ICRkYXRhWzFdOworCisgICAgIyBMaW1pdCBjb2x1bW5zIHRvIEV4Y2VsIG1heCBvZiAyNTUuCisgICAgJGRhdGFbMF0gPSAyNTUgaWYgJGRhdGFbMF0gPiAyNTU7CisgICAgJGRhdGFbMV0gPSAyNTUgaWYgJGRhdGFbMV0gPiAyNTU7CisKKyAgICBwdXNoIEB7JHNlbGYtPntfY29saW5mb319LCBbIEBkYXRhIF07CisKKworICAgICMgU3RvcmUgdGhlIGNvbCBzaXplcyBmb3IgdXNlIHdoZW4gY2FsY3VsYXRpbmcgaW1hZ2UgdmVydGljZXMgdGFraW5nCisgICAgIyBoaWRkZW4gY29sdW1ucyBpbnRvIGFjY291bnQuIEFsc28gc3RvcmUgdGhlIGNvbHVtbiBmb3JtYXRzLgorICAgICMKKyAgICBteSAkd2lkdGggID0gJGRhdGFbNF0gPyAwIDogJGRhdGFbMl07ICMgU2V0IHdpZHRoIHRvIHplcm8gaWYgY29sIGlzIGhpZGRlbgorICAgICAgICR3aWR0aCAgfHw9IDA7ICAgICAgICAgICAgICAgICAgICAgIyBFbnN1cmUgd2lkdGggaXNuJ3QgdW5kZWYuCisgICAgbXkgJGZvcm1hdCA9ICRkYXRhWzNdOworCisgICAgbXkgKCRmaXJzdGNvbCwgJGxhc3Rjb2wpID0gQGRhdGE7CisKKyAgICBmb3JlYWNoIG15ICRjb2wgKCRmaXJzdGNvbCAuLiAkbGFzdGNvbCkgeworICAgICAgICAkc2VsZi0+e19jb2xfc2l6ZXN9LT57JGNvbH0gICA9ICR3aWR0aDsKKyAgICAgICAgJHNlbGYtPntfY29sX2Zvcm1hdHN9LT57JGNvbH0gPSAkZm9ybWF0IGlmIGRlZmluZWQgJGZvcm1hdDsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfc2VsZWN0aW9uKCkKKyMKKyMgU2V0IHdoaWNoIGNlbGwgb3IgY2VsbHMgYXJlIHNlbGVjdGVkIGluIGEgd29ya3NoZWV0OiBzZWUgYWxzbyB0aGUKKyMgc3ViIF9zdG9yZV9zZWxlY3Rpb24KKyMKK3N1YiBzZXRfc2VsZWN0aW9uIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgICRzZWxmLT57X3NlbGVjdGlvbn0gPSBbIEBfIF07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBmcmVlemVfcGFuZXMoKQorIworIyBTZXQgcGFuZXMgYW5kIG1hcmsgdGhlbSBhcyBmcm96ZW4uIFNlZSBhbHNvIF9zdG9yZV9wYW5lcygpLgorIworc3ViIGZyZWV6ZV9wYW5lcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICAjIEV4dHJhIGZsYWcgaW5kaWNhdGVkIGEgc3BsaXQgYW5kIGZyZWV6ZS4KKyAgICAkc2VsZi0+e19mcm96ZW5fbm9fc3BsaXR9ID0gMCBpZiAkX1s0XTsKKworICAgICRzZWxmLT57X2Zyb3plbn0gPSAxOworICAgICRzZWxmLT57X3BhbmVzfSAgPSBbIEBfIF07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzcGxpdF9wYW5lcygpCisjCisjIFNldCBwYW5lcyBhbmQgbWFyayB0aGVtIGFzIHNwbGl0LiBTZWUgYWxzbyBfc3RvcmVfcGFuZXMoKS4KKyMKK3N1YiBzcGxpdF9wYW5lcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfZnJvemVufSAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19mcm96ZW5fbm9fc3BsaXR9ICAgPSAwOworICAgICRzZWxmLT57X3BhbmVzfSAgICAgICAgICAgICA9IFsgQF8gXTsKK30KKworIyBPbGRlciBtZXRob2QgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisqdGhhd19wYW5lcyA9ICpzcGxpdF9wYW5lczsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9wb3J0cmFpdCgpCisjCisjIFNldCB0aGUgcGFnZSBvcmllbnRhdGlvbiBhcyBwb3J0cmFpdC4KKyMKK3N1YiBzZXRfcG9ydHJhaXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X29yaWVudGF0aW9ufSA9IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfbGFuZHNjYXBlKCkKKyMKKyMgU2V0IHRoZSBwYWdlIG9yaWVudGF0aW9uIGFzIGxhbmRzY2FwZS4KKyMKK3N1YiBzZXRfbGFuZHNjYXBlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19vcmllbnRhdGlvbn0gPSAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3BhZ2VfdmlldygpCisjCisjIFNldCB0aGUgcGFnZSB2aWV3IG1vZGUgZm9yIE1hYyBFeGNlbC4KKyMKK3N1YiBzZXRfcGFnZV92aWV3IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19wYWdlX3ZpZXd9ID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF90YWJfY29sb3IoKQorIworIyBTZXQgdGhlIGNvbG91ciBvZiB0aGUgd29ya3NoZWV0IGNvbG91ci4KKyMKK3N1YiBzZXRfdGFiX2NvbG9yIHsKKworICAgIG15ICRzZWxmICA9IHNoaWZ0OworCisgICAgbXkgJGNvbG9yID0gJlNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQ6Ol9nZXRfY29sb3IoJF9bMF0pOworICAgICAgICRjb2xvciA9IDAgaWYgJGNvbG9yID09IDB4N0ZGRjsgIyBEZWZhdWx0IGNvbG9yLgorCisgICAgJHNlbGYtPntfdGFiX2NvbG9yfSA9ICRjb2xvcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9wYXBlcigpCisjCisjIFNldCB0aGUgcGFwZXIgdHlwZS4gRXguIDEgPSBVUyBMZXR0ZXIsIDkgPSBBNAorIworc3ViIHNldF9wYXBlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfcGFwZXJfc2l6ZX0gPSAkX1swXSB8fCAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2hlYWRlcigpCisjCisjIFNldCB0aGUgcGFnZSBoZWFkZXIgY2FwdGlvbiBhbmQgb3B0aW9uYWwgbWFyZ2luLgorIworc3ViIHNldF9oZWFkZXIgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJHN0cmluZyAgID0gJF9bMF0gfHwgJyc7CisgICAgbXkgJG1hcmdpbiAgID0gJF9bMV0gfHwgMC41MDsKKyAgICBteSAkZW5jb2RpbmcgPSAkX1syXSB8fCAwOworCisgICAgIyBIYW5kbGUgdXRmOCBzdHJpbmdzIGluIHBlcmwgNS44LgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICBpZiAoRW5jb2RlOjppc191dGY4KCRzdHJpbmcpKSB7CisgICAgICAgICAgICAkc3RyaW5nID0gRW5jb2RlOjplbmNvZGUoIlVURi0xNkJFIiwgJHN0cmluZyk7CisgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgbXkgJGxpbWl0ICAgID0gJGVuY29kaW5nID8gMjU1ICoyIDogMjU1OworCisgICAgaWYgKGxlbmd0aCAkc3RyaW5nID49ICRsaW1pdCkgeworICAgICAgICBjYXJwICdIZWFkZXIgc3RyaW5nIG11c3QgYmUgbGVzcyB0aGFuIDI1NSBjaGFyYWN0ZXJzJzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICRzZWxmLT57X2hlYWRlcn0gICAgICAgICAgPSAkc3RyaW5nOworICAgICRzZWxmLT57X21hcmdpbl9oZWFkZXJ9ICAgPSAkbWFyZ2luOworICAgICRzZWxmLT57X2hlYWRlcl9lbmNvZGluZ30gPSAkZW5jb2Rpbmc7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfZm9vdGVyKCkKKyMKKyMgU2V0IHRoZSBwYWdlIGZvb3RlciBjYXB0aW9uIGFuZCBvcHRpb25hbCBtYXJnaW4uCisjCitzdWIgc2V0X2Zvb3RlciB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkc3RyaW5nICAgPSAkX1swXSB8fCAnJzsKKyAgICBteSAkbWFyZ2luICAgPSAkX1sxXSB8fCAwLjUwOworICAgIG15ICRlbmNvZGluZyA9ICRfWzJdIHx8IDA7CisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cmluZykpIHsKKyAgICAgICAgICAgICRzdHJpbmcgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2QkUiLCAkc3RyaW5nKTsKKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBteSAkbGltaXQgICAgPSAkZW5jb2RpbmcgPyAyNTUgKjIgOiAyNTU7CisKKworICAgIGlmIChsZW5ndGggJHN0cmluZyA+PSAkbGltaXQpIHsKKyAgICAgICAgY2FycCAnRm9vdGVyIHN0cmluZyBtdXN0IGJlIGxlc3MgdGhhbiAyNTUgY2hhcmFjdGVycyc7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAkc2VsZi0+e19mb290ZXJ9ICAgICAgICAgID0gJHN0cmluZzsKKyAgICAkc2VsZi0+e19tYXJnaW5fZm9vdGVyfSAgID0gJG1hcmdpbjsKKyAgICAkc2VsZi0+e19mb290ZXJfZW5jb2Rpbmd9ID0gJGVuY29kaW5nOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgY2VudGVyX2hvcml6b250YWxseSgpCisjCisjIENlbnRlciB0aGUgcGFnZSBob3Jpem9udGFsbHkuCisjCitzdWIgY2VudGVyX2hvcml6b250YWxseSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKGRlZmluZWQgJF9bMF0pIHsKKyAgICAgICAgJHNlbGYtPntfaGNlbnRlcn0gPSAkX1swXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT57X2hjZW50ZXJ9ID0gMTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjZW50ZXJfdmVydGljYWxseSgpCisjCisjIENlbnRlciB0aGUgcGFnZSBob3Jpem9udGFsbHkuCisjCitzdWIgY2VudGVyX3ZlcnRpY2FsbHkgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGlmIChkZWZpbmVkICRfWzBdKSB7CisgICAgICAgICRzZWxmLT57X3ZjZW50ZXJ9ID0gJF9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e192Y2VudGVyfSA9IDE7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X21hcmdpbnMoKQorIworIyBTZXQgYWxsIHRoZSBwYWdlIG1hcmdpbnMgdG8gdGhlIHNhbWUgdmFsdWUgaW4gaW5jaGVzLgorIworc3ViIHNldF9tYXJnaW5zIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+c2V0X21hcmdpbl9sZWZ0KCRfWzBdKTsKKyAgICAkc2VsZi0+c2V0X21hcmdpbl9yaWdodCgkX1swXSk7CisgICAgJHNlbGYtPnNldF9tYXJnaW5fdG9wKCRfWzBdKTsKKyAgICAkc2VsZi0+c2V0X21hcmdpbl9ib3R0b20oJF9bMF0pOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X21hcmdpbnNfTFIoKQorIworIyBTZXQgdGhlIGxlZnQgYW5kIHJpZ2h0IG1hcmdpbnMgdG8gdGhlIHNhbWUgdmFsdWUgaW4gaW5jaGVzLgorIworc3ViIHNldF9tYXJnaW5zX0xSIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+c2V0X21hcmdpbl9sZWZ0KCRfWzBdKTsKKyAgICAkc2VsZi0+c2V0X21hcmdpbl9yaWdodCgkX1swXSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfbWFyZ2luc19UQigpCisjCisjIFNldCB0aGUgdG9wIGFuZCBib3R0b20gbWFyZ2lucyB0byB0aGUgc2FtZSB2YWx1ZSBpbiBpbmNoZXMuCisjCitzdWIgc2V0X21hcmdpbnNfVEIgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5zZXRfbWFyZ2luX3RvcCgkX1swXSk7CisgICAgJHNlbGYtPnNldF9tYXJnaW5fYm90dG9tKCRfWzBdKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9tYXJnaW5fbGVmdCgpCisjCisjIFNldCB0aGUgbGVmdCBtYXJnaW4gaW4gaW5jaGVzLgorIworc3ViIHNldF9tYXJnaW5fbGVmdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfbWFyZ2luX2xlZnR9ID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMC43NTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9tYXJnaW5fcmlnaHQoKQorIworIyBTZXQgdGhlIHJpZ2h0IG1hcmdpbiBpbiBpbmNoZXMuCisjCitzdWIgc2V0X21hcmdpbl9yaWdodCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfbWFyZ2luX3JpZ2h0fSA9IGRlZmluZWQgJF9bMF0gPyAkX1swXSA6IDAuNzU7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfbWFyZ2luX3RvcCgpCisjCisjIFNldCB0aGUgdG9wIG1hcmdpbiBpbiBpbmNoZXMuCisjCitzdWIgc2V0X21hcmdpbl90b3AgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X21hcmdpbl90b3B9ID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMS4wMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9tYXJnaW5fYm90dG9tKCkKKyMKKyMgU2V0IHRoZSBib3R0b20gbWFyZ2luIGluIGluY2hlcy4KKyMKK3N1YiBzZXRfbWFyZ2luX2JvdHRvbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfbWFyZ2luX2JvdHRvbX0gPSBkZWZpbmVkICRfWzBdID8gJF9bMF0gOiAxLjAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcmVwZWF0X3Jvd3MoJGZpcnN0X3JvdywgJGxhc3Rfcm93KQorIworIyBTZXQgdGhlIHJvd3MgdG8gcmVwZWF0IGF0IHRoZSB0b3Agb2YgZWFjaCBwcmludGVkIHBhZ2UuIFNlZSBhbHNvIHRoZQorIyBfc3RvcmVfbmFtZV94eHh4KCkgbWV0aG9kcyBpbiBXb3JrYm9vay5wbS4KKyMKK3N1YiByZXBlYXRfcm93cyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfdGl0bGVfcm93bWlufSAgPSAkX1swXTsKKyAgICAkc2VsZi0+e190aXRsZV9yb3dtYXh9ICA9ICRfWzFdIHx8ICRfWzBdOyAjIFNlY29uZCByb3cgaXMgb3B0aW9uYWwKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHJlcGVhdF9jb2x1bW5zKCRmaXJzdF9jb2wsICRsYXN0X2NvbCkKKyMKKyMgU2V0IHRoZSBjb2x1bW5zIHRvIHJlcGVhdCBhdCB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgZWFjaCBwcmludGVkIHBhZ2UuCisjIFNlZSBhbHNvIHRoZSBfc3RvcmVfbmFtZXMoKSBtZXRob2RzIGluIFdvcmtib29rLnBtLgorIworc3ViIHJlcGVhdF9jb2x1bW5zIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworCisgICAgICAgICMgUmV0dXJuZWQgdmFsdWVzICRyb3cxIGFuZCAkcm93MiBhcmVuJ3QgcmVxdWlyZWQgaGVyZS4gUmVtb3ZlIHRoZW0uCisgICAgICAgIHNoaWZ0ICBAXzsgICAgICAgIyAkcm93MQorICAgICAgICBzcGxpY2UgQF8sIDEsIDE7ICMgJHJvdzIKKyAgICB9CisKKyAgICAkc2VsZi0+e190aXRsZV9jb2xtaW59ICA9ICRfWzBdOworICAgICRzZWxmLT57X3RpdGxlX2NvbG1heH0gID0gJF9bMV0gfHwgJF9bMF07ICMgU2Vjb25kIGNvbCBpcyBvcHRpb25hbAorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcHJpbnRfYXJlYSgkZmlyc3Rfcm93LCAkZmlyc3RfY29sLCAkbGFzdF9yb3csICRsYXN0X2NvbCkKKyMKKyMgU2V0IHRoZSBhcmVhIG9mIGVhY2ggd29ya3NoZWV0IHRoYXQgd2lsbCBiZSBwcmludGVkLiBTZWUgYWxzbyB0aGUKKyMgX3N0b3JlX25hbWVzKCkgbWV0aG9kcyBpbiBXb3JrYm9vay5wbS4KKyMKK3N1YiBwcmludF9hcmVhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgIHJldHVybiBpZiBAXyAhPSA0OyAjIFJlcXVpcmUgNCBwYXJhbWV0ZXJzCisKKyAgICAkc2VsZi0+e19wcmludF9yb3dtaW59ID0gJF9bMF07CisgICAgJHNlbGYtPntfcHJpbnRfY29sbWlufSA9ICRfWzFdOworICAgICRzZWxmLT57X3ByaW50X3Jvd21heH0gPSAkX1syXTsKKyAgICAkc2VsZi0+e19wcmludF9jb2xtYXh9ID0gJF9bM107Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBhdXRvZmlsdGVyKCRmaXJzdF9yb3csICRmaXJzdF9jb2wsICRsYXN0X3JvdywgJGxhc3RfY29sKQorIworIyBTZXQgdGhlIGF1dG9maWx0ZXIgYXJlYSBpbiB0aGUgd29ya3NoZWV0LgorIworc3ViIGF1dG9maWx0ZXIgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgcmV0dXJuIGlmIEBfICE9IDQ7ICMgUmVxdWlyZSA0IHBhcmFtZXRlcnMKKworICAgIG15ICgkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMikgPSBAXzsKKworICAgICMgUmV2ZXJzZSBtYXggYW5kIG1pbiB2YWx1ZXMgaWYgbmVjZXNzYXJ5LgorICAgICgkcm93MSwgJHJvdzIpID0gKCRyb3cyLCAkcm93MSkgaWYgJHJvdzIgPCAkcm93MTsKKyAgICAoJGNvbDEsICRjb2wyKSA9ICgkY29sMiwgJGNvbDEpIGlmICRjb2wyIDwgJGNvbDE7CisKKyAgICAjIFN0b3JlIHRoZSBBdXRvZmlsdGVyIGluZm9ybWF0aW9uCisgICAgJHNlbGYtPntfZmlsdGVyX2FyZWF9ICA9IFskcm93MSwgJHJvdzIsICRjb2wxLCAkY29sMl07CisgICAgJHNlbGYtPntfZmlsdGVyX2NvdW50fSA9IDErICRjb2wyIC0kY29sMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGZpbHRlcl9jb2x1bW4oJGNvbHVtbiwgJGNyaXRlcmlhLCAuLi4pCisjCisjIFNldCB0aGUgY29sdW1uIGZpbHRlciBjcml0ZXJpYS4KKyMKK3N1YiBmaWx0ZXJfY29sdW1uIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRjb2wgICAgICAgICA9ICRfWzBdOworICAgIG15ICRleHByZXNzaW9uICA9ICRfWzFdOworCisKKyAgICBjcm9hayAiTXVzdCBjYWxsIGF1dG9maWx0ZXIoKSBiZWZvcmUgZmlsdGVyX2NvbHVtbigpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGVzcyAkc2VsZi0+e19maWx0ZXJfY291bnR9OworICAgIGNyb2FrICJJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBmaWx0ZXJfY29sdW1uKCkiIHVubGVzcyBAXyA9PSAyOworCisKKyAgICAjIENoZWNrIGZvciBhIGNvbHVtbiByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUuCisgICAgaWYgKCRjb2wgPX4gL15cRC8pIHsKKyAgICAgICAgIyBDb252ZXJ0IGNvbCByZWYgdG8gYSBjZWxsIHJlZiBhbmQgdGhlbiB0byBhIGNvbCBudW1iZXIuCisgICAgICAgICh1bmRlZiwgJGNvbCkgPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZigkY29sIC4gJzEnKTsKKyAgICB9CisKKyAgICBteSAodW5kZWYsIHVuZGVmLCAkY29sX2ZpcnN0LCAkY29sX2xhc3QpID0gQHskc2VsZi0+e19maWx0ZXJfYXJlYX19OworCisgICAgIyBSZWplY3QgY29sdW1uIGlmIGl0IGlzIG91dHNpZGUgZmlsdGVyIHJhbmdlLgorICAgIGlmICgkY29sIDwgJGNvbF9maXJzdCBvciAkY29sID4gJGNvbF9sYXN0KSB7CisgICAgICAgIGNyb2FrICJDb2x1bW4gJyRjb2wnIG91dHNpZGUgYXV0b2ZpbHRlcigpIGNvbHVtbiByYW5nZSAiIC4KKyAgICAgICAgICAgICAgIigkY29sX2ZpcnN0IC4uICRjb2xfbGFzdCkiOworICAgIH0KKworCisgICAgbXkgQHRva2VucyA9ICRzZWxmLT5fZXh0cmFjdF9maWx0ZXJfdG9rZW5zKCRleHByZXNzaW9uKTsKKworICAgIGNyb2FrICJJbmNvcnJlY3QgbnVtYmVyIG9mIHRva2VucyBpbiBleHByZXNzaW9uICckZXhwcmVzc2lvbiciCisgICAgICAgICAgdW5sZXNzIChAdG9rZW5zID09IDMgb3IgQHRva2VucyA9PSA3KTsKKworCisgICAgQHRva2VucyA9ICRzZWxmLT5fcGFyc2VfZmlsdGVyX2V4cHJlc3Npb24oJGV4cHJlc3Npb24sIEB0b2tlbnMpOworCisgICAgJHNlbGYtPntfZmlsdGVyX2NvbHN9LT57JGNvbH0gPSBbQHRva2Vuc107CisgICAgJHNlbGYtPntfZmlsdGVyX29ufSAgICAgICAgICAgPSAxOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2V4dHJhY3RfZmlsdGVyX3Rva2VucygkZXhwcmVzc2lvbikKKyMKKyMgRXh0cmFjdCB0aGUgdG9rZW5zIGZyb20gdGhlIGZpbHRlciBleHByZXNzaW9uLiBUaGUgdG9rZW5zIGFyZSBtYWlubHkgbm9uLQorIyB3aGl0ZXNwYWNlIGdyb3Vwcy4gVGhlIG9ubHkgdHJpY2t5IHBhcnQgaXMgdG8gZXh0cmFjdCBzdHJpbmcgdG9rZW5zIHRoYXQKKyMgY29udGFpbiB3aGl0ZXNwYWNlIGFuZC9vciBxdW90ZWQgZG91YmxlIHF1b3RlcyAoRXhjZWwncyBlc2NhcGVkIHF1b3RlcykuCisjCisjIEV4YW1wbGVzOiAneCA8ICAyMDAwJworIyAgICAgICAgICAgJ3ggPiAgMjAwMCBhbmQgeCA8ICA1MDAwJworIyAgICAgICAgICAgJ3ggPSAiZm9vIicKKyMgICAgICAgICAgICd4ID0gImZvbyBiYXIiJworIyAgICAgICAgICAgJ3ggPSAiZm9vICIiIGJhciInCisjCitzdWIgX2V4dHJhY3RfZmlsdGVyX3Rva2VucyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkZXhwcmVzc2lvbiAgPSAkX1swXTsKKworICAgIHJldHVybiB1bmxlc3MgJGV4cHJlc3Npb247CisKKyAgICBteSBAdG9rZW5zID0gKCRleHByZXNzaW9uICA9fiAvIig/OlteIl18IiIpKiJ8XFMrL2cpOyAjIgorCisgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcXVvdGVzIGFuZCB1bmVzY2FwZSBvdGhlciBxdW90ZXMKKyAgICBmb3IgKEB0b2tlbnMpIHsKKyAgICAgICAgcy9eIi8vOyAgICAgIyIKKyAgICAgICAgcy8iJC8vOyAgICAgIyIKKyAgICAgICAgcy8iIi8iL2c7ICAgIyIKKyAgICB9CisKKyAgICByZXR1cm4gQHRva2VuczsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYXJzZV9maWx0ZXJfZXhwcmVzc2lvbihAdG9rZW4pCisjCisjIENvbnZlcnRzIHRoZSB0b2tlbnMgb2YgYSBwb3NzaWJseSBjb25kaXRpb25hbCBleHByZXNzaW9uIGludG8gMSBvciAyCisjIHN1YiBleHByZXNzaW9ucyBmb3IgZnVydGhlciBwYXJzaW5nLgorIworIyBFeGFtcGxlczoKKyMgICAgICAgICAgKCd4JywgJz09JywgMjAwMCkgLT4gZXhwMQorIyAgICAgICAgICAoJ3gnLCAnPicsICAyMDAwLCAnYW5kJywgJ3gnLCAnPCcsIDUwMDApIC0+IGV4cDEgYW5kIGV4cDIKKyMKK3N1YiBfcGFyc2VfZmlsdGVyX2V4cHJlc3Npb24geworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJGV4cHJlc3Npb24gID0gc2hpZnQ7CisgICAgbXkgQHRva2VucyAgICAgID0gQF87CisKKyAgICAjIFRoZSBudW1iZXIgb2YgdG9rZW5zIHdpbGwgYmUgZWl0aGVyIDMgKGZvciAxIGV4cHJlc3Npb24pCisgICAgIyBvciA3IChmb3IgMiAgZXhwcmVzc2lvbnMpLgorICAgICMKKyAgICBpZiAoQHRva2VucyA9PSA3KSB7CisKKyAgICAgICAgbXkgJGNvbmRpdGlvbmFsID0gJHRva2Vuc1szXTsKKworICAgICAgICBpZiAgICAoJGNvbmRpdGlvbmFsID1+IC9eKGFuZHwmJikkLykgeworICAgICAgICAgICAgJGNvbmRpdGlvbmFsID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoJGNvbmRpdGlvbmFsID1+IC9eKG9yfFx8XHwpJC8pIHsKKyAgICAgICAgICAgICRjb25kaXRpb25hbCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjcm9hayAiVG9rZW4gJyRjb25kaXRpb25hbCcgaXMgbm90IGEgdmFsaWQgY29uZGl0aW9uYWwgIiAuCisgICAgICAgICAgICAgICAgICAiaW4gZmlsdGVyIGV4cHJlc3Npb24gJyRleHByZXNzaW9uJyI7CisgICAgICAgIH0KKworICAgICAgICBteSBAZXhwcmVzc2lvbl8xID0gJHNlbGYtPl9wYXJzZV9maWx0ZXJfdG9rZW5zKCRleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0b2tlbnNbMCwgMSwgMl0pOworICAgICAgICBteSBAZXhwcmVzc2lvbl8yID0gJHNlbGYtPl9wYXJzZV9maWx0ZXJfdG9rZW5zKCRleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0b2tlbnNbNCwgNSwgNl0pOworCisgICAgICAgIHJldHVybiAoQGV4cHJlc3Npb25fMSwgJGNvbmRpdGlvbmFsLCBAZXhwcmVzc2lvbl8yKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+X3BhcnNlX2ZpbHRlcl90b2tlbnMoJGV4cHJlc3Npb24sIEB0b2tlbnMpOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYXJzZV9maWx0ZXJfdG9rZW5zKEB0b2tlbikKKyMKKyMgUGFyc2UgdGhlIDMgdG9rZW5zIG9mIGEgZmlsdGVyIGV4cHJlc3Npb24gYW5kIHJldHVybiB0aGUgb3BlcmF0b3IgYW5kIHRva2VuLgorIworc3ViIF9wYXJzZV9maWx0ZXJfdG9rZW5zIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRleHByZXNzaW9uICA9IHNoaWZ0OworICAgIG15IEB0b2tlbnMgICAgICA9IEBfOworCisgICAgbXkgJW9wZXJhdG9ycyA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICc9PScgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICc9JyAgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICc9ficgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICdlcScgPT4gMiwKKworICAgICAgICAgICAgICAgICAgICAgICAgJyE9JyA9PiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgJyF+JyA9PiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgJ25lJyA9PiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgJzw+JyA9PiA1LAorCisgICAgICAgICAgICAgICAgICAgICAgICAnPCcgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnPD0nID0+IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAnPicgID0+IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAnPj0nID0+IDYsCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBteSAkb3BlcmF0b3IgPSAkb3BlcmF0b3JzeyR0b2tlbnNbMV19OworICAgIG15ICR0b2tlbiAgICA9ICR0b2tlbnNbMl07CisKKworICAgICMgU3BlY2lhbCBoYW5kbGluZyBvZiAiVG9wIiBmaWx0ZXIgZXhwcmVzc2lvbnMuCisgICAgaWYgKCR0b2tlbnNbMF0gPX4gL150b3B8Ym90dG9tJC9pKSB7CisKKyAgICAgICAgbXkgJHZhbHVlID0gJHRva2Vuc1sxXTsKKworICAgICAgICBpZiAoJHZhbHVlID1+IC9cRC8gb3IKKyAgICAgICAgICAgICR2YWx1ZSA8IDEgICAgIG9yCisgICAgICAgICAgICAkdmFsdWUgPiA1MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNyb2FrICJUaGUgdmFsdWUgJyR2YWx1ZScgaW4gZXhwcmVzc2lvbiAnJGV4cHJlc3Npb24nICIgLgorICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGluIHRoZSByYW5nZSAxIHRvIDUwMCI7CisgICAgICAgIH0KKworICAgICAgICAkdG9rZW4gPSBsYyAkdG9rZW47CisKKyAgICAgICAgaWYgKCR0b2tlbiBuZSAnaXRlbXMnIGFuZCAkdG9rZW4gbmUgJyUnKSB7CisgICAgICAgICAgICBjcm9hayAiVGhlIHR5cGUgJyR0b2tlbicgaW4gZXhwcmVzc2lvbiAnJGV4cHJlc3Npb24nICIgLgorICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGVpdGhlciAnaXRlbXMnIG9yICclJyI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJHRva2Vuc1swXSA9fiAvXnRvcCQvaSkgeworICAgICAgICAgICAgJG9wZXJhdG9yID0gMzA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkb3BlcmF0b3IgPSAzMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdG9rZW5zWzJdIGVxICclJykgeworICAgICAgICAgICAgJG9wZXJhdG9yKys7CisgICAgICAgIH0KKworICAgICAgICAkdG9rZW4gICAgPSAkdmFsdWU7CisgICAgfQorCisKKyAgICBpZiAobm90ICRvcGVyYXRvciBhbmQgJHRva2Vuc1swXSkgeworICAgICAgICBjcm9hayAiVG9rZW4gJyR0b2tlbnNbMV0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhdG9yICIgLgorICAgICAgICAgICAgICAiaW4gZmlsdGVyIGV4cHJlc3Npb24gJyRleHByZXNzaW9uJyI7CisgICAgfQorCisKKyAgICAjIFNwZWNpYWwgaGFuZGxpbmcgZm9yIEJsYW5rcy9Ob25CbGFua3MuCisgICAgaWYgKCR0b2tlbiA9fiAvXmJsYW5rc3xub25ibGFua3MkL2kpIHsKKworICAgICAgICAjIE9ubHkgYWxsb3cgRXF1YWxzIG9yIE5vdEVxdWFsIGluIHRoaXMgY29udGV4dC4KKyAgICAgICAgaWYgKCRvcGVyYXRvciAhPSAyIGFuZCAkb3BlcmF0b3IgIT0gNSkgeworICAgICAgICAgICAgY3JvYWsgIlRoZSBvcGVyYXRvciAnJHRva2Vuc1sxXScgaW4gZXhwcmVzc2lvbiAnJGV4cHJlc3Npb24nICIgLgorICAgICAgICAgICAgICAgICAgICJpcyBub3QgdmFsaWQgaW4gcmVsYXRpb24gdG8gQmxhbmtzL05vbkJsYW5rcyciOworICAgICAgICB9CisKKyAgICAgICAgJHRva2VuID0gbGMgJHRva2VuOworCisgICAgICAgICMgVGhlIG9wZXJhdG9yIHNob3VsZCBhbHdheXMgYmUgMiAoPSkgdG8gZmxhZyBhICJzaW1wbGUiIGVxdWFsaXR5IGluCisgICAgICAgICMgdGhlIGJpbmFyeSByZWNvcmQuIFRoZXJlZm9yZSB3ZSBjb252ZXJ0IDw+IHRvID0uCisgICAgICAgIGlmICgkdG9rZW4gZXEgJ2JsYW5rcycpIHsKKyAgICAgICAgICAgIGlmICgkb3BlcmF0b3IgPT0gNSkgeworICAgICAgICAgICAgICAgICRvcGVyYXRvciA9IDI7CisgICAgICAgICAgICAgICAgJHRva2VuICAgID0gJ25vbmJsYW5rcyc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoJG9wZXJhdG9yID09IDUpIHsKKyAgICAgICAgICAgICAgICAkb3BlcmF0b3IgPSAyOworICAgICAgICAgICAgICAgICR0b2tlbiAgICA9ICdibGFua3MnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAjIGlmIHRoZSBzdHJpbmcgdG9rZW4gY29udGFpbnMgYW4gRXhjZWwgbWF0Y2ggY2hhcmFjdGVyIHRoZW4gY2hhbmdlIHRoZQorICAgICMgb3BlcmF0b3IgdHlwZSB0byBpbmRpY2F0ZSBhIG5vbiAic2ltcGxlIiBlcXVhbGl0eS4KKyAgICBpZiAoJG9wZXJhdG9yID09IDIgYW5kICR0b2tlbiA9fiAvWyo/XS8pIHsKKyAgICAgICAgJG9wZXJhdG9yID0gMjI7CisgICAgfQorCisKKyAgICByZXR1cm4gKCRvcGVyYXRvciwgJHRva2VuKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGhpZGVfZ3JpZGxpbmVzKCkKKyMKKyMgU2V0IHRoZSBvcHRpb24gdG8gaGlkZSBncmlkbGluZXMgb24gdGhlIHNjcmVlbiBhbmQgdGhlIHByaW50ZWQgcGFnZS4KKyMgVGhlcmUgYXJlIHR3byB3YXlzIG9mIGRvaW5nIHRoaXMgaW4gdGhlIEV4Y2VsIEJJRkYgZm9ybWF0OiBUaGUgZmlyc3QgaXMgYnkKKyMgc2V0dGluZyB0aGUgRHNwR3JpZCBmaWVsZCBvZiB0aGUgV0lORE9XMiByZWNvcmQsIHRoaXMgdHVybnMgb2ZmIHRoZSBzY3JlZW4KKyMgYW5kIHN1YnNlcXVlbnRseSB0aGUgcHJpbnQgZ3JpZGxpbmUuIFRoZSBzZWNvbmQgbWV0aG9kIGlzIHRvIHZpYSB0aGUKKyMgUFJJTlRHUklETElORVMgYW5kIEdSSURTRVQgcmVjb3JkcywgdGhpcyB0dXJucyBvZmYgdGhlIHByaW50ZWQgZ3JpZGxpbmVzCisjIG9ubHkuIFRoZSBmaXJzdCBtZXRob2QgaXMgcHJvYmFibHkgc3VmZmljaWVudCBmb3IgbW9zdCBjYXNlcy4gVGhlIHNlY29uZAorIyBtZXRob2QgaXMgc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gUG9ydGVycyB0YWtlIG5vdGUuCisjCitzdWIgaGlkZV9ncmlkbGluZXMgeworCisgICAgbXkgJHNlbGYgICA9IHNoaWZ0OworICAgIG15ICRvcHRpb24gPSAkX1swXTsKKworICAgICRvcHRpb24gPSAxIHVubGVzcyBkZWZpbmVkICRvcHRpb247ICMgRGVmYXVsdCB0byBoaWRpbmcgcHJpbnRlZCBncmlkbGluZXMKKworICAgIGlmICgkb3B0aW9uID09IDApIHsKKyAgICAgICAgJHNlbGYtPntfcHJpbnRfZ3JpZGxpbmVzfSAgPSAxOyAjIDEgPSBkaXNwbGF5LCAwID0gaGlkZQorICAgICAgICAkc2VsZi0+e19zY3JlZW5fZ3JpZGxpbmVzfSA9IDE7CisgICAgfQorICAgIGVsc2lmICgkb3B0aW9uID09IDEpIHsKKyAgICAgICAgJHNlbGYtPntfcHJpbnRfZ3JpZGxpbmVzfSAgPSAwOworICAgICAgICAkc2VsZi0+e19zY3JlZW5fZ3JpZGxpbmVzfSA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19wcmludF9ncmlkbGluZXN9ICA9IDA7CisgICAgICAgICRzZWxmLT57X3NjcmVlbl9ncmlkbGluZXN9ID0gMDsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBwcmludF9yb3dfY29sX2hlYWRlcnMoKQorIworIyBTZXQgdGhlIG9wdGlvbiB0byBwcmludCB0aGUgcm93IGFuZCBjb2x1bW4gaGVhZGVycyBvbiB0aGUgcHJpbnRlZCBwYWdlLgorIyBTZWUgYWxzbyB0aGUgX3N0b3JlX3ByaW50X2hlYWRlcnMoKSBtZXRob2QgYmVsb3cuCisjCitzdWIgcHJpbnRfcm93X2NvbF9oZWFkZXJzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoZGVmaW5lZCAkX1swXSkgeworICAgICAgICAkc2VsZi0+e19wcmludF9oZWFkZXJzfSA9ICRfWzBdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfcHJpbnRfaGVhZGVyc30gPSAxOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGZpdF90b19wYWdlcygkd2lkdGgsICRoZWlnaHQpCisjCisjIFN0b3JlIHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBudW1iZXIgb2YgcGFnZXMgdGhhdCB3aWxsIGRlZmluZSB0aGUKKyMgbWF4aW11bSBhcmVhIHByaW50ZWQuIFNlZSBhbHNvIF9zdG9yZV9zZXR1cCgpIGFuZCBfc3RvcmVfd3Nib29sKCkgYmVsb3cuCisjCitzdWIgZml0X3RvX3BhZ2VzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19maXRfcGFnZX0gICAgICA9IDE7CisgICAgJHNlbGYtPntfZml0X3dpZHRofSAgICAgPSAkX1swXSB8fCAwOworICAgICRzZWxmLT57X2ZpdF9oZWlnaHR9ICAgID0gJF9bMV0gfHwgMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9oX3BhZ2VicmVha3MoQGJyZWFrcykKKyMKKyMgU3RvcmUgdGhlIGhvcml6b250YWwgcGFnZSBicmVha3Mgb24gYSB3b3Jrc2hlZXQuCisjCitzdWIgc2V0X2hfcGFnZWJyZWFrcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcHVzaCBAeyRzZWxmLT57X2hicmVha3N9fSwgQF87Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfdl9wYWdlYnJlYWtzKEBicmVha3MpCisjCisjIFN0b3JlIHRoZSB2ZXJ0aWNhbCBwYWdlIGJyZWFrcyBvbiBhIHdvcmtzaGVldC4KKyMKK3N1YiBzZXRfdl9wYWdlYnJlYWtzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBwdXNoIEB7JHNlbGYtPntfdmJyZWFrc319LCBAXzsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF96b29tKCRzY2FsZSkKKyMKKyMgU2V0IHRoZSB3b3Jrc2hlZXQgem9vbSBmYWN0b3IuCisjCitzdWIgc2V0X3pvb20geworCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJHNjYWxlID0gJF9bMF0gfHwgMTAwOworCisgICAgIyBDb25maW5lIHRoZSBzY2FsZSB0byBFeGNlbCdzIHJhbmdlCisgICAgaWYgKCRzY2FsZSA8IDEwIG9yICRzY2FsZSA+IDQwMCkgeworICAgICAgICBjYXJwICJab29tIGZhY3RvciAkc2NhbGUgb3V0c2lkZSByYW5nZTogMTAgPD0gem9vbSA8PSA0MDAiOworICAgICAgICAkc2NhbGUgPSAxMDA7CisgICAgfQorCisgICAgJHNlbGYtPntfem9vbX0gPSBpbnQgJHNjYWxlOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3ByaW50X3NjYWxlKCRzY2FsZSkKKyMKKyMgU2V0IHRoZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBwcmludGVkIHBhZ2UuCisjCitzdWIgc2V0X3ByaW50X3NjYWxlIHsKKworICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgIG15ICRzY2FsZSA9ICRfWzBdIHx8IDEwMDsKKworICAgICMgQ29uZmluZSB0aGUgc2NhbGUgdG8gRXhjZWwncyByYW5nZQorICAgIGlmICgkc2NhbGUgPCAxMCBvciAkc2NhbGUgPiA0MDApIHsKKyAgICAgICAgY2FycCAiUHJpbnQgc2NhbGUgJHNjYWxlIG91dHNpZGUgcmFuZ2U6IDEwIDw9IHpvb20gPD0gNDAwIjsKKyAgICAgICAgJHNjYWxlID0gMTAwOworICAgIH0KKworICAgICMgVHVybiBvZmYgImZpdCB0byBwYWdlIiBvcHRpb24KKyAgICAkc2VsZi0+e19maXRfcGFnZX0gICAgPSAwOworCisgICAgJHNlbGYtPntfcHJpbnRfc2NhbGV9ID0gaW50ICRzY2FsZTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGtlZXBfbGVhZGluZ196ZXJvcygpCisjCisjIENhdXNlcyB0aGUgd3JpdGUoKSBtZXRob2QgdG8gdHJlYXQgaW50ZWdlcnMgd2l0aCBhIGxlYWRpbmcgemVybyBhcyBhIHN0cmluZy4KKyMgVGhpcyBlbnN1cmVzIHRoYXQgYW55IGxlYWRpbmcgemVyb3Mgc3VjaCwgYXMgaW4gemlwIGNvZGVzLCBhcmUgbWFpbnRhaW5lZC4KKyMKK3N1YiBrZWVwX2xlYWRpbmdfemVyb3MgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGlmIChkZWZpbmVkICRfWzBdKSB7CisgICAgICAgICRzZWxmLT57X2xlYWRpbmdfemVyb3N9ID0gJF9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19sZWFkaW5nX3plcm9zfSA9IDE7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2hvd19jb21tZW50cygpCisjCisjIE1ha2UgYW55IGNvbW1lbnRzIGluIHRoZSB3b3Jrc2hlZXQgdmlzaWJsZS4KKyMKK3N1YiBzaG93X2NvbW1lbnRzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19jb21tZW50c192aXNpYmxlfSA9IGRlZmluZWQgJF9bMF0gPyAkX1swXSA6IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfY29tbWVudHNfYXV0aG9yKCkKKyMKKyMgU2V0IHRoZSBkZWZhdWx0IGF1dGhvciBvZiB0aGUgY2VsbCBjb21tZW50cy4KKyMKK3N1YiBzZXRfY29tbWVudHNfYXV0aG9yIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19jb21tZW50c19hdXRob3J9ICAgICA9IGRlZmluZWQgJF9bMF0gPyAkX1swXSA6ICcnOworICAgICRzZWxmLT57X2NvbW1lbnRzX2F1dGhvcl9lbmN9ID0gICAgICAgICAkX1sxXSA/IDEgICAgIDogMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHJpZ2h0X3RvX2xlZnQoKQorIworIyBEaXNwbGF5IHRoZSB3b3Jrc2hlZXQgcmlnaHQgdG8gbGVmdCBmb3Igc29tZSBlYXN0ZXJuIHZlcnNpb25zIG9mIEV4Y2VsLgorIworc3ViIHJpZ2h0X3RvX2xlZnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X2Rpc3BsYXlfYXJhYmljfSA9IGRlZmluZWQgJF9bMF0gPyAkX1swXSA6IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBoaWRlX3plcm8oKQorIworIyBIaWRlIGNlbGwgemVybyB2YWx1ZXMuCisjCitzdWIgaGlkZV96ZXJvIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19kaXNwbGF5X3plcm9zfSA9IGRlZmluZWQgJF9bMF0gPyBub3QgJF9bMF0gOiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcHJpbnRfYWNyb3NzKCkKKyMKKyMgU2V0IHRoZSBvcmRlciBpbiB3aGljaCBwYWdlcyBhcmUgcHJpbnRlZC4KKyMKK3N1YiBwcmludF9hY3Jvc3MgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X3BhZ2Vfb3JkZXJ9ID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9zdGFydF9wYWdlKCkKKyMKKyMgU2V0IHRoZSBzdGFydCBwYWdlIG51bWJlci4KKyMKK3N1YiBzZXRfc3RhcnRfcGFnZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkX1swXTsKKworICAgICRzZWxmLT57X3BhZ2Vfc3RhcnR9ICAgID0gJF9bMF07CisgICAgJHNlbGYtPntfY3VzdG9tX3N0YXJ0fSAgPSAxOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2ZpcnN0X3Jvd19jb2x1bW4oKQorIworIyBTZXQgdGhlIHRvcG1vc3QgYW5kIGxlZnRtb3N0IHZpc2libGUgcm93IGFuZCBjb2x1bW4uCisjIFRPRE86IERvY3VtZW50IHRoaXMgd2hlbiB0ZXN0ZWQgZnVsbHkgZm9yIGludGVyYWN0aW9uIHdpdGggcGFuZXMuCisjCitzdWIgc2V0X2ZpcnN0X3Jvd19jb2x1bW4geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyb3cgID0gJF9bMF0gfHwgMDsKKyAgICBteSAkY29sICA9ICRfWzFdIHx8IDA7CisKKyAgICAkcm93ID0gNjU1MzUgaWYgJHJvdyA+IDY1NTM1OworICAgICRjb2wgPSAyNTUgICBpZiAkY29sID4gMjU1OworCisgICAgJHNlbGYtPntfZmlyc3Rfcm93fSA9ICRyb3c7CisgICAgJHNlbGYtPntfZmlyc3RfY29sfSA9ICRjb2w7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBhZGRfd3JpdGVfaGFuZGxlcigkcmUsICRjb2RlX3JlZikKKyMKKyMgQWxsb3cgdGhlIHVzZXIgdG8gYWRkIHRoZWlyIG93biBtYXRjaGVzIGFuZCBoYW5kbGVycyB0byB0aGUgd3JpdGUoKSBtZXRob2QuCisjCitzdWIgYWRkX3dyaXRlX2hhbmRsZXIgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiB1bmxlc3MgQF8gPT0gMjsKKyAgICByZXR1cm4gdW5sZXNzIHJlZiAkX1sxXSBlcSAnQ09ERSc7CisKKyAgICBwdXNoIEB7JHNlbGYtPntfd3JpdGVfbWF0Y2h9fSwgWyBAXyBdOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZSgkcm93LCAkY29sLCAkdG9rZW4sICRmb3JtYXQpCisjCisjIFBhcnNlICR0b2tlbiBhbmQgY2FsbCBhcHByb3ByaWF0ZSB3cml0ZSBtZXRob2QuICRyb3cgYW5kICRjb2x1bW4gYXJlIHplcm8KKyMgaW5kZXhlZC4gJGZvcm1hdCBpcyBvcHRpb25hbC4KKyMKKyMgVGhlIHdyaXRlX3VybCgpIG1ldGhvZHMgaGF2ZSBhIGZsYWcgdG8gcHJldmVudCByZWN1cnNpb24gd2hlbiB3cml0aW5nIGEKKyMgc3RyaW5nIHRoYXQgbG9va3MgbGlrZSBhIHVybC4KKyMKKyMgUmV0dXJuczogcmV0dXJuIHZhbHVlIG9mIGNhbGxlZCBzdWJyb3V0aW5lCisjCitzdWIgd3JpdGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgbXkgJHRva2VuID0gJF9bMl07CisKKyAgICAjIEhhbmRsZSB1bmRlZnMgYXMgYmxhbmtzCisgICAgJHRva2VuID0gJycgdW5sZXNzIGRlZmluZWQgJHRva2VuOworCisKKyAgICAjIEZpcnN0IHRyeSB1c2VyIGRlZmluZWQgbWF0Y2hlcy4KKyAgICBmb3IgbXkgJGFyZWYgKEB7JHNlbGYtPntfd3JpdGVfbWF0Y2h9fSkgeworICAgICAgICBteSAkcmUgID0gJGFyZWYtPlswXTsKKyAgICAgICAgbXkgJHN1YiA9ICRhcmVmLT5bMV07CisKKyAgICAgICAgaWYgKCR0b2tlbiA9fiAvJHJlLykgeworICAgICAgICAgICAgbXkgJG1hdGNoID0gJiRzdWIoJHNlbGYsIEBfKTsKKyAgICAgICAgICAgIHJldHVybiAkbWF0Y2ggaWYgZGVmaW5lZCAkbWF0Y2g7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgTWF0Y2ggYW4gYXJyYXkgcmVmLgorICAgIGlmIChyZWYgJHRva2VuIGVxICJBUlJBWSIpIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT53cml0ZV9yb3coQF8pOworICAgIH0KKyAgICAjIE1hdGNoIGludGVnZXIgd2l0aCBsZWFkaW5nIHplcm8ocykKKyAgICBlbHNpZiAoJHNlbGYtPntfbGVhZGluZ196ZXJvc30gYW5kICR0b2tlbiA9fiAvXjBcZCskLykgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX3N0cmluZyhAXyk7CisgICAgfQorICAgICMgTWF0Y2ggbnVtYmVyCisgICAgZWxzaWYgKCR0b2tlbiA9fiAvXihbKy1dPykoPz1cZHxcLlxkKVxkKihcLlxkKik/KFtFZV0oWystXT9cZCspKT8kLykgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX251bWJlcihAXyk7CisgICAgfQorICAgICMgTWF0Y2ggaHR0cCwgaHR0cHMgb3IgZnRwIFVSTAorICAgIGVsc2lmICgkdG9rZW4gPX4gbXxeW2ZoXXR0P3BzPzovL3wgICAgYW5kIG5vdCAkc2VsZi0+e193cml0aW5nX3VybH0pIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT53cml0ZV91cmwoQF8pOworICAgIH0KKyAgICAjIE1hdGNoIG1haWx0bzoKKyAgICBlbHNpZiAoJHRva2VuID1+IG0vXm1haWx0bzovICAgICAgICAgIGFuZCBub3QgJHNlbGYtPntfd3JpdGluZ191cmx9KSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+d3JpdGVfdXJsKEBfKTsKKyAgICB9CisgICAgIyBNYXRjaCBpbnRlcm5hbCBvciBleHRlcm5hbCBzaGVldCBsaW5rCisgICAgZWxzaWYgKCR0b2tlbiA9fiBtW14oPzppbnxleCl0ZXJuYWw6XSBhbmQgbm90ICRzZWxmLT57X3dyaXRpbmdfdXJsfSkgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX3VybChAXyk7CisgICAgfQorICAgICMgTWF0Y2ggZm9ybXVsYQorICAgIGVsc2lmICgkdG9rZW4gPX4gL149LykgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX2Zvcm11bGEoQF8pOworICAgIH0KKyAgICAjIE1hdGNoIGJsYW5rCisgICAgZWxzaWYgKCR0b2tlbiBlcSAnJykgeworICAgICAgICBzcGxpY2UgQF8sIDIsIDE7ICMgcmVtb3ZlIHRoZSBlbXB0eSBzdHJpbmcgZnJvbSB0aGUgcGFyYW1ldGVyIGxpc3QKKyAgICAgICAgcmV0dXJuICRzZWxmLT53cml0ZV9ibGFuayhAXyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX3N0cmluZyhAXyk7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd3JpdGVfcm93KCRyb3csICRjb2wsICRhcnJheV9yZWYsICRmb3JtYXQpCisjCisjIFdyaXRlIGEgcm93IG9mIGRhdGEgc3RhcnRpbmcgZnJvbSAoJHJvdywgJGNvbCkuIENhbGwgd3JpdGVfY29sKCkgaWYgYW55IG9mCisjIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgcmVmIGFyZSBpbiB0dXJuIGFycmF5IHJlZnMuIFRoaXMgYWxsb3dzIHRoZSB3cml0aW5nCisjIG9mIDFEIG9yIDJEIGFycmF5cyBvZiBkYXRhIGluIG9uZSBnby4KKyMKKyMgUmV0dXJuczogdGhlIGZpcnN0IGVuY291bnRlcmVkIGVycm9yIHZhbHVlIG9yIHplcm8gZm9yIG5vIGVycm9ycworIworc3ViIHdyaXRlX3JvdyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgICMgQ2F0Y2ggbm9uIGFycmF5IHJlZnMgcGFzc2VkIGJ5IHVzZXIuCisgICAgaWYgKHJlZiAkX1syXSBuZSAnQVJSQVknKSB7CisgICAgICAgIGNyb2FrICJOb3QgYW4gYXJyYXkgcmVmIGluIGNhbGwgdG8gd3JpdGVfcm93KCkkISI7CisgICAgfQorCisgICAgbXkgJHJvdyAgICAgPSBzaGlmdDsKKyAgICBteSAkY29sICAgICA9IHNoaWZ0OworICAgIG15ICR0b2tlbnMgID0gc2hpZnQ7CisgICAgbXkgQG9wdGlvbnMgPSBAXzsKKyAgICBteSAkZXJyb3IgICA9IDA7CisgICAgbXkgJHJldDsKKworICAgIGZvcmVhY2ggbXkgJHRva2VuIChAJHRva2VucykgeworCisgICAgICAgICMgQ2hlY2sgZm9yIG5lc3RlZCBhcnJheXMKKyAgICAgICAgaWYgKHJlZiAkdG9rZW4gZXEgIkFSUkFZIikgeworICAgICAgICAgICAgJHJldCA9ICRzZWxmLT53cml0ZV9jb2woJHJvdywgJGNvbCwgJHRva2VuLCBAb3B0aW9ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkcmV0ID0gJHNlbGYtPndyaXRlICAgICgkcm93LCAkY29sLCAkdG9rZW4sIEBvcHRpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgICMgUmV0dXJuIG9ubHkgdGhlIGZpcnN0IGVycm9yIGVuY291bnRlcmVkLCBpZiBhbnkuCisgICAgICAgICRlcnJvciB8fD0gJHJldDsKKyAgICAgICAgJGNvbCsrOworICAgIH0KKworICAgIHJldHVybiAkZXJyb3I7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV9jb2woJHJvdywgJGNvbCwgJGFycmF5X3JlZiwgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSBjb2x1bW4gb2YgZGF0YSBzdGFydGluZyBmcm9tICgkcm93LCAkY29sKS4gQ2FsbCB3cml0ZV9yb3coKSBpZiBhbnkgb2YKKyMgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSByZWYgYXJlIGluIHR1cm4gYXJyYXkgcmVmcy4gVGhpcyBhbGxvd3MgdGhlIHdyaXRpbmcKKyMgb2YgMUQgb3IgMkQgYXJyYXlzIG9mIGRhdGEgaW4gb25lIGdvLgorIworIyBSZXR1cm5zOiB0aGUgZmlyc3QgZW5jb3VudGVyZWQgZXJyb3IgdmFsdWUgb3IgemVybyBmb3Igbm8gZXJyb3JzCisjCitzdWIgd3JpdGVfY29sIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgIyBDYXRjaCBub24gYXJyYXkgcmVmcyBwYXNzZWQgYnkgdXNlci4KKyAgICBpZiAocmVmICRfWzJdIG5lICdBUlJBWScpIHsKKyAgICAgICAgY3JvYWsgIk5vdCBhbiBhcnJheSByZWYgaW4gY2FsbCB0byB3cml0ZV9yb3coKSQhIjsKKyAgICB9CisKKyAgICBteSAkcm93ICAgICA9IHNoaWZ0OworICAgIG15ICRjb2wgICAgID0gc2hpZnQ7CisgICAgbXkgJHRva2VucyAgPSBzaGlmdDsKKyAgICBteSBAb3B0aW9ucyA9IEBfOworICAgIG15ICRlcnJvciAgID0gMDsKKyAgICBteSAkcmV0OworCisgICAgZm9yZWFjaCBteSAkdG9rZW4gKEAkdG9rZW5zKSB7CisKKyAgICAgICAgIyB3cml0ZSgpIHdpbGwgZGVhbCB3aXRoIGFueSBuZXN0ZWQgYXJyYXlzCisgICAgICAgICRyZXQgPSAkc2VsZi0+d3JpdGUoJHJvdywgJGNvbCwgJHRva2VuLCBAb3B0aW9ucyk7CisKKyAgICAgICAgIyBSZXR1cm4gb25seSB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQsIGlmIGFueS4KKyAgICAgICAgJGVycm9yIHx8PSAkcmV0OworICAgICAgICAkcm93Kys7CisgICAgfQorCisgICAgcmV0dXJuICRlcnJvcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX2NvbW1lbnQoJHJvdywgJGNvbCwgJGNvbW1lbnQpCisjCisjIFdyaXRlIGEgY29tbWVudCB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgorIworIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCisjICAgICAgICAgLTEgOiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cworIyAgICAgICAgIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKKyMKK3N1YiB3cml0ZV9jb21tZW50IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgaWYgKEBfIDwgMykgeyByZXR1cm4gLTEgfSAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworCisKKyAgICBteSAkcm93ID0gJF9bMF07CisgICAgbXkgJGNvbCA9ICRfWzFdOworCisgICAgIyBDaGVjayBmb3IgcGFpcnMgb2Ygb3B0aW9uYWwgYXJndW1lbnRzLCBpLmUuIGFuIG9kZCBudW1iZXIgb2YgYXJncy4KKyAgICBjcm9hayAiVW5ldmVuIG51bWJlciBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyIgdW5sZXNzIEBfICUgMjsKKworCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAkY29sKTsKKworCisgICAgIyBXZSBoYXZlIHRvIGF2b2lkIGR1cGxpY2F0ZSBjb21tZW50cyBpbiBjZWxscyBvciBlbHNlIEV4Y2VsIHdpbGwgY29tcGxhaW4uCisgICAgJHNlbGYtPntfY29tbWVudHN9LT57JHJvd30tPnskY29sfSA9IFsgJHNlbGYtPl9jb21tZW50X3BhcmFtcyhAXykgXTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX1hGKCkKKyMKKyMgUmV0dXJucyBhbiBpbmRleCB0byB0aGUgWEYgcmVjb3JkIGluIHRoZSB3b3JrYm9vay4KKyMKKyMgTm90ZTogdGhpcyBpcyBhIGZ1bmN0aW9uLCBub3QgYSBtZXRob2QuCisjCitzdWIgX1hGIHsKKworICAgIG15ICRzZWxmICAgPSAkX1swXTsKKyAgICBteSAkcm93ICAgID0gJF9bMV07CisgICAgbXkgJGNvbCAgICA9ICRfWzJdOworICAgIG15ICRmb3JtYXQgPSAkX1szXTsKKworICAgIG15ICRlcnJvciA9ICJFcnJvcjogcmVmZXIgdG8gbWVyZ2VfcmFuZ2UoKSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gIiAuCisgICAgICAgICAgICAgICAgICJDYW4ndCB1c2UgcHJldmlvdXNseSBtZXJnZWQgZm9ybWF0IGluIG5vbi1tZXJnZWQgY2VsbCI7CisKKyAgICBpZiAocmVmKCRmb3JtYXQpKSB7CisgICAgICAgICMgVGVtcCBjb2RlIHRvIHByZXZlbnQgbWVyZ2VkIGZvcm1hdHMgaW4gbm9uLW1lcmdlZCBjZWxscy4KKyAgICAgICAgY3JvYWsgJGVycm9yIGlmICRmb3JtYXQtPntfdXNlZF9tZXJnZX0gPT0gMTsKKyAgICAgICAgJGZvcm1hdC0+e191c2VkX21lcmdlfSA9IC0xOworCisgICAgICAgIHJldHVybiAkZm9ybWF0LT5nZXRfeGZfaW5kZXgoKTsKKyAgICB9CisgICAgZWxzaWYgKGV4aXN0cyAkc2VsZi0+e19yb3dfZm9ybWF0c30tPnskcm93fSkgeworICAgICAgICAjIFRlbXAgY29kZSB0byBwcmV2ZW50IG1lcmdlZCBmb3JtYXRzIGluIG5vbi1tZXJnZWQgY2VsbHMuCisgICAgICAgIGNyb2FrICRlcnJvciBpZiAkc2VsZi0+e19yb3dfZm9ybWF0c30tPnskcm93fS0+e191c2VkX21lcmdlfSA9PSAxOworICAgICAgICAkc2VsZi0+e19yb3dfZm9ybWF0c30tPnskcm93fS0+e191c2VkX21lcmdlfSA9IC0xOworCisgICAgICAgIHJldHVybiAkc2VsZi0+e19yb3dfZm9ybWF0c30tPnskcm93fS0+Z2V0X3hmX2luZGV4KCk7CisgICAgfQorICAgIGVsc2lmIChleGlzdHMgJHNlbGYtPntfY29sX2Zvcm1hdHN9LT57JGNvbH0pIHsKKyAgICAgICAgIyBUZW1wIGNvZGUgdG8gcHJldmVudCBtZXJnZWQgZm9ybWF0cyBpbiBub24tbWVyZ2VkIGNlbGxzLgorICAgICAgICBjcm9hayAkZXJyb3IgaWYgJHNlbGYtPntfY29sX2Zvcm1hdHN9LT57JGNvbH0tPntfdXNlZF9tZXJnZX0gPT0gMTsKKyAgICAgICAgJHNlbGYtPntfY29sX2Zvcm1hdHN9LT57JGNvbH0tPntfdXNlZF9tZXJnZX0gPSAtMTsKKworICAgICAgICByZXR1cm4gJHNlbGYtPntfY29sX2Zvcm1hdHN9LT57JGNvbH0tPmdldF94Zl9pbmRleCgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDB4MEY7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgSW50ZXJuYWwgbWV0aG9kcworIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2FwcGVuZCgpLCBvdmVycmlkZGVuLgorIworIyBTdG9yZSBXb3Jrc2hlZXQgZGF0YSBpbiBtZW1vcnkgdXNpbmcgdGhlIGJhc2UgY2xhc3MgX2FwcGVuZCgpIG9yIHRvIGEKKyMgdGVtcG9yYXJ5IGZpbGUsIHRoZSBkZWZhdWx0LgorIworc3ViIF9hcHBlbmQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZGF0YSA9ICcnOworCisgICAgaWYgKCRzZWxmLT57X3VzaW5nX3RtcGZpbGV9KSB7CisgICAgICAgICRkYXRhID0gam9pbignJywgQF8pOworCisgICAgICAgICMgQWRkIENPTlRJTlVFIHJlY29yZHMgaWYgbmVjZXNzYXJ5CisgICAgICAgICRkYXRhID0gJHNlbGYtPl9hZGRfY29udGludWUoJGRhdGEpIGlmIGxlbmd0aCgkZGF0YSkgPiAkc2VsZi0+e19saW1pdH07CisKKyAgICAgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICBsb2NhbCAkXCA9IHVuZGVmOworCisgICAgICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gJGRhdGE7CisgICAgICAgICRzZWxmLT57X2RhdGFzaXplfSArPSBsZW5ndGgoJGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGRhdGEgPSAkc2VsZi0+U1VQRVI6Ol9hcHBlbmQoQF8pOworICAgIH0KKworICAgIHJldHVybiAkZGF0YTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdWJzdGl0dXRlX2NlbGxyZWYoKQorIworIyBTdWJzdGl0dXRlIGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGZvciAgemVybyBiYXNlZCByb3cgYW5kCisjIGNvbHVtbiB2YWx1ZXMgaW4gYW4gYXJndW1lbnQgbGlzdC4KKyMKKyMgRXg6ICgiQTQiLCAiSGVsbG8iKSBpcyBjb252ZXJ0ZWQgdG8gKDMsIDAsICJIZWxsbyIpLgorIworc3ViIF9zdWJzdGl0dXRlX2NlbGxyZWYgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkY2VsbCA9IHVjKHNoaWZ0KTsKKworICAgICMgQ29udmVydCBhIGNvbHVtbiByYW5nZTogJ0E6QScgb3IgJ0I6RycuCisgICAgIyBBIHJhbmdlIHN1Y2ggYXMgQTpBIGlzIGVxdWl2YWxlbnQgdG8gQTE6NjU1MzYsIHNvIGFkZCByb3dzIGFzIHJlcXVpcmVkCisgICAgaWYgKCRjZWxsID1+IC9cJD8oW0EtSV0/W0EtWl0pOlwkPyhbQS1JXT9bQS1aXSkvKSB7CisgICAgICAgIG15ICgkcm93MSwgJGNvbDEpID0gICRzZWxmLT5fY2VsbF90b19yb3djb2woJDEgLicxJyk7CisgICAgICAgIG15ICgkcm93MiwgJGNvbDIpID0gICRzZWxmLT5fY2VsbF90b19yb3djb2woJDIgLic2NTUzNicpOworICAgICAgICByZXR1cm4gJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsIEBfOworICAgIH0KKworICAgICMgQ29udmVydCBhIGNlbGwgcmFuZ2U6ICdBMTpCNycKKyAgICBpZiAoJGNlbGwgPX4gL1wkPyhbQS1JXT9bQS1aXVwkP1xkKyk6XCQ/KFtBLUldP1tBLVpdXCQ/XGQrKS8pIHsKKyAgICAgICAgbXkgKCRyb3cxLCAkY29sMSkgPSAgJHNlbGYtPl9jZWxsX3RvX3Jvd2NvbCgkMSk7CisgICAgICAgIG15ICgkcm93MiwgJGNvbDIpID0gICRzZWxmLT5fY2VsbF90b19yb3djb2woJDIpOworICAgICAgICByZXR1cm4gJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsIEBfOworICAgIH0KKworICAgICMgQ29udmVydCBhIGNlbGwgcmVmZXJlbmNlOiAnQTEnIG9yICdBRDIwMDAnCisgICAgaWYgKCRjZWxsID1+IC9cJD8oW0EtSV0/W0EtWl1cJD9cZCspLykgeworICAgICAgICBteSAoJHJvdzEsICRjb2wxKSA9ICAkc2VsZi0+X2NlbGxfdG9fcm93Y29sKCQxKTsKKyAgICAgICAgcmV0dXJuICRyb3cxLCAkY29sMSwgQF87CisKKyAgICB9CisKKyAgICBjcm9haygiVW5rbm93biBjZWxsIHJlZmVyZW5jZSAkY2VsbCIpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2NlbGxfdG9fcm93Y29sKCRjZWxsX3JlZikKKyMKKyMgQ29udmVydCBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiB0byBhIHplcm8gYmFzZWQgcm93IGFuZCBjb2x1bW4KKyMgcmVmZXJlbmNlOyBjb252ZXJ0cyBDMSB0byAoMCwgMikuCisjCisjIFJldHVybnM6IHJvdywgY29sdW1uCisjCitzdWIgX2NlbGxfdG9fcm93Y29sIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGNlbGwgPSBzaGlmdDsKKworICAgICRjZWxsID1+IC9cJD8oW0EtSV0/W0EtWl0pXCQ/KFxkKykvOworCisgICAgbXkgJGNvbCAgICAgPSAkMTsKKyAgICBteSAkcm93ICAgICA9ICQyOworCisgICAgIyBDb252ZXJ0IGJhc2UyNiBjb2x1bW4gc3RyaW5nIHRvIG51bWJlcgorICAgICMgQWxsIHlvdXIgQmFzZSBhcmUgYmVsb25nIHRvIHVzLgorICAgIG15IEBjaGFycyA9IHNwbGl0IC8vLCAkY29sOworICAgIG15ICRleHBuICA9IDA7CisgICAgJGNvbCAgICAgID0gMDsKKworICAgIHdoaWxlIChAY2hhcnMpIHsKKyAgICAgICAgbXkgJGNoYXIgPSBwb3AoQGNoYXJzKTsgIyBMUyBjaGFyIGZpcnN0CisgICAgICAgICRjb2wgKz0gKG9yZCgkY2hhcikgLW9yZCgnQScpICsxKSAqICgyNioqJGV4cG4pOworICAgICAgICAkZXhwbisrOworICAgIH0KKworICAgICMgQ29udmVydCAxLWluZGV4IHRvIHplcm8taW5kZXgKKyAgICAkcm93LS07CisgICAgJGNvbC0tOworCisgICAgcmV0dXJuICRyb3csICRjb2w7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc29ydF9wYWdlYnJlYWtzKCkKKyMKKyMKKyMgVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGZpbHRlciBlbGVtZW50cyBvZiB0aGUgYXJyYXkgb2YKKyMgcGFnZWJyZWFrcyB1c2VkIGluIHRoZSBfc3RvcmVfaGJyZWFrKCkgYW5kIF9zdG9yZV92YnJlYWsoKSBtZXRob2RzLiBJdDoKKyMgICAxLiBSZW1vdmVzIGR1cGxpY2F0ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QuCisjICAgMi4gU29ydHMgdGhlIGxpc3QuCisjICAgMy4gUmVtb3ZlcyAwIGZyb20gdGhlIGxpc3QgaWYgcHJlc2VudC4KKyMKK3N1YiBfc29ydF9wYWdlYnJlYWtzIHsKKworICAgIG15ICRzZWxmPSBzaGlmdDsKKworICAgIG15ICVoYXNoOworICAgIG15IEBhcnJheTsKKworICAgIEBoYXNoe0BffSA9IHVuZGVmOyAgICAgICAgICAgICAgICAgICAgICAgIyBIYXNoIHNsaWNlIHRvIHJlbW92ZSBkdXBsaWNhdGVzCisgICAgQGFycmF5ICAgID0gc29ydCB7JGEgPD0+ICRifSBrZXlzICVoYXNoOyAjIE51bWVyaWNhbCBzb3J0CisgICAgc2hpZnQgQGFycmF5IGlmICRhcnJheVswXSA9PSAwOyAgICAgICAgICAjIFJlbW92ZSB6ZXJvCisKKyAgICAjIDEwMDAgdmVydGljYWwgcGFnZWJyZWFrcyBhcHBlYXJzIHRvIGJlIGFuIGludGVybmFsIEV4Y2VsIDUgbGltaXQuCisgICAgIyBJdCBpcyBzbGlnaHRseSBoaWdoZXIgaW4gRXhjZWwgOTcvMjAwLCBhcHByb3guIDEwMjYKKyAgICBzcGxpY2UoQGFycmF5LCAxMDAwKSBpZiAoQGFycmF5ID4gMTAwMCk7CisKKyAgICByZXR1cm4gQGFycmF5Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZW5jb2RlX3Bhc3N3b3JkKCRwYXNzd29yZCkKKyMKKyMgQmFzZWQgb24gdGhlIGFsZ29yaXRobSBwcm92aWRlZCBieSBEYW5pZWwgUmVudHogb2YgT3Blbk9mZmljZS4KKyMKKyMKK3N1YiBfZW5jb2RlX3Bhc3N3b3JkIHsKKworICAgIHVzZSBpbnRlZ2VyOworCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0OworICAgIG15ICRwbGFpbnRleHQgPSAkX1swXTsKKyAgICBteSAkcGFzc3dvcmQ7CisgICAgbXkgJGNvdW50OworICAgIG15IEBjaGFyczsKKyAgICBteSAkaSA9IDA7CisKKyAgICAkY291bnQgPSBAY2hhcnMgPSBzcGxpdCAvLywgJHBsYWludGV4dDsKKworICAgIGZvcmVhY2ggbXkgJGNoYXIgKEBjaGFycykgeworICAgICAgICBteSAkbG93XzE1OworICAgICAgICBteSAkaGlnaF8xNTsKKyAgICAgICAgJGNoYXIgICAgID0gb3JkKCRjaGFyKSA8PCArKyRpOworICAgICAgICAkbG93XzE1ICAgPSAkY2hhciAmIDB4N2ZmZjsKKyAgICAgICAgJGhpZ2hfMTUgID0gJGNoYXIgJiAweDdmZmYgPDwgMTU7CisgICAgICAgICRoaWdoXzE1ICA9ICRoaWdoXzE1ID4+IDE1OworICAgICAgICAkY2hhciAgICAgPSAkbG93XzE1IHwgJGhpZ2hfMTU7CisgICAgfQorCisgICAgJHBhc3N3b3JkICA9IDB4MDAwMDsKKyAgICAkcGFzc3dvcmQgXj0gJF8gZm9yIEBjaGFyczsKKyAgICAkcGFzc3dvcmQgXj0gJGNvdW50OworICAgICRwYXNzd29yZCBePSAweENFNEI7CisKKyAgICByZXR1cm4gJHBhc3N3b3JkOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgb3V0bGluZV9zZXR0aW5ncygkdmlzaWJsZSwgJHN5bWJvbHNfYmVsb3csICRzeW1ib2xzX3JpZ2h0LCAkYXV0b19zdHlsZSkKKyMKKyMgVGhpcyBtZXRob2Qgc2V0cyB0aGUgcHJvcGVydGllcyBmb3Igb3V0bGluaW5nIGFuZCBncm91cGluZy4gVGhlIGRlZmF1bHRzCisjIGNvcnJlc3BvbmQgdG8gRXhjZWwncyBkZWZhdWx0cy4KKyMKK3N1YiBvdXRsaW5lX3NldHRpbmdzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19vdXRsaW5lX29ufSAgICA9IGRlZmluZWQgJF9bMF0gPyAkX1swXSA6IDE7CisgICAgJHNlbGYtPntfb3V0bGluZV9iZWxvd30gPSBkZWZpbmVkICRfWzFdID8gJF9bMV0gOiAxOworICAgICRzZWxmLT57X291dGxpbmVfcmlnaHR9ID0gZGVmaW5lZCAkX1syXSA/ICRfWzJdIDogMTsKKyAgICAkc2VsZi0+e19vdXRsaW5lX3N0eWxlfSA9ICAgICAgICAgJF9bM10gfHwgMDsKKworICAgICMgRW5zdXJlIHRoaXMgaXMgYSBib29sZWFuIHZhbGUgZm9yIFdpbmRvdzIKKyAgICAkc2VsZi0+e19vdXRsaW5lX29ufSAgICA9IDEgaWYgJHNlbGYtPntfb3V0bGluZV9vbn07Cit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQklGRiBSRUNPUkRTCisjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV9udW1iZXIoJHJvdywgJGNvbCwgJG51bSwgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSBkb3VibGUgdG8gdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiAoemVybyBpbmRleGVkKS4KKyMgQW4gaW50ZWdlciBjYW4gYmUgd3JpdHRlbiBhcyBhIGRvdWJsZS4gRXhjZWwgd2lsbCBkaXNwbGF5IGFuCisjIGludGVnZXIuICRmb3JtYXQgaXMgb3B0aW9uYWwuCisjCisjIFJldHVybnMgIDAgOiBub3JtYWwgdGVybWluYXRpb24KKyMgICAgICAgICAtMSA6IGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzCisjICAgICAgICAgLTIgOiByb3cgb3IgY29sdW1uIG91dCBvZiByYW5nZQorIworc3ViIHdyaXRlX251bWJlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBpZiAoQF8gPCAzKSB7IHJldHVybiAtMSB9ICAgICAgICAgICAgICAgICAgICAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworCisgICAgbXkgJHJlY29yZCAgPSAweDAyMDM7ICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggID0gMHgwMDBFOyAgICAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdyAgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBaZXJvIGluZGV4ZWQgcm93CisgICAgbXkgJGNvbCAgICAgPSAkX1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBaZXJvIGluZGV4ZWQgY29sdW1uCisgICAgbXkgJG51bSAgICAgPSAkX1syXTsKKyAgICBteSAkeGYgICAgICA9IF9YRigkc2VsZiwgJHJvdywgJGNvbCwgJF9bM10pOyAjIFRoZSBjZWxsIGZvcm1hdAorCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAkY29sKTsKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygidnZ2IiwgJHJvdywgJGNvbCwgJHhmKTsKKyAgICBteSAkeGxfZG91YmxlID0gcGFjaygiZCIsICAgJG51bSk7CisKKyAgICBpZiAoJHNlbGYtPntfYnl0ZV9vcmRlcn0pIHsgJHhsX2RvdWJsZSA9IHJldmVyc2UgJHhsX2RvdWJsZSB9CisKKyAgICAjIFN0b3JlIHRoZSBkYXRhIG9yIHdyaXRlIGltbWVkaWF0ZWx5IGRlcGVuZGluZyBvbiB0aGUgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgIGlmICgkc2VsZi0+e19jb21wYXRpYmlsaXR5fSkgeworICAgICAgICAkc2VsZi0+e190YWJsZX0tPlskcm93XS0+WyRjb2xdID0gJGhlYWRlciAuICRkYXRhIC4gJHhsX2RvdWJsZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhLCAkeGxfZG91YmxlKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX3N0cmluZyAoJHJvdywgJGNvbCwgJHN0cmluZywgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiAoemVybyBpbmRleGVkKS4KKyMgTk9URTogdGhlcmUgaXMgYW4gRXhjZWwgNSBkZWZpbmVkIGxpbWl0IG9mIDI1NSBjaGFyYWN0ZXJzLgorIyAkZm9ybWF0IGlzIG9wdGlvbmFsLgorIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCisjICAgICAgICAgLTEgOiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cworIyAgICAgICAgIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKKyMgICAgICAgICAtMyA6IGxvbmcgc3RyaW5nIHRydW5jYXRlZCB0byAyNTUgY2hhcnMKKyMKK3N1YiB3cml0ZV9zdHJpbmcgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgaWYgKEBfIDwgMykgeyByZXR1cm4gLTEgfSAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwRkQ7ICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwQTsgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgICMgWmVybyBpbmRleGVkIHJvdworICAgIG15ICRjb2wgICAgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCBjb2x1bW4KKyAgICBteSAkc3RybGVuICAgICAgPSBsZW5ndGgoJF9bMl0pOworICAgIG15ICRzdHIgICAgICAgICA9ICRfWzJdOworICAgIG15ICR4ZiAgICAgICAgICA9IF9YRigkc2VsZiwgJHJvdywgJGNvbCwgJF9bM10pOyAjIFRoZSBjZWxsIGZvcm1hdAorICAgIG15ICRlbmNvZGluZyAgICA9IDB4MDsKKyAgICBteSAkc3RyX2Vycm9yICAgPSAwOworCisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cikpIHsKKyAgICAgICAgICAgIG15ICR0bXAgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkc3RyKTsKKyAgICAgICAgICAgIHJldHVybiAkc2VsZi0+d3JpdGVfdXRmMTZsZV9zdHJpbmcoJHJvdywgJGNvbCwgJHRtcCwgJF9bM10pOworICAgICAgICB9CisgICAgfQorCisKKyAgICAjIENoZWNrIHRoYXQgcm93IGFuZCBjb2wgYXJlIHZhbGlkIGFuZCBzdG9yZSBtYXggYW5kIG1pbiB2YWx1ZXMKKyAgICByZXR1cm4gLTIgaWYgJHNlbGYtPl9jaGVja19kaW1lbnNpb25zKCRyb3csICRjb2wpOworCisgICAgIyBMaW1pdCB0aGUgc3RyaW5nIHRvIHRoZSBtYXggbnVtYmVyIG9mIGNoYXJzLgorICAgIGlmICgkc3RybGVuID4gMzI3NjcpIHsKKyAgICAgICAgJHN0ciAgICAgICA9IHN1YnN0cigkc3RyLCAwLCAzMjc2Nyk7CisgICAgICAgICRzdHJfZXJyb3IgPSAtMzsKKyAgICB9CisKKworICAgICMgUHJlcGVuZCB0aGUgc3RyaW5nIHdpdGggdGhlIHR5cGUuCisgICAgbXkgJHN0cl9oZWFkZXIgID0gcGFjaygidkMiLCBsZW5ndGgoJHN0ciksICRlbmNvZGluZyk7CisgICAgJHN0ciAgICAgICAgICAgID0gJHN0cl9oZWFkZXIgLiAkc3RyOworCisKKyAgICBpZiAobm90IGV4aXN0cyAkeyRzZWxmLT57X3N0cl90YWJsZX19LT57JHN0cn0pIHsKKyAgICAgICAgJHskc2VsZi0+e19zdHJfdGFibGV9fS0+eyRzdHJ9ID0gJHskc2VsZi0+e19zdHJfdW5pcXVlfX0rKzsKKyAgICB9CisKKworICAgICR7JHNlbGYtPntfc3RyX3RvdGFsfX0rKzsKKworCisgICAgbXkgJGhlYWRlciA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgID0gcGFjaygidnZ2ViIsICRyb3csICRjb2wsICR4ZiwgJHskc2VsZi0+e19zdHJfdGFibGV9fS0+eyRzdHJ9KTsKKworCisgICAgIyBTdG9yZSB0aGUgZGF0YSBvciB3cml0ZSBpbW1lZGlhdGVseSBkZXBlbmRpbmcgb24gdGhlIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICBpZiAoJHNlbGYtPntfY29tcGF0aWJpbGl0eX0pIHsKKyAgICAgICAgJHNlbGYtPntfdGFibGV9LT5bJHJvd10tPlskY29sXSA9ICRoZWFkZXIgLiAkZGF0YTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gJHN0cl9lcnJvcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX2JsYW5rKCRyb3csICRjb2wsICRmb3JtYXQpCisjCisjIFdyaXRlIGEgYmxhbmsgY2VsbCB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgorIyBBIGJsYW5rIGNlbGwgaXMgdXNlZCB0byBzcGVjaWZ5IGZvcm1hdHRpbmcgd2l0aG91dCBhZGRpbmcgYSBzdHJpbmcKKyMgb3IgYSBudW1iZXIuCisjCisjIEEgYmxhbmsgY2VsbCB3aXRob3V0IGEgZm9ybWF0IHNlcnZlcyBubyBwdXJwb3NlLiBUaGVyZWZvcmUsIHdlIGRvbid0IHdyaXRlCisjIGEgQkxBTksgcmVjb3JkIHVubGVzcyBhIGZvcm1hdCBpcyBzcGVjaWZpZWQuIFRoaXMgaXMgbWFpbmx5IGFuIG9wdGltaXNhdGlvbgorIyBmb3IgdGhlIHdyaXRlX3JvdygpIGFuZCB3cml0ZV9jb2woKSBtZXRob2RzLgorIworIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uIChpbmNsdWRpbmcgbm8gZm9ybWF0KQorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjCitzdWIgd3JpdGVfYmxhbmsgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgIyBDaGVjayB0aGUgbnVtYmVyIG9mIGFyZ3MKKyAgICByZXR1cm4gLTEgaWYgQF8gPCAyOworCisgICAgIyBEb24ndCB3cml0ZSBhIGJsYW5rIGNlbGwgdW5sZXNzIGl0IGhhcyBhIGZvcm1hdAorICAgIHJldHVybiAwIGlmIG5vdCBkZWZpbmVkICRfWzJdOworCisKKyAgICBteSAkcmVjb3JkICA9IDB4MDIwMTsgICAgICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgPSAweDAwMDY7ICAgICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93ICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCByb3cKKyAgICBteSAkY29sICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCBjb2x1bW4KKyAgICBteSAkeGYgICAgICA9IF9YRigkc2VsZiwgJHJvdywgJGNvbCwgJF9bMl0pOyAjIFRoZSBjZWxsIGZvcm1hdAorCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAkY29sKTsKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygidnZ2IiwgJHJvdywgJGNvbCwgJHhmKTsKKworICAgICMgU3RvcmUgdGhlIGRhdGEgb3Igd3JpdGUgaW1tZWRpYXRlbHkgZGVwZW5kaW5nIG9uIHRoZSBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgaWYgKCRzZWxmLT57X2NvbXBhdGliaWxpdHl9KSB7CisgICAgICAgICRzZWxmLT57X3RhYmxlfS0+WyRyb3ddLT5bJGNvbF0gPSAkaGVhZGVyIC4gJGRhdGE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV9mb3JtdWxhKCRyb3csICRjb2wsICRmb3JtdWxhLCAkZm9ybWF0LCAkdmFsdWUpCisjCisjIFdyaXRlIGEgZm9ybXVsYSB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgorIyBUaGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZm9ybXVsYSBpcyBwYXNzZWQgdG8gdGhlIHBhcnNlciBpbgorIyBGb3JtdWxhLnBtIHdoaWNoIHJldHVybnMgYSBwYWNrZWQgYmluYXJ5IHN0cmluZy4KKyMKKyMgJGZvcm1hdCBpcyBvcHRpb25hbC4KKyMKKyMgJHZhbHVlIGlzIGFuIG9wdGlvbmFsIHJlc3VsdCBvZiB0aGUgZm9ybXVsYSB0aGF0IGNhbiBiZSBzdXBwbGllZCBieSB0aGUgdXNlci4KKyMKKyMgUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjCitzdWIgd3JpdGVfZm9ybXVsYSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBpZiAoQF8gPCAzKSB7IHJldHVybiAtMSB9ICAgIyBDaGVjayB0aGUgbnVtYmVyIG9mIGFyZ3MKKworICAgIG15ICRyZWNvcmQgICAgPSAweDAwMDY7ICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aDsgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93ICAgICAgID0gJF9bMF07ICAgICAgIyBaZXJvIGluZGV4ZWQgcm93CisgICAgbXkgJGNvbCAgICAgICA9ICRfWzFdOyAgICAgICMgWmVybyBpbmRleGVkIGNvbHVtbgorICAgIG15ICRmb3JtdWxhICAgPSAkX1syXTsgICAgICAjIFRoZSBmb3JtdWxhIHRleHQgc3RyaW5nCisgICAgbXkgJHZhbHVlICAgICA9ICRfWzRdOyAgICAgICMgVGhlIGZvcm11bGEgdGV4dCBzdHJpbmcKKworCisgICAgbXkgJHhmICAgICAgICA9IF9YRigkc2VsZiwgJHJvdywgJGNvbCwgJF9bM10pOyAgIyBUaGUgY2VsbCBmb3JtYXQKKyAgICBteSAkY2huICAgICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAjIE11c3QgYmUgemVybworICAgIG15ICRpc19zdHJpbmcgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRm9ybXVsYSBldmFsdWF0ZXMgdG8gc3RyCisgICAgbXkgJG51bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDdXJyZW50IHZhbHVlIG9mIGZvcm11bGEKKyAgICBteSAkZ3JiaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbiBmbGFncworCisKKyAgICAjIEV4Y2VsIG5vcm1hbGx5IHN0b3JlcyB0aGUgbGFzdCBjYWxjdWxhdGVkIHZhbHVlIG9mIHRoZSBmb3JtdWxhIGluICRudW0uCisgICAgIyBDbGVhcmx5IHdlIGFyZSBub3QgaW4gYSBwb3NpdGlvbiB0byBjYWxjdWxhdGUgdGhpcyAiYSBwcmlvcmkiLiBJbnN0ZWFkCisgICAgIyB3ZSBzZXQgJG51bSB0byB6ZXJvIGFuZCBzZXQgdGhlIG9wdGlvbiBmbGFncyBpbiAkZ3JiaXQgdG8gZW5zdXJlCisgICAgIyBhdXRvbWF0aWMgY2FsY3VsYXRpb24gb2YgdGhlIGZvcm11bGEgd2hlbiB0aGUgZmlsZSBpcyBvcGVuZWQuCisgICAgIyBBcyBhIHdvcmthcm91bmQgZm9yIHNvbWUgbm9uLUV4Y2VsIGFwcHMgd2UgYWxzbyBhbGxvdyB0aGUgdXNlciB0bworICAgICMgc3BlY2lmeSB0aGUgcmVzdWx0IG9mIHRoZSBmb3JtdWxhLgorICAgICMKKyAgICAoJG51bSwgJGdyYml0LCAkaXNfc3RyaW5nKSA9ICRzZWxmLT5fZW5jb2RlX2Zvcm11bGFfcmVzdWx0KCR2YWx1ZSk7CisKKworICAgICMgQ2hlY2sgdGhhdCByb3cgYW5kIGNvbCBhcmUgdmFsaWQgYW5kIHN0b3JlIG1heCBhbmQgbWluIHZhbHVlcworICAgIHJldHVybiAtMiBpZiAkc2VsZi0+X2NoZWNrX2RpbWVuc2lvbnMoJHJvdywgJGNvbCk7CisKKyAgICAjIFN0cmlwIHRoZSA9IHNpZ24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9ybXVsYSBzdHJpbmcKKyAgICAkZm9ybXVsYSAgICA9fiBzKF49KSgpOworCisgICAgbXkgJHRtcCAgICAgPSAkZm9ybXVsYTsKKworICAgICMgUGFyc2UgdGhlIGZvcm11bGEgdXNpbmcgdGhlIHBhcnNlciBpbiBGb3JtdWxhLnBtCisgICAgbXkgJHBhcnNlciAgPSAkc2VsZi0+e19wYXJzZXJ9OworCisgICAgIyBJbiBvcmRlciB0byByYWlzZSBmb3JtdWxhIGVycm9ycyBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBjYWxsaW5nCisgICAgIyBwcm9ncmFtIHdlIHVzZSBhbiBldmFsIGJsb2NrIGFuZCByZS1yYWlzZSB0aGUgZXJyb3IgZnJvbSBoZXJlLgorICAgICMKKyAgICBldmFsIHsgJGZvcm11bGEgPSAkcGFyc2VyLT5wYXJzZV9mb3JtdWxhKCRmb3JtdWxhKSB9OworCisgICAgaWYgKCRAKSB7CisgICAgICAgICRAID1+IHMvXG4kLy87ICAjIFN0cmlwIHRoZSBcbiB1c2VkIGluIHRoZSBGb3JtdWxhLnBtIGRpZSgpCisgICAgICAgIGNyb2FrICRAOyAgICAgICAjIFJlLXJhaXNlIHRoZSBlcnJvcgorICAgIH0KKworCisgICAgbXkgJGZvcm1sZW4gPSBsZW5ndGgoJGZvcm11bGEpOyAjIExlbmd0aCBvZiB0aGUgYmluYXJ5IHN0cmluZworICAgICAgICRsZW5ndGggID0gMHgxNiArICRmb3JtbGVuOyAgIyBMZW5ndGggb2YgdGhlIHJlY29yZCBkYXRhCisKKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2dnYiLCAgICRyb3csICRjb2wsICR4Zik7CisgICAgICAgJGRhdGEgICAuPSAkbnVtOworICAgICAgICRkYXRhICAgLj0gcGFjaygidlZ2IiwgICAkZ3JiaXQsICRjaG4sICRmb3JtbGVuKTsKKworICAgICMgVGhlIFNUUklORyByZWNvcmQgaWYgdGhlIGZvcm11bGEgZXZhbHVhdGVzIHRvIGEgc3RyaW5nLgorICAgIG15ICRzdHJpbmcgID0gJyc7CisgICAgICAgJHN0cmluZyAgPSAkc2VsZi0+X2dldF9mb3JtdWxhX3N0cmluZygkdmFsdWUpIGlmICRpc19zdHJpbmc7CisKKworICAgICMgU3RvcmUgdGhlIGRhdGEgb3Igd3JpdGUgaW1tZWRpYXRlbHkgZGVwZW5kaW5nIG9uIHRoZSBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgaWYgKCRzZWxmLT57X2NvbXBhdGliaWxpdHl9KSB7CisgICAgICAgICRzZWxmLT57X3RhYmxlfS0+WyRyb3ddLT5bJGNvbF0gPSAkaGVhZGVyIC4gJGRhdGEgLiAkZm9ybXVsYSAuICRzdHJpbmc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSwgJGZvcm11bGEsICRzdHJpbmcpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2VuY29kZV9mb3JtdWxhX3Jlc3VsdCgpCisjCisjIEVuY29kZSB0aGUgdXNlciBzdXBwbGllZCByZXN1bHQgZm9yIGEgZm9ybXVsYS4KKyMKK3N1YiBfZW5jb2RlX2Zvcm11bGFfcmVzdWx0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkdmFsdWUgICAgID0gJF9bMF07ICAgICAgIyBSZXN1bHQgdG8gYmUgZW5jb2RlZC4KKyAgICBteSAkaXNfc3RyaW5nID0gMDsgICAgICAgICAgIyBGb3JtdWxhIGV2YWx1YXRlcyB0byBzdHIuCisgICAgbXkgJG51bTsgICAgICAgICAgICAgICAgICAgICMgQ3VycmVudCB2YWx1ZSBvZiBmb3JtdWxhLgorICAgIG15ICRncmJpdDsgICAgICAgICAgICAgICAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIGlmIChub3QgZGVmaW5lZCAkdmFsdWUpIHsKKyAgICAgICAgJGdyYml0ICA9IDB4MDM7CisgICAgICAgICRudW0gICAgPSBwYWNrICJkIiwgMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICMgVGhlIHVzZXIgc3BlY2lmaWVkIHRoZSByZXN1bHQgb2YgdGhlIGZvcm11bGEuIFdlIHR1cm4gb2ZmIHRoZSByZWNhbGMKKyAgICAgICAgIyBmbGFnIGFuZCBjaGVjayB0aGUgcmVzdWx0IHR5cGUuCisgICAgICAgICRncmJpdCAgPSAweDAwOworCisgICAgICAgIGlmICgkdmFsdWUgPX4gL14oWystXT8pKD89XGR8XC5cZClcZCooXC5cZCopPyhbRWVdKFsrLV0/XGQrKSk/JC8pIHsKKyAgICAgICAgICAgICMgVmFsdWUgaXMgYSBudW1iZXIuCisgICAgICAgICAgICAkbnVtID0gcGFjayAiZCIsICR2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgbXkgJWJvb2xzID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUUlVFJyAgICA9PiBbMSwgIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGQUxTRScgICA9PiBbMSwgIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjTlVMTCEnICA9PiBbMiwgIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjRElWLzAhJyA9PiBbMiwgIDddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjVkFMVUUhJyA9PiBbMiwgMTVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjUkVGIScgICA9PiBbMiwgMjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjTkFNRT8nICA9PiBbMiwgMjldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjTlVNIScgICA9PiBbMiwgMzZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjTi9BJyAgICA9PiBbMiwgNDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgaWYgKGV4aXN0cyAkYm9vbHN7JHZhbHVlfSkgeworICAgICAgICAgICAgICAgICMgVmFsdWUgaXMgYSBib29sZWFuLgorICAgICAgICAgICAgICAgICRudW0gPSBwYWNrICJ2dnZ2IiwgJGJvb2xzeyR2YWx1ZX0tPlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRib29sc3skdmFsdWV9LT5bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgIyBWYWx1ZSBpcyBhIHN0cmluZy4KKyAgICAgICAgICAgICAgICAkbnVtID0gcGFjayAidnZ2diIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjsKKyAgICAgICAgICAgICAgICAkaXNfc3RyaW5nID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoJG51bSwgJGdyYml0LCAkaXNfc3RyaW5nKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfZm9ybXVsYV9zdHJpbmcoKQorIworIyBQYWNrIHRoZSBzdHJpbmcgdmFsdWUgd2hlbiBhIGZvcm11bGEgZXZhbHVhdGVzIHRvIGEgc3RyaW5nLiBUaGUgdmFsdWUgY2Fubm90CisjIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIG1vZHVsZSBhbmQgdGh1cyBtdXN0IGJlIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgorIworc3ViIF9nZXRfZm9ybXVsYV9zdHJpbmcgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDAyMDc7ICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgPSAweDAwOyAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKyAgICBteSAkc3RyaW5nICAgID0gJF9bMF07ICAgICAgICAgICMgRm9ybXVsYSBzdHJpbmcuCisgICAgbXkgJHN0cmxlbiAgICA9IGxlbmd0aCAkX1swXTsgICAjIExlbmd0aCBvZiB0aGUgZm9ybXVsYSBzdHJpbmcgKGNoYXJzKS4KKyAgICBteSAkZW5jb2RpbmcgID0gMDsgICAgICAgICAgICAgICMgU3RyaW5nIGVuY29kaW5nLgorCisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cmluZykpIHsKKyAgICAgICAgICAgICRzdHJpbmcgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2QkUiLCAkc3RyaW5nKTsKKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICRsZW5ndGggICAgICAgPSAweDAzICsgbGVuZ3RoICRzdHJpbmc7ICAjIExlbmd0aCBvZiB0aGUgcmVjb3JkIGRhdGEKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2QyIsICRzdHJsZW4sICRlbmNvZGluZyk7CisKKyAgICByZXR1cm4gJGhlYWRlciAuICRkYXRhIC4gJHN0cmluZzsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHN0b3JlX2Zvcm11bGEoJGZvcm11bGEpCisjCisjIFByZS1wYXJzZSBhIGZvcm11bGEuIFRoaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHJlcGVhdF9mb3JtdWxhKCkKKyMgdG8gcmVwZXRpdGl2ZWx5IHJld3JpdGUgYSBmb3JtdWxhIHdpdGhvdXQgcmUtcGFyc2luZyBpdC4KKyMKK3N1YiBzdG9yZV9mb3JtdWxhIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJGZvcm11bGEgPSAkX1swXTsgICAgICAjIFRoZSBmb3JtdWxhIHRleHQgc3RyaW5nCisKKyAgICAjIFN0cmlwIHRoZSA9IHNpZ24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9ybXVsYSBzdHJpbmcKKyAgICAkZm9ybXVsYSAgICA9fiBzKF49KSgpOworCisgICAgIyBQYXJzZSB0aGUgZm9ybXVsYSB1c2luZyB0aGUgcGFyc2VyIGluIEZvcm11bGEucG0KKyAgICBteSAkcGFyc2VyICA9ICRzZWxmLT57X3BhcnNlcn07CisKKyAgICAjIEluIG9yZGVyIHRvIHJhaXNlIGZvcm11bGEgZXJyb3JzIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGNhbGxpbmcKKyAgICAjIHByb2dyYW0gd2UgdXNlIGFuIGV2YWwgYmxvY2sgYW5kIHJlLXJhaXNlIHRoZSBlcnJvciBmcm9tIGhlcmUuCisgICAgIworICAgIG15IEB0b2tlbnM7CisgICAgZXZhbCB7IEB0b2tlbnMgPSAkcGFyc2VyLT5wYXJzZV9mb3JtdWxhKCRmb3JtdWxhKSB9OworCisgICAgaWYgKCRAKSB7CisgICAgICAgICRAID1+IHMvXG4kLy87ICAjIFN0cmlwIHRoZSBcbiB1c2VkIGluIHRoZSBGb3JtdWxhLnBtIGRpZSgpCisgICAgICAgIGNyb2FrICRAOyAgICAgICAjIFJlLXJhaXNlIHRoZSBlcnJvcgorICAgIH0KKworCisgICAgIyBSZXR1cm4gdGhlIHBhcnNlZCB0b2tlbnMgaW4gYW4gYW5vbnltb3VzIGFycmF5CisgICAgcmV0dXJuIFtAdG9rZW5zXTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHJlcGVhdF9mb3JtdWxhKCRyb3csICRjb2wsICRmb3JtdWxhLCAkZm9ybWF0LCAoJHBhdHRlcm4gPT4gJHJlcGxhY2VtZW50LC4uLikpCisjCisjIFdyaXRlIGEgZm9ybXVsYSB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpIGJ5CisjIHN1YnN0aXR1dGluZyAkcGF0dGVybiAkcmVwbGFjZW1lbnQgcGFpcnMgaW4gdGhlICRmb3JtdWxhIGNyZWF0ZWQgdmlhCisjIHN0b3JlX2Zvcm11bGEoKS4gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gcmVwZXRpdGl2ZWx5IHJld3JpdGUgYSBmb3JtdWxhCisjIHdpdGhvdXQgdGhlIHNpZ25pZmljYW50IG92ZXJoZWFkIG9mIHBhcnNpbmcuCisjCisjIFJldHVybnMgIDAgOiBub3JtYWwgdGVybWluYXRpb24KKyMgICAgICAgICAtMSA6IGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzCisjICAgICAgICAgLTIgOiByb3cgb3IgY29sdW1uIG91dCBvZiByYW5nZQorIworc3ViIHJlcGVhdF9mb3JtdWxhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgIGlmIChAXyA8IDIpIHsgcmV0dXJuIC0xIH0gICAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDA2OyAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cgICAgICAgICA9IHNoaWZ0OyAgICAjIFplcm8gaW5kZXhlZCByb3cKKyAgICBteSAkY29sICAgICAgICAgPSBzaGlmdDsgICAgIyBaZXJvIGluZGV4ZWQgY29sdW1uCisgICAgbXkgJGZvcm11bGFfcmVmID0gc2hpZnQ7ICAgICMgQXJyYXkgcmVmIHdpdGggZm9ybXVsYSB0b2tlbnMKKyAgICBteSAkZm9ybWF0ICAgICAgPSBzaGlmdDsgICAgIyBYRiBmb3JtYXQKKyAgICBteSBAcGFpcnMgICAgICAgPSBAXzsgICAgICAgIyBQYXR0ZXJuL3JlcGxhY2VtZW50IHBhaXJzCisKKworICAgICMgRW5mb3JjZSBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMgaW4gdGhlIHBhdHRlcm4vcmVwbGFjZW1lbnQgbGlzdAorICAgIGNyb2FrICJPZGQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHBhdHRlcm4vcmVwbGFjZW1lbnQgbGlzdCIgaWYgQHBhaXJzICUyOworCisgICAgIyBDaGVjayB0aGF0ICRmb3JtdWxhIGlzIGFuIGFycmF5IHJlZgorICAgIGNyb2FrICJOb3QgYSB2YWxpZCBmb3JtdWxhIiBpZiByZWYgJGZvcm11bGFfcmVmIG5lICdBUlJBWSc7CisKKyAgICBteSBAdG9rZW5zICA9IEAkZm9ybXVsYV9yZWY7CisKKyAgICAjIEVuc3VyZSB0aGF0IHRoZXJlIGFyZSB0b2tlbnMgdG8gc3Vic3RpdHV0ZQorICAgIGNyb2FrICJObyB0b2tlbnMgaW4gZm9ybXVsYSIgdW5sZXNzIEB0b2tlbnM7CisKKworICAgICMgQXMgYSB0ZW1wb3JhcnkgYW5kIHVuZG9jdW1lbnRlZCBtZWFzdXJlIHdlIGFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlCisgICAgIyByZXN1bHQgb2YgdGhlIGZvcm11bGEgYnkgYXBwZW5kaW5nIGEgcmVzdWx0ID0+ICR2YWx1ZSBwYWlyIHRvIHRoZSBlbmQKKyAgICAjIG9mIHRoZSBhcmd1bWVudHMuCisgICAgbXkgJHZhbHVlID0gdW5kZWY7CisgICAgaWYgKCRwYWlyc1stMl0gZXEgJ3Jlc3VsdCcpIHsKKyAgICAgICAgJHZhbHVlID0gcG9wIEBwYWlyczsKKyAgICAgICAgICAgICAgICAgcG9wIEBwYWlyczsKKyAgICB9CisKKworICAgIHdoaWxlIChAcGFpcnMpIHsKKyAgICAgICAgbXkgJHBhdHRlcm4gPSBzaGlmdCBAcGFpcnM7CisgICAgICAgIG15ICRyZXBsYWNlID0gc2hpZnQgQHBhaXJzOworCisgICAgICAgIGZvcmVhY2ggbXkgJHRva2VuIChAdG9rZW5zKSB7CisgICAgICAgICAgICBsYXN0IGlmICR0b2tlbiA9fiBzLyRwYXR0ZXJuLyRyZXBsYWNlLzsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBDaGFuZ2UgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIGZvcm11bGEgY2FjaGVkIGJ5IHRoZSBGb3JtdWxhLnBtIG9iamVjdAorICAgIG15ICRwYXJzZXIgICAgPSAkc2VsZi0+e19wYXJzZXJ9OworICAgIG15ICRmb3JtdWxhICAgPSAkcGFyc2VyLT5wYXJzZV90b2tlbnMoQHRva2Vucyk7CisKKyAgICBjcm9hayAiVW5yZWNvZ25pc2VkIHRva2VuIGluIGZvcm11bGEiIHVubGVzcyBkZWZpbmVkICRmb3JtdWxhOworCisKKyAgICBteSAkeGYgICAgICAgID0gX1hGKCRzZWxmLCAkcm93LCAkY29sLCAkZm9ybWF0KTsgIyBUaGUgY2VsbCBmb3JtYXQKKyAgICBteSAkY2huICAgICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNdXN0IGJlIHplcm8KKyAgICBteSAkaXNfc3RyaW5nID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3JtdWxhIGV2YWx1YXRlcyB0byBzdHIKKyAgICBteSAkbnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDdXJyZW50IHZhbHVlIG9mIGZvcm11bGEKKyAgICBteSAkZ3JiaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBPcHRpb24gZmxhZ3MKKworICAgICMgRXhjZWwgbm9ybWFsbHkgc3RvcmVzIHRoZSBsYXN0IGNhbGN1bGF0ZWQgdmFsdWUgb2YgdGhlIGZvcm11bGEgaW4gJG51bS4KKyAgICAjIENsZWFybHkgd2UgYXJlIG5vdCBpbiBhIHBvc2l0aW9uIHRvIGNhbGN1bGF0ZSB0aGlzICJhIHByaW9yaSIuIEluc3RlYWQKKyAgICAjIHdlIHNldCAkbnVtIHRvIHplcm8gYW5kIHNldCB0aGUgb3B0aW9uIGZsYWdzIGluICRncmJpdCB0byBlbnN1cmUKKyAgICAjIGF1dG9tYXRpYyBjYWxjdWxhdGlvbiBvZiB0aGUgZm9ybXVsYSB3aGVuIHRoZSBmaWxlIGlzIG9wZW5lZC4KKyAgICAjIEFzIGEgd29ya2Fyb3VuZCBmb3Igc29tZSBub24tRXhjZWwgYXBwcyB3ZSBhbHNvIGFsbG93IHRoZSB1c2VyIHRvCisgICAgIyBzcGVjaWZ5IHRoZSByZXN1bHQgb2YgdGhlIGZvcm11bGEuCisgICAgIworICAgICgkbnVtLCAkZ3JiaXQsICRpc19zdHJpbmcpID0gJHNlbGYtPl9lbmNvZGVfZm9ybXVsYV9yZXN1bHQoJHZhbHVlKTsKKworICAgICMgQ2hlY2sgdGhhdCByb3cgYW5kIGNvbCBhcmUgdmFsaWQgYW5kIHN0b3JlIG1heCBhbmQgbWluIHZhbHVlcworICAgIHJldHVybiAtMiBpZiAkc2VsZi0+X2NoZWNrX2RpbWVuc2lvbnMoJHJvdywgJGNvbCk7CisKKworICAgIG15ICRmb3JtbGVuICAgPSBsZW5ndGgoJGZvcm11bGEpOyAjIExlbmd0aCBvZiB0aGUgYmluYXJ5IHN0cmluZworICAgICRsZW5ndGggICAgICAgPSAweDE2ICsgJGZvcm1sZW47ICAjIExlbmd0aCBvZiB0aGUgcmVjb3JkIGRhdGEKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2dnYiLCAgICRyb3csICRjb2wsICR4Zik7CisgICAgICAgJGRhdGEgICAgIC49ICRudW07CisgICAgICAgJGRhdGEgICAgIC49IHBhY2soInZWdiIsICAgJGdyYml0LCAkY2huLCAkZm9ybWxlbik7CisKKworICAgICMgVGhlIFNUUklORyByZWNvcmQgaWYgdGhlIGZvcm11bGEgZXZhbHVhdGVzIHRvIGEgc3RyaW5nLgorICAgIG15ICRzdHJpbmcgID0gJyc7CisgICAgICAgJHN0cmluZyAgPSAkc2VsZi0+X2dldF9mb3JtdWxhX3N0cmluZygkdmFsdWUpIGlmICRpc19zdHJpbmc7CisKKworICAgICMgU3RvcmUgdGhlIGRhdGEgb3Igd3JpdGUgaW1tZWRpYXRlbHkgZGVwZW5kaW5nIG9uIHRoZSBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgaWYgKCRzZWxmLT57X2NvbXBhdGliaWxpdHl9KSB7CisgICAgICAgICRzZWxmLT57X3RhYmxlfS0+WyRyb3ddLT5bJGNvbF0gPSAkaGVhZGVyIC4gJGRhdGEgLiAkZm9ybXVsYSAuICRzdHJpbmc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSwgJGZvcm11bGEsICRzdHJpbmcpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd3JpdGVfdXJsKCRyb3csICRjb2wsICR1cmwsICRzdHJpbmcsICRmb3JtYXQpCisjCisjIFdyaXRlIGEgaHlwZXJsaW5rLiBUaGlzIGlzIGNvbXByaXNlZCBvZiB0d28gZWxlbWVudHM6IHRoZSB2aXNpYmxlIGxhYmVsIGFuZAorIyB0aGUgaW52aXNpYmxlIGxpbmsuIFRoZSB2aXNpYmxlIGxhYmVsIGlzIHRoZSBzYW1lIGFzIHRoZSBsaW5rIHVubGVzcyBhbgorIyBhbHRlcm5hdGl2ZSBzdHJpbmcgaXMgc3BlY2lmaWVkLgorIworIyBUaGUgcGFyYW1ldGVycyAkc3RyaW5nIGFuZCAkZm9ybWF0IGFyZSBvcHRpb25hbCBhbmQgdGhlaXIgb3JkZXIgaXMKKyMgaW50ZXJjaGFuZ2VhYmxlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisjCisjIFRoZSBoeXBlcmxpbmsgY2FuIGJlIHRvIGEgaHR0cCwgZnRwLCBtYWlsLCBpbnRlcm5hbCBzaGVldCwgb3IgZXh0ZXJuYWwKKyMgZGlyZWN0b3J5IHVybC4KKyMKKyMgUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjICAgICAgICAgLTMgOiBsb25nIHN0cmluZyB0cnVuY2F0ZWQgdG8gMjU1IGNoYXJzCisjCitzdWIgd3JpdGVfdXJsIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisgICAgcmV0dXJuIC0xIGlmIEBfIDwgMzsKKworICAgICMgQWRkIHN0YXJ0IHJvdyBhbmQgY29sIHRvIGFyZyBsaXN0CisgICAgcmV0dXJuICRzZWxmLT53cml0ZV91cmxfcmFuZ2UoJF9bMF0sICRfWzFdLCBAXyk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV91cmxfcmFuZ2UoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsICR1cmwsICRzdHJpbmcsICRmb3JtYXQpCisjCisjIFRoaXMgaXMgdGhlIG1vcmUgZ2VuZXJhbCBmb3JtIG9mIHdyaXRlX3VybCgpLiBJdCBhbGxvd3MgYSBoeXBlcmxpbmsgdG8gYmUKKyMgd3JpdHRlbiB0byBhIHJhbmdlIG9mIGNlbGxzLiBUaGlzIGZ1bmN0aW9uIGFsc28gZGVjaWRlcyB0aGUgdHlwZSBvZiBoeXBlcmxpbmsKKyMgdG8gYmUgd3JpdHRlbi4gVGhlc2UgYXJlIGVpdGhlciwgV2ViIChodHRwLCBmdHAsIG1haWx0byksIEludGVybmFsCisjIChTaGVldDEhQTEpIG9yIGV4dGVybmFsICgnYzpcdGVtcFxmb28ueGxzI1NoZWV0MSFBMScpLgorIworIyBTZWUgYWxzbyB3cml0ZV91cmwoKSBhYm92ZSBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIGFuZCByZXR1cm4gdmFsdWVzLgorIworc3ViIHdyaXRlX3VybF9yYW5nZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworICAgIHJldHVybiAtMSBpZiBAXyA8IDU7CisKKworICAgICMgUmV2ZXJzZSB0aGUgb3JkZXIgb2YgJHN0cmluZyBhbmQgJGZvcm1hdCBpZiBuZWNlc3NhcnkuIFdlIHdvcmsgb24gYSBjb3B5CisgICAgIyBpbiBvcmRlciB0byBwcm90ZWN0IHRoZSBjYWxsZXJzIGFyZ3MuIFdlIGRvbid0IHVzZSAibG9jYWwgQF8iIGluIGNhc2Ugb2YKKyAgICAjIHBlcmw1MDAwNSB0aHJlYWRzLgorICAgICMKKyAgICBteSBAYXJncyA9IEBfOworCisgICAgKCRhcmdzWzVdLCAkYXJnc1s2XSkgPSAoJGFyZ3NbNl0sICRhcmdzWzVdKSBpZiByZWYgJGFyZ3NbNV07CisKKyAgICBteSAkdXJsID0gJGFyZ3NbNF07CisKKworICAgICMgQ2hlY2sgZm9yIGludGVybmFsL2V4dGVybmFsIHNoZWV0IGxpbmtzIG9yIGRlZmF1bHQgdG8gd2ViIGxpbmsKKyAgICByZXR1cm4gJHNlbGYtPl93cml0ZV91cmxfaW50ZXJuYWwoQGFyZ3MpIGlmICR1cmwgPX4gbVteaW50ZXJuYWw6XTsKKyAgICByZXR1cm4gJHNlbGYtPl93cml0ZV91cmxfZXh0ZXJuYWwoQGFyZ3MpIGlmICR1cmwgPX4gbVteZXh0ZXJuYWw6XTsKKyAgICByZXR1cm4gJHNlbGYtPl93cml0ZV91cmxfd2ViKEBhcmdzKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF93cml0ZV91cmxfd2ViKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkdXJsLCAkc3RyaW5nLCAkZm9ybWF0KQorIworIyBVc2VkIHRvIHdyaXRlIGh0dHAsIGZ0cCBhbmQgbWFpbHRvIGh5cGVybGlua3MuCisjIFRoZSBsaW5rIHR5cGUgKCRvcHRpb25zKSBpcyAweDAzIGlzIHRoZSBzYW1lIGFzIGFic29sdXRlIGRpciByZWYgd2l0aG91dAorIyBzaGVldC4gSG93ZXZlciBpdCBpcyBkaWZmZXJlbnRpYXRlZCBieSB0aGUgJHVua25vd24yIGRhdGEgc3RyZWFtLgorIworIyBTZWUgYWxzbyB3cml0ZV91cmwoKSBhYm92ZSBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIGFuZCByZXR1cm4gdmFsdWVzLgorIworc3ViIF93cml0ZV91cmxfd2ViIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAxQjg7ICAgICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAwMDsgICAgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cxICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgcm93CisgICAgbXkgJGNvbDEgICAgICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFydCBjb2x1bW4KKyAgICBteSAkcm93MiAgICAgICAgPSAkX1syXTsgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCByb3cKKyAgICBteSAkY29sMiAgICAgICAgPSAkX1szXTsgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCBjb2x1bW4KKyAgICBteSAkdXJsICAgICAgICAgPSAkX1s0XTsgICAgICAgICAgICAgICAgICAgICAgICAjIFVSTCBzdHJpbmcKKyAgICBteSAkc3RyICAgICAgICAgPSAkX1s1XTsgICAgICAgICAgICAgICAgICAgICAgICAjIEFsdGVybmF0aXZlIGxhYmVsCisgICAgbXkgJHhmICAgICAgICAgID0gJF9bNl0gfHwgJHNlbGYtPntfdXJsX2Zvcm1hdH07IyBUaGUgY2VsbCBmb3JtYXQKKworCisgICAgIyBXcml0ZSB0aGUgdmlzaWJsZSBsYWJlbCBidXQgcHJvdGVjdCBhZ2FpbnN0IHVybCByZWN1cnNpb24gaW4gd3JpdGUoKS4KKyAgICAkc3RyICAgICAgICAgICAgICAgICAgPSAkdXJsIHVubGVzcyBkZWZpbmVkICRzdHI7CisgICAgJHNlbGYtPntfd3JpdGluZ191cmx9ID0gMTsKKyAgICBteSAkZXJyb3IgICAgICAgICAgICAgPSAkc2VsZi0+d3JpdGUoJHJvdzEsICRjb2wxLCAkc3RyLCAkeGYpOworICAgICRzZWxmLT57X3dyaXRpbmdfdXJsfSA9IDA7CisgICAgcmV0dXJuICRlcnJvciAgICAgICAgIGlmICRlcnJvciA9PSAtMjsKKworCisgICAgIyBQYWNrIHRoZSB1bmRvY3VtZW50ZWQgcGFydHMgb2YgdGhlIGh5cGVybGluayBzdHJlYW0KKyAgICBteSAkdW5rbm93bjEgICAgPSBwYWNrKCJIKiIsICJEMEM5RUE3OUY5QkFDRTExOEM4MjAwQUEwMDRCQTkwQjAyMDAwMDAwIik7CisgICAgbXkgJHVua25vd24yICAgID0gcGFjaygiSCoiLCAiRTBDOUVBNzlGOUJBQ0UxMThDODIwMEFBMDA0QkE5MEIiKTsKKworCisgICAgIyBQYWNrIHRoZSBvcHRpb24gZmxhZ3MKKyAgICBteSAkb3B0aW9ucyAgICAgPSBwYWNrKCJWIiwgMHgwMyk7CisKKworICAgICMgVVJMIGVuY29kaW5nLgorICAgIG15ICRlbmNvZGluZyAgICA9IDA7CisKKyAgICAjIENvbnZlcnQgYW4gVXRmOCBVUkwgdHlwZSBhbmQgdG8gYSBudWxsIHRlcm1pbmF0ZWQgd2NoYXIgc3RyaW5nLgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICBpZiAoRW5jb2RlOjppc191dGY4KCR1cmwpKSB7CisgICAgICAgICAgICAkdXJsICAgICAgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkdXJsKTsKKyAgICAgICAgICAgICR1cmwgICAgIC49ICJcMFwwIjsgIyBVUkwgaXMgbnVsbCB0ZXJtaW5hdGVkLgorICAgICAgICAgICAgJGVuY29kaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgQ29udmVydCBhbiBBc2NpaSBVUkwgdHlwZSBhbmQgdG8gYSBudWxsIHRlcm1pbmF0ZWQgd2NoYXIgc3RyaW5nLgorICAgIGlmICgkZW5jb2RpbmcgPT0gMCkgeworICAgICAgICAkdXJsICAgICAgIC49ICJcMCI7CisgICAgICAgICR1cmwgICAgICAgID0gcGFjayAndionLCB1bnBhY2sgJ2MqJywgJHVybDsKKyAgICB9CisKKworICAgICMgUGFjayB0aGUgbGVuZ3RoIG9mIHRoZSBVUkwKKyAgICBteSAkdXJsX2xlbiAgICAgPSBwYWNrKCJWIiwgbGVuZ3RoKCR1cmwpKTsKKworCisgICAgIyBDYWxjdWxhdGUgdGhlIGRhdGEgbGVuZ3RoCisgICAgJGxlbmd0aCAgICAgICAgID0gMHgzNCArIGxlbmd0aCgkdXJsKTsKKworCisgICAgIyBQYWNrIHRoZSBoZWFkZXIgZGF0YQorICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2dnZ2IiwgJHJvdzEsICRyb3cyLCAkY29sMSwgJGNvbDIpOworCisKKyAgICAjIFdyaXRlIHRoZSBwYWNrZWQgZGF0YQorICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAkZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJHVua25vd24xLAorICAgICAgICAgICAgICAgICAgICAkb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgJHVua25vd24yLAorICAgICAgICAgICAgICAgICAgICAkdXJsX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgJHVybCk7CisKKyAgICByZXR1cm4gJGVycm9yOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX3VybF9pbnRlcm5hbCgkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMiwgJHVybCwgJHN0cmluZywgJGZvcm1hdCkKKyMKKyMgVXNlZCB0byB3cml0ZSBpbnRlcm5hbCByZWZlcmVuY2UgaHlwZXJsaW5rcyBzdWNoIGFzICJTaGVldDEhQTEiLgorIworIyBTZWUgYWxzbyB3cml0ZV91cmwoKSBhYm92ZSBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIGFuZCByZXR1cm4gdmFsdWVzLgorIworc3ViIF93cml0ZV91cmxfaW50ZXJuYWwgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDFCODsgICAgICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDAwOyAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdzEgICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFydCByb3cKKyAgICBteSAkY29sMSAgICAgICAgPSAkX1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IGNvbHVtbgorICAgIG15ICRyb3cyICAgICAgICA9ICRfWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICMgRW5kIHJvdworICAgIG15ICRjb2wyICAgICAgICA9ICRfWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICMgRW5kIGNvbHVtbgorICAgIG15ICR1cmwgICAgICAgICA9ICRfWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICMgVVJMIHN0cmluZworICAgIG15ICRzdHIgICAgICAgICA9ICRfWzVdOyAgICAgICAgICAgICAgICAgICAgICAgICMgQWx0ZXJuYXRpdmUgbGFiZWwKKyAgICBteSAkeGYgICAgICAgICAgPSAkX1s2XSB8fCAkc2VsZi0+e191cmxfZm9ybWF0fTsjIFRoZSBjZWxsIGZvcm1hdAorCisgICAgIyBTdHJpcCBVUkwgdHlwZQorICAgICR1cmwgICAgICAgICAgICA9fiBzW15pbnRlcm5hbDpdW107CisKKworICAgICMgV3JpdGUgdGhlIHZpc2libGUgbGFiZWwgYnV0IHByb3RlY3QgYWdhaW5zdCB1cmwgcmVjdXJzaW9uIGluIHdyaXRlKCkuCisgICAgJHN0ciAgICAgICAgICAgICAgICAgID0gJHVybCB1bmxlc3MgZGVmaW5lZCAkc3RyOworICAgICRzZWxmLT57X3dyaXRpbmdfdXJsfSA9IDE7CisgICAgbXkgJGVycm9yICAgICAgICAgICAgID0gJHNlbGYtPndyaXRlKCRyb3cxLCAkY29sMSwgJHN0ciwgJHhmKTsKKyAgICAkc2VsZi0+e193cml0aW5nX3VybH0gPSAwOworICAgIHJldHVybiAkZXJyb3IgICAgICAgICBpZiAkZXJyb3IgPT0gLTI7CisKKworICAgICMgUGFjayB0aGUgdW5kb2N1bWVudGVkIHBhcnRzIG9mIHRoZSBoeXBlcmxpbmsgc3RyZWFtCisgICAgbXkgJHVua25vd24xICAgID0gcGFjaygiSCoiLCAiRDBDOUVBNzlGOUJBQ0UxMThDODIwMEFBMDA0QkE5MEIwMjAwMDAwMCIpOworCisKKyAgICAjIFBhY2sgdGhlIG9wdGlvbiBmbGFncworICAgIG15ICRvcHRpb25zICAgICA9IHBhY2soIlYiLCAweDA4KTsKKworCisgICAgIyBVUkwgZW5jb2RpbmcuCisgICAgbXkgJGVuY29kaW5nICAgID0gMDsKKworCisgICAgIyBDb252ZXJ0IGFuIFV0ZjggVVJMIHR5cGUgYW5kIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIHdjaGFyIHN0cmluZy4KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7CisKKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkdXJsKSkgeworICAgICAgICAgICAgIyBRdW90ZSBzaGVldCBuYW1lIGlmIG5vdCBhbHJlYWR5LCBpLmUuLCBTaGVldCFBMSB0byAnU2hlZXQhQTEnLgorICAgICAgICAgICAgJHVybCAgICAgID1+IHMvXiguKykhLyckMSchLyBpZiBub3QgJHVybCA9fiAvXicvOworCisgICAgICAgICAgICAkdXJsICAgICAgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkdXJsKTsKKyAgICAgICAgICAgICR1cmwgICAgIC49ICJcMFwwIjsgIyBVUkwgaXMgbnVsbCB0ZXJtaW5hdGVkLgorICAgICAgICAgICAgJGVuY29kaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBDb252ZXJ0IGFuIEFzY2lpIFVSTCB0eXBlIGFuZCB0byBhIG51bGwgdGVybWluYXRlZCB3Y2hhciBzdHJpbmcuCisgICAgaWYgKCRlbmNvZGluZyA9PSAwKSB7CisgICAgICAgICR1cmwgICAgICAgLj0gIlwwIjsKKyAgICAgICAgJHVybCAgICAgICAgPSBwYWNrICd2KicsIHVucGFjayAnYyonLCAkdXJsOworICAgIH0KKworCisgICAgIyBQYWNrIHRoZSBsZW5ndGggb2YgdGhlIFVSTCBhcyBjaGFycyAobm90IHdjaGFycykKKyAgICBteSAkdXJsX2xlbiAgICAgPSBwYWNrKCJWIiwgaW50KGxlbmd0aCgkdXJsKS8yKSk7CisKKworICAgICMgQ2FsY3VsYXRlIHRoZSBkYXRhIGxlbmd0aAorICAgICRsZW5ndGggICAgICAgICA9IDB4MjQgKyBsZW5ndGgoJHVybCk7CisKKworICAgICMgUGFjayB0aGUgaGVhZGVyIGRhdGEKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidnZ2diIsICRyb3cxLCAkcm93MiwgJGNvbDEsICRjb2wyKTsKKworCisgICAgIyBXcml0ZSB0aGUgcGFja2VkIGRhdGEKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgJGRhdGEsCisgICAgICAgICAgICAgICAgICAgICR1bmtub3duMSwKKyAgICAgICAgICAgICAgICAgICAgJG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICR1cmxfbGVuLAorICAgICAgICAgICAgICAgICAgICAkdXJsKTsKKworICAgIHJldHVybiAkZXJyb3I7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfd3JpdGVfdXJsX2V4dGVybmFsKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkdXJsLCAkc3RyaW5nLCAkZm9ybWF0KQorIworIyBXcml0ZSBsaW5rcyB0byBleHRlcm5hbCBkaXJlY3RvcnkgbmFtZXMgc3VjaCBhcyAnYzpcZm9vLnhscycsCisjIGM6XGZvby54bHMjU2hlZXQxIUExJywgJy4uLy4uL2Zvby54bHMnLiBhbmQgJy4uLy4uL2Zvby54bHMjU2hlZXQxIUExJy4KKyMKKyMgTm90ZTogRXhjZWwgd3JpdGVzIHNvbWUgcmVsYXRpdmUgbGlua3Mgd2l0aCB0aGUgJGRpcl9sb25nIHN0cmluZy4gV2UgaWdub3JlCisjIHRoZXNlIGNhc2VzIGZvciB0aGUgc2FrZSBvZiBzaW1wbGVyIGNvZGUuCisjCisjIFNlZSBhbHNvIHdyaXRlX3VybCgpIGFib3ZlIGZvciBhIGdlbmVyYWwgZGVzY3JpcHRpb24gYW5kIHJldHVybiB2YWx1ZXMuCisjCitzdWIgX3dyaXRlX3VybF9leHRlcm5hbCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgIyBOZXR3b3JrIGRyaXZlcyBhcmUgZGlmZmVyZW50LiBXZSB3aWxsIGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkKKyAgICAjIE1TL05vdmVsbCBuZXR3b3JrIGRyaXZlcyBhbmQgc2hhcmVzIHN0YXJ0IHdpdGggXFwKKyAgICByZXR1cm4gJHNlbGYtPl93cml0ZV91cmxfZXh0ZXJuYWxfbmV0KEBfKSBpZiAkX1s0XSA9fiBtW15leHRlcm5hbDpcXFxcXTsKKworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMUI4OyAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwMDA7ICAgICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93MSAgICAgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IHJvdworICAgIG15ICRjb2wxICAgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgY29sdW1uCisgICAgbXkgJHJvdzIgICAgICAgID0gJF9bMl07ICAgICAgICAgICAgICAgICAgICAgICAgIyBFbmQgcm93CisgICAgbXkgJGNvbDIgICAgICAgID0gJF9bM107ICAgICAgICAgICAgICAgICAgICAgICAgIyBFbmQgY29sdW1uCisgICAgbXkgJHVybCAgICAgICAgID0gJF9bNF07ICAgICAgICAgICAgICAgICAgICAgICAgIyBVUkwgc3RyaW5nCisgICAgbXkgJHN0ciAgICAgICAgID0gJF9bNV07ICAgICAgICAgICAgICAgICAgICAgICAgIyBBbHRlcm5hdGl2ZSBsYWJlbAorICAgIG15ICR4ZiAgICAgICAgICA9ICRfWzZdIHx8ICRzZWxmLT57X3VybF9mb3JtYXR9OyMgVGhlIGNlbGwgZm9ybWF0CisKKworICAgICMgU3RyaXAgVVJMIHR5cGUgYW5kIGNoYW5nZSBVbml4IGRpciBzZXBhcmF0b3IgdG8gRG9zIHN0eWxlIChpZiBuZWVkZWQpCisgICAgIworICAgICR1cmwgICAgICAgICAgICA9fiBzW15leHRlcm5hbDpdW107CisgICAgJHVybCAgICAgICAgICAgID1+IHNbL11bXFxdZzsKKworCisgICAgIyBXcml0ZSB0aGUgdmlzaWJsZSBsYWJlbCBidXQgcHJvdGVjdCBhZ2FpbnN0IHVybCByZWN1cnNpb24gaW4gd3JpdGUoKS4KKyAgICAoJHN0ciA9ICR1cmwpICAgICAgICAgPX4gc1tcI11bIC0gXSB1bmxlc3MgZGVmaW5lZCAkc3RyOworICAgICRzZWxmLT57X3dyaXRpbmdfdXJsfSA9IDE7CisgICAgbXkgJGVycm9yICAgICAgICAgICAgID0gJHNlbGYtPndyaXRlKCRyb3cxLCAkY29sMSwgJHN0ciwgJHhmKTsKKyAgICAkc2VsZi0+e193cml0aW5nX3VybH0gPSAwOworICAgIHJldHVybiAkZXJyb3IgICAgICAgICBpZiAkZXJyb3IgPT0gLTI7CisKKworICAgICMgRGV0ZXJtaW5lIGlmIHRoZSBsaW5rIGlzIHJlbGF0aXZlIG9yIGFic29sdXRlOgorICAgICMgQWJzb2x1dGUgaWYgbGluayBzdGFydHMgd2l0aCBET1MgZHJpdmUgc3BlY2lmaWVyIGxpa2UgQzoKKyAgICAjIE90aGVyd2lzZSBkZWZhdWx0IHRvIDB4MDAgZm9yIHJlbGF0aXZlIGxpbmsuCisgICAgIworICAgIG15ICRhYnNvbHV0ZSAgICA9IDB4MDA7CisgICAgICAgJGFic29sdXRlICAgID0gMHgwMiAgaWYgJHVybCA9fiBtL15bQS1aYS16XTovOworCisKKyAgICAjIERldGVybWluZSBpZiB0aGUgbGluayBjb250YWlucyBhIHNoZWV0IHJlZmVyZW5jZSBhbmQgY2hhbmdlIHNvbWUgb2YgdGhlCisgICAgIyBwYXJhbWV0ZXJzIGFjY29yZGluZ2x5LgorICAgICMgU3BsaXQgdGhlIGRpciBuYW1lIGFuZCBzaGVldCBuYW1lIChpZiBpdCBleGlzdHMpCisgICAgIworICAgIG15ICgkZGlyX2xvbmcgLCAkc2hlZXQpID0gc3BsaXQgL1wjLywgJHVybDsKKyAgICBteSAkbGlua190eXBlICAgICAgICAgICA9IDB4MDEgfCAkYWJzb2x1dGU7CisgICAgbXkgJHNoZWV0X2xlbjsKKworICAgIGlmIChkZWZpbmVkICRzaGVldCkgeworICAgICAgICAkbGlua190eXBlIHw9IDB4MDg7CisgICAgICAgICRzaGVldF9sZW4gID0gcGFjaygiViIsIGxlbmd0aCgkc2hlZXQpICsgMHgwMSk7CisgICAgICAgICRzaGVldCAgICAgID0gam9pbigiXDAiLCBzcGxpdCgnJywgJHNoZWV0KSk7CisgICAgICAgICRzaGVldCAgICAgLj0gIlwwXDBcMCI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2hlZXRfbGVuICA9ICcnOworICAgICAgICAkc2hlZXQgICAgICA9ICcnOworICAgIH0KKworCisgICAgIyBQYWNrIHRoZSBsaW5rIHR5cGUKKyAgICAkbGlua190eXBlICAgICAgPSBwYWNrKCJWIiwgJGxpbmtfdHlwZSk7CisKKworICAgICMgQ2FsY3VsYXRlIHRoZSB1cC1sZXZlbCBkaXIgY291bnQgZS5nLiAoLi5cLi5cLi5cID09IDMpCisgICAgbXkgJHVwX2NvdW50ICAgID0gMDsKKyAgICAkdXBfY291bnQrKyAgICAgICB3aGlsZSAkZGlyX2xvbmcgPX4gc1teXC5cLlxcXVtdOworICAgICR1cF9jb3VudCAgICAgICA9IHBhY2soInYiLCAkdXBfY291bnQpOworCisKKyAgICAjIFN0b3JlIHRoZSBzaG9ydCBkb3MgZGlyIG5hbWUgKG51bGwgdGVybWluYXRlZCkKKyAgICBteSAkZGlyX3Nob3J0ICAgPSAkZGlyX2xvbmcgLiAiXDAiOworCisKKyAgICAjIFN0b3JlIHRoZSBsb25nIGRpciBuYW1lIGFzIGEgd2NoYXIgc3RyaW5nIChub24tbnVsbCB0ZXJtaW5hdGVkKQorICAgICRkaXJfbG9uZyAgICAgICA9IGpvaW4oIlwwIiwgc3BsaXQoJycsICRkaXJfbG9uZykpOworICAgICRkaXJfbG9uZyAgICAgICA9ICRkaXJfbG9uZyAuICJcMCI7CisKKworICAgICMgUGFjayB0aGUgbGVuZ3RocyBvZiB0aGUgZGlyIHN0cmluZ3MKKyAgICBteSAkZGlyX3Nob3J0X2xlbiA9IHBhY2soIlYiLCBsZW5ndGggJGRpcl9zaG9ydCAgICAgICk7CisgICAgbXkgJGRpcl9sb25nX2xlbiAgPSBwYWNrKCJWIiwgbGVuZ3RoICRkaXJfbG9uZyAgICAgICApOworICAgIG15ICRzdHJlYW1fbGVuICAgID0gcGFjaygiViIsIGxlbmd0aCgkZGlyX2xvbmcpICsgMHgwNik7CisKKworICAgICMgUGFjayB0aGUgdW5kb2N1bWVudGVkIHBhcnRzIG9mIHRoZSBoeXBlcmxpbmsgc3RyZWFtCisgICAgbXkgJHVua25vd24xID1wYWNrKCJIKiIsJ0QwQzlFQTc5RjlCQUNFMTE4QzgyMDBBQTAwNEJBOTBCMDIwMDAwMDAnICAgICAgICk7CisgICAgbXkgJHVua25vd24yID1wYWNrKCJIKiIsJzAzMDMwMDAwMDAwMDAwMDBDMDAwMDAwMDAwMDAwMDQ2JyAgICAgICAgICAgICAgICk7CisgICAgbXkgJHVua25vd24zID1wYWNrKCJIKiIsJ0ZGRkZBRERFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7CisgICAgbXkgJHVua25vd240ID1wYWNrKCJ2IiwgIDB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKworICAgICMgUGFjayB0aGUgbWFpbiBkYXRhIHN0cmVhbQorICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInZ2dnYiLCAkcm93MSwgJHJvdzIsICRjb2wxLCAkY29sMikgLgorICAgICAgICAgICAgICAgICAgICAgICR1bmtub3duMSAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICRsaW5rX3R5cGUgICAgLgorICAgICAgICAgICAgICAgICAgICAgICR1bmtub3duMiAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICR1cF9jb3VudCAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICRkaXJfc2hvcnRfbGVuLgorICAgICAgICAgICAgICAgICAgICAgICRkaXJfc2hvcnQgICAgLgorICAgICAgICAgICAgICAgICAgICAgICR1bmtub3duMyAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICRzdHJlYW1fbGVuICAgLgorICAgICAgICAgICAgICAgICAgICAgICRkaXJfbG9uZ19sZW4gLgorICAgICAgICAgICAgICAgICAgICAgICR1bmtub3duNCAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICRkaXJfbG9uZyAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICRzaGVldF9sZW4gICAgLgorICAgICAgICAgICAgICAgICAgICAgICRzaGVldCAgICAgICAgOworCisKKyAgICAjIFBhY2sgdGhlIGhlYWRlciBkYXRhCisgICAgJGxlbmd0aCAgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKworCisgICAgIyBXcml0ZSB0aGUgcGFja2VkIGRhdGEKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKyAgICByZXR1cm4gJGVycm9yOworfQorCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF93cml0ZV91cmxfZXh0ZXJuYWxfbmV0KCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkdXJsLCAkc3RyaW5nLCAkZm9ybWF0KQorIworIyBXcml0ZSBsaW5rcyB0byBleHRlcm5hbCBNUy9Ob3ZlbGwgbmV0d29yayBkcml2ZXMgYW5kIHNoYXJlcyBzdWNoIGFzCisjICcvL05FVFdPUksvc2hhcmUvZm9vLnhscycgYW5kICcvL05FVFdPUksvc2hhcmUvZm9vLnhscyNTaGVldDEhQTEnLgorIworIyBTZWUgYWxzbyB3cml0ZV91cmwoKSBhYm92ZSBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIGFuZCByZXR1cm4gdmFsdWVzLgorIworc3ViIF93cml0ZV91cmxfZXh0ZXJuYWxfbmV0IHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAxQjg7ICAgICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAwMDsgICAgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cxICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgcm93CisgICAgbXkgJGNvbDEgICAgICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFydCBjb2x1bW4KKyAgICBteSAkcm93MiAgICAgICAgPSAkX1syXTsgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCByb3cKKyAgICBteSAkY29sMiAgICAgICAgPSAkX1szXTsgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCBjb2x1bW4KKyAgICBteSAkdXJsICAgICAgICAgPSAkX1s0XTsgICAgICAgICAgICAgICAgICAgICAgICAjIFVSTCBzdHJpbmcKKyAgICBteSAkc3RyICAgICAgICAgPSAkX1s1XTsgICAgICAgICAgICAgICAgICAgICAgICAjIEFsdGVybmF0aXZlIGxhYmVsCisgICAgbXkgJHhmICAgICAgICAgID0gJF9bNl0gfHwgJHNlbGYtPntfdXJsX2Zvcm1hdH07IyBUaGUgY2VsbCBmb3JtYXQKKworCisgICAgIyBTdHJpcCBVUkwgdHlwZSBhbmQgY2hhbmdlIFVuaXggZGlyIHNlcGFyYXRvciB0byBEb3Mgc3R5bGUgKGlmIG5lZWRlZCkKKyAgICAjCisgICAgJHVybCAgICAgICAgICAgID1+IHNbXmV4dGVybmFsOl1bXTsKKyAgICAkdXJsICAgICAgICAgICAgPX4gc1svXVtcXF1nOworCisKKyAgICAjIFdyaXRlIHRoZSB2aXNpYmxlIGxhYmVsIGJ1dCBwcm90ZWN0IGFnYWluc3QgdXJsIHJlY3Vyc2lvbiBpbiB3cml0ZSgpLgorICAgICgkc3RyID0gJHVybCkgICAgICAgICA9fiBzW1wjXVsgLSBdIHVubGVzcyBkZWZpbmVkICRzdHI7CisgICAgJHNlbGYtPntfd3JpdGluZ191cmx9ID0gMTsKKyAgICBteSAkZXJyb3IgICAgICAgICAgICAgPSAkc2VsZi0+d3JpdGUoJHJvdzEsICRjb2wxLCAkc3RyLCAkeGYpOworICAgICRzZWxmLT57X3dyaXRpbmdfdXJsfSA9IDA7CisgICAgcmV0dXJuICRlcnJvciAgICAgICAgIGlmICRlcnJvciA9PSAtMjsKKworCisgICAgIyBEZXRlcm1pbmUgaWYgdGhlIGxpbmsgY29udGFpbnMgYSBzaGVldCByZWZlcmVuY2UgYW5kIGNoYW5nZSBzb21lIG9mIHRoZQorICAgICMgcGFyYW1ldGVycyBhY2NvcmRpbmdseS4KKyAgICAjIFNwbGl0IHRoZSBkaXIgbmFtZSBhbmQgc2hlZXQgbmFtZSAoaWYgaXQgZXhpc3RzKQorICAgICMKKyAgICBteSAoJGRpcl9sb25nICwgJHNoZWV0KSA9IHNwbGl0IC9cIy8sICR1cmw7CisgICAgbXkgJGxpbmtfdHlwZSAgICAgICAgICAgPSAweDAxMDM7ICMgQWx3YXlzIGFic29sdXRlCisgICAgbXkgJHNoZWV0X2xlbjsKKworICAgIGlmIChkZWZpbmVkICRzaGVldCkgeworICAgICAgICAkbGlua190eXBlIHw9IDB4MDg7CisgICAgICAgICRzaGVldF9sZW4gID0gcGFjaygiViIsIGxlbmd0aCgkc2hlZXQpICsgMHgwMSk7CisgICAgICAgICRzaGVldCAgICAgID0gam9pbigiXDAiLCBzcGxpdCgnJywgJHNoZWV0KSk7CisgICAgICAgICRzaGVldCAgICAgLj0gIlwwXDBcMCI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2hlZXRfbGVuICAgPSAnJzsKKyAgICAgICAgJHNoZWV0ICAgICAgID0gJyc7CisgICAgfQorCisgICAgIyBQYWNrIHRoZSBsaW5rIHR5cGUKKyAgICAkbGlua190eXBlICAgICAgPSBwYWNrKCJWIiwgJGxpbmtfdHlwZSk7CisKKworICAgICMgTWFrZSB0aGUgc3RyaW5nIG51bGwgdGVybWluYXRlZAorICAgICRkaXJfbG9uZyAgICAgICA9ICRkaXJfbG9uZyAuICJcMCI7CisKKworICAgICMgUGFjayB0aGUgbGVuZ3RocyBvZiB0aGUgZGlyIHN0cmluZworICAgIG15ICRkaXJfbG9uZ19sZW4gID0gcGFjaygiViIsIGxlbmd0aCAkZGlyX2xvbmcpOworCisKKyAgICAjIFN0b3JlIHRoZSBsb25nIGRpciBuYW1lIGFzIGEgd2NoYXIgc3RyaW5nIChub24tbnVsbCB0ZXJtaW5hdGVkKQorICAgICRkaXJfbG9uZyAgICAgICA9IGpvaW4oIlwwIiwgc3BsaXQoJycsICRkaXJfbG9uZykpOworICAgICRkaXJfbG9uZyAgICAgICA9ICRkaXJfbG9uZyAuICJcMCI7CisKKworICAgICMgUGFjayB0aGUgdW5kb2N1bWVudGVkIHBhcnQgb2YgdGhlIGh5cGVybGluayBzdHJlYW0KKyAgICBteSAkdW5rbm93bjEgICAgPSBwYWNrKCJIKiIsJ0QwQzlFQTc5RjlCQUNFMTE4QzgyMDBBQTAwNEJBOTBCMDIwMDAwMDAnKTsKKworCisgICAgIyBQYWNrIHRoZSBtYWluIGRhdGEgc3RyZWFtCisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidnZ2diIsICRyb3cxLCAkcm93MiwgJGNvbDEsICRjb2wyKSAuCisgICAgICAgICAgICAgICAgICAgICAgJHVua25vd24xICAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJGxpbmtfdHlwZSAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJGRpcl9sb25nX2xlbiAuCisgICAgICAgICAgICAgICAgICAgICAgJGRpcl9sb25nICAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJHNoZWV0X2xlbiAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJHNoZWV0ICAgICAgICA7CisKKworICAgICMgUGFjayB0aGUgaGVhZGVyIGRhdGEKKyAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgICRyZWNvcmQsICRsZW5ndGgpOworCisKKyAgICAjIFdyaXRlIHRoZSBwYWNrZWQgZGF0YQorICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworICAgIHJldHVybiAkZXJyb3I7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV9kYXRlX3RpbWUgKCRyb3csICRjb2wsICRzdHJpbmcsICRmb3JtYXQpCisjCisjIFdyaXRlIGEgZGF0ZXRpbWUgc3RyaW5nIGluIElTTzg2MDEgInl5eXktbW0tZGRUaGg6bW06c3Muc3MiIGZvcm1hdCBhcyBhCisjIG51bWJlciByZXByZXNlbnRpbmcgYW4gRXhjZWwgZGF0ZS4gJGZvcm1hdCBpcyBvcHRpb25hbC4KKyMKKyMgUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjICAgICAgICAgLTMgOiBJbnZhbGlkIGRhdGVfdGltZSwgd3JpdHRlbiBhcyBzdHJpbmcKKyMKK3N1YiB3cml0ZV9kYXRlX3RpbWUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgaWYgKEBfIDwgMykgeyByZXR1cm4gLTEgfSAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisKKyAgICBteSAkcm93ICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBaZXJvIGluZGV4ZWQgcm93CisgICAgbXkgJGNvbCAgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgWmVybyBpbmRleGVkIGNvbHVtbgorICAgIG15ICRzdHIgICAgICAgPSAkX1syXTsKKworCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAkY29sKTsKKworICAgIG15ICRlcnJvciAgICAgPSAwOworICAgIG15ICRkYXRlX3RpbWUgPSAkc2VsZi0+Y29udmVydF9kYXRlX3RpbWUoJHN0cik7CisKKyAgICBpZiAoZGVmaW5lZCAkZGF0ZV90aW1lKSB7CisgICAgICAgICRlcnJvciA9ICRzZWxmLT53cml0ZV9udW1iZXIoJHJvdywgJGNvbCwgJGRhdGVfdGltZSwgJF9bM10pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBUaGUgZGF0ZSBpc24ndCB2YWxpZCBzbyB3cml0ZSBpdCBhcyBhIHN0cmluZy4KKyAgICAgICAgJHNlbGYtPndyaXRlX3N0cmluZygkcm93LCAkY29sLCAkc3RyLCAkX1szXSk7CisgICAgICAgICRlcnJvciA9IC0zOworICAgIH0KKyAgICByZXR1cm4gJGVycm9yOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjb252ZXJ0X2RhdGVfdGltZSgkZGF0ZV90aW1lX3N0cmluZykKKyMKKyMgVGhlIGZ1bmN0aW9uIHRha2VzIGEgZGF0ZSBhbmQgdGltZSBpbiBJU084NjAxICJ5eXl5LW1tLWRkVGhoOm1tOnNzLnNzIiBmb3JtYXQKKyMgYW5kIGNvbnZlcnRzIGl0IHRvIGEgZGVjaW1hbCBudW1iZXIgcmVwcmVzZW50aW5nIGEgdmFsaWQgRXhjZWwgZGF0ZS4KKyMKKyMgRGF0ZXMgYW5kIHRpbWVzIGluIEV4Y2VsIGFyZSByZXByZXNlbnRlZCBieSByZWFsIG51bWJlcnMuIFRoZSBpbnRlZ2VyIHBhcnQgb2YKKyMgdGhlIG51bWJlciBzdG9yZXMgdGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBlcG9jaCBhbmQgdGhlIGZyYWN0aW9uYWwgcGFydAorIyBzdG9yZXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGRheSBpbiBzZWNvbmRzLiBUaGUgZXBvY2ggY2FuIGJlIGVpdGhlciAxOTAwIG9yCisjIDE5MDQuCisjCisjIFBhcmFtZXRlcjogRGF0ZSBhbmQgdGltZSBzdHJpbmcgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoKKyMgICAgICAgICAgICAgICB5eXl5LW1tLWRkVGhoOm1tOnNzLnNzICAjIFN0YW5kYXJkCisjICAgICAgICAgICAgICAgeXl5eS1tbS1kZFQgICAgICAgICAgICAgIyBEYXRlIG9ubHkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgVGhoOm1tOnNzLnNzICAjIFRpbWUgb25seQorIworIyBSZXR1cm5zOgorIyAgICAgICAgICAgIEEgZGVjaW1hbCBudW1iZXIgcmVwcmVzZW50aW5nIGEgdmFsaWQgRXhjZWwgZGF0ZSwgb3IKKyMgICAgICAgICAgICB1bmRlZiBpZiB0aGUgZGF0ZSBpcyBpbnZhbGlkLgorIworc3ViIGNvbnZlcnRfZGF0ZV90aW1lIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKyAgICBteSAkZGF0ZV90aW1lID0gJF9bMF07CisKKyAgICBteSAkZGF5cyAgICAgID0gMDsgIyBOdW1iZXIgb2YgZGF5cyBzaW5jZSBlcG9jaAorICAgIG15ICRzZWNvbmRzICAgPSAwOyAjIFRpbWUgZXhwcmVzc2VkIGFzIGZyYWN0aW9uIG9mIDI0aCBob3VycyBpbiBzZWNvbmRzCisKKyAgICBteSAoJHllYXIsICRtb250aCwgJGRheSk7CisgICAgbXkgKCRob3VyLCAkbWluLCAkc2VjKTsKKworCisgICAgIyBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICRkYXRlX3RpbWUgPX4gcy9eXHMrLy87CisgICAgJGRhdGVfdGltZSA9fiBzL1xzKyQvLzsKKworICAgICMgQ2hlY2sgZm9yIGludmFsaWQgZGF0ZSBjaGFyLgorICAgIHJldHVybiBpZiAgICAgJGRhdGVfdGltZSA9fiAvW14wLTlUOlwtXC5aXS87CisKKyAgICAjIENoZWNrIGZvciAiVCIgYWZ0ZXIgZGF0ZSBvciBiZWZvcmUgdGltZS4KKyAgICByZXR1cm4gdW5sZXNzICRkYXRlX3RpbWUgPX4gL1xkVHxUXGQvOworCisgICAgIyBTdHJpcCB0cmFpbGluZyBaIGluIElTTzg2MDEgZGF0ZS4KKyAgICAkZGF0ZV90aW1lID1+IHMvWiQvLzsKKworCisgICAgIyBTcGxpdCBpbnRvIGRhdGUgYW5kIHRpbWUuCisgICAgbXkgKCRkYXRlLCAkdGltZSkgPSBzcGxpdCAvVC8sICRkYXRlX3RpbWU7CisKKworICAgICMgV2UgYWxsb3cgdGhlIHRpbWUgcG9ydGlvbiBvZiB0aGUgaW5wdXQgRGF0ZVRpbWUgdG8gYmUgb3B0aW9uYWwuCisgICAgaWYgKCR0aW1lIG5lICcnKSB7CisgICAgICAgICMgTWF0Y2ggaGg6bW06c3Muc3NzKyB3aGVyZSB0aGUgc2Vjb25kcyBhcmUgb3B0aW9uYWwKKyAgICAgICAgaWYgKCR0aW1lID1+IC9eKFxkXGQpOihcZFxkKSg6KFxkXGQoXC5cZCspPykpPy8pIHsKKyAgICAgICAgICAgICRob3VyICAgPSAkMTsKKyAgICAgICAgICAgICRtaW4gICAgPSAkMjsKKyAgICAgICAgICAgICRzZWMgICAgPSAkNCB8fCAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHVuZGVmOyAjIE5vdCBhIHZhbGlkIHRpbWUgZm9ybWF0LgorICAgICAgICB9CisKKyAgICAgICAgIyBTb21lIGJvdW5kYXJ5IGNoZWNrcworICAgICAgICByZXR1cm4gaWYgJGhvdXIgPj0gMjQ7CisgICAgICAgIHJldHVybiBpZiAkbWluICA+PSA2MDsKKyAgICAgICAgcmV0dXJuIGlmICRzZWMgID49IDYwOworCisgICAgICAgICMgRXhjZWwgZXhwcmVzc2VzIHNlY29uZHMgYXMgYSBmcmFjdGlvbiBvZiB0aGUgbnVtYmVyIGluIDI0IGhvdXJzLgorICAgICAgICAkc2Vjb25kcyA9ICgkaG91ciAqNjAqNjAgKyAkbWluICo2MCArICRzZWMpIC8gKDI0ICo2MCAqNjApOworICAgIH0KKworCisgICAgIyBXZSBhbGxvdyB0aGUgZGF0ZSBwb3J0aW9uIG9mIHRoZSBpbnB1dCBEYXRlVGltZSB0byBiZSBvcHRpb25hbC4KKyAgICByZXR1cm4gJHNlY29uZHMgaWYgJGRhdGUgZXEgJyc7CisKKworICAgICMgTWF0Y2ggZGF0ZSBhcyB5eXl5LW1tLWRkLgorICAgIGlmICgkZGF0ZSA9fiAvXihcZFxkXGRcZCktKFxkXGQpLShcZFxkKSQvKSB7CisgICAgICAgICR5ZWFyICAgPSAkMTsKKyAgICAgICAgJG1vbnRoICA9ICQyOworICAgICAgICAkZGF5ICAgID0gJDM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gdW5kZWY7ICMgTm90IGEgdmFsaWQgZGF0ZSBmb3JtYXQuCisgICAgfQorCisgICAgIyBTZXQgdGhlIGVwb2NoIGFzIDE5MDAgb3IgMTkwNC4gRGVmYXVsdHMgdG8gMTkwMC4KKyAgICBteSAkZGF0ZV8xOTA0ID0gJHNlbGYtPntfMTkwNH07CisKKworICAgICMgU3BlY2lhbCBjYXNlcyBmb3IgRXhjZWwuCisgICAgaWYgKG5vdCAkZGF0ZV8xOTA0KSB7CisgICAgICAgIHJldHVybiAgICAgICRzZWNvbmRzIGlmICRkYXRlIGVxICcxODk5LTEyLTMxJzsgIyBFeGNlbCAxOTAwIGVwb2NoCisgICAgICAgIHJldHVybiAgICAgICRzZWNvbmRzIGlmICRkYXRlIGVxICcxOTAwLTAxLTAwJzsgIyBFeGNlbCAxOTAwIGVwb2NoCisgICAgICAgIHJldHVybiA2MCArICRzZWNvbmRzIGlmICRkYXRlIGVxICcxOTAwLTAyLTI5JzsgIyBFeGNlbCBmYWxzZSBsZWFwZGF5CisgICAgfQorCisKKyAgICAjIFdlIGNhbGN1bGF0ZSB0aGUgZGF0ZSBieSBjYWxjdWxhdGluZyB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGVwb2NoCisgICAgIyBhbmQgYWRqdXN0IGZvciB0aGUgbnVtYmVyIG9mIGxlYXAgZGF5cy4gV2UgY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgbGVhcAorICAgICMgZGF5cyBieSBub3JtYWxpc2luZyB0aGUgeWVhciBpbiByZWxhdGlvbiB0byB0aGUgZXBvY2guIFRodXMgdGhlIHllYXIgMjAwMAorICAgICMgYmVjb21lcyAxMDAgZm9yIDQgYW5kIDEwMCB5ZWFyIGxlYXBkYXlzIGFuZCA0MDAgZm9yIDQwMCB5ZWFyIGxlYXBkYXlzLgorICAgICMKKyAgICBteSAkZXBvY2ggICA9ICRkYXRlXzE5MDQgPyAxOTA0IDogMTkwMDsKKyAgICBteSAkb2Zmc2V0ICA9ICRkYXRlXzE5MDQgPyAgICA0IDogICAgMDsKKyAgICBteSAkbm9ybSAgICA9IDMwMDsKKyAgICBteSAkcmFuZ2UgICA9ICR5ZWFyIC0kZXBvY2g7CisKKworICAgICMgU2V0IG1vbnRoIGRheXMgYW5kIGNoZWNrIGZvciBsZWFwIHllYXIuCisgICAgbXkgQG1kYXlzICAgPSAoMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMSk7CisgICAgbXkgJGxlYXAgICAgPSAwOworICAgICAgICRsZWFwICAgID0gMSAgaWYgJHllYXIgJSA0ID09IDAgYW5kICR5ZWFyICUgMTAwIG9yICR5ZWFyICUgNDAwID09IDA7CisgICAgJG1kYXlzWzFdICAgPSAyOSBpZiAkbGVhcDsKKworCisgICAgIyBTb21lIGJvdW5kYXJ5IGNoZWNrcworICAgIHJldHVybiBpZiAkeWVhciAgPCAkZXBvY2ggb3IgJHllYXIgID4gOTk5OTsKKyAgICByZXR1cm4gaWYgJG1vbnRoIDwgMSAgICAgIG9yICRtb250aCA+IDEyOworICAgIHJldHVybiBpZiAkZGF5ICAgPCAxICAgICAgb3IgJGRheSAgID4gJG1kYXlzWyRtb250aCAtMV07CisKKyAgICAjIEFjY3VtdWxhdGUgdGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAkZGF5cyAgPSAkZGF5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWRkIGRheXMgZm9yIGN1cnJlbnQgbW9udGgKKyAgICAkZGF5cyArPSAkbWRheXNbJF9dIGZvciAwIC4uICRtb250aCAtMjsgICAgICMgQWRkIGRheXMgZm9yIHBhc3QgbW9udGhzCisgICAgJGRheXMgKz0gJHJhbmdlICozNjU7ICAgICAgICAgICAgICAgICAgICAgICAjIEFkZCBkYXlzIGZvciBwYXN0IHllYXJzCisgICAgJGRheXMgKz0gaW50KCgkcmFuZ2UpICAgICAgICAgICAgICAgIC8gIDQpOyAjIEFkZCBsZWFwZGF5cworICAgICRkYXlzIC09IGludCgoJHJhbmdlICskb2Zmc2V0KSAgICAgICAvMTAwKTsgIyBTdWJ0cmFjdCAxMDAgeWVhciBsZWFwZGF5cworICAgICRkYXlzICs9IGludCgoJHJhbmdlICskb2Zmc2V0ICskbm9ybSkvNDAwKTsgIyBBZGQgNDAwIHllYXIgbGVhcGRheXMKKyAgICAkZGF5cyAtPSAkbGVhcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWxyZWFkeSBjb3VudGVkIGFib3ZlCisKKworICAgICMgQWRqdXN0IGZvciBFeGNlbCBlcnJvbmVvdXNseSB0cmVhdGluZyAxOTAwIGFzIGEgbGVhcCB5ZWFyLgorICAgICRkYXlzKysgaWYgJGRhdGVfMTkwNCA9PSAwIGFuZCAkZGF5cyA+IDU5OworCisgICAgcmV0dXJuICRkYXlzICsgJHNlY29uZHM7Cit9CisKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfcm93KCRyb3csICRoZWlnaHQsICRYRiwgJGhpZGRlbiwgJGxldmVsKQorIworIyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgaGVpZ2h0IGFuZCBYRiBmb3JtYXQgZm9yIGEgcm93LgorIyBXcml0ZXMgdGhlICBCSUZGIHJlY29yZCBST1cuCisjCitzdWIgc2V0X3JvdyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAyMDg7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAxMDsgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cgICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAjIFJvdyBOdW1iZXIKKyAgICBteSAkY29sTWljICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgIyBGaXJzdCBkZWZpbmVkIGNvbHVtbgorICAgIG15ICRjb2xNYWMgICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAjIExhc3QgZGVmaW5lZCBjb2x1bW4KKyAgICBteSAkbWl5Unc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSb3cgaGVpZ2h0CisgICAgbXkgJGlyd01hYyAgICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICMgVXNlZCBieSBFeGNlbCB0byBvcHRpbWlzZSBsb2FkaW5nCisgICAgbXkgJHJlc2VydmVkICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICMgUmVzZXJ2ZWQKKyAgICBteSAkZ3JiaXQgICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkaXhmZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYRiBpbmRleAorICAgIG15ICRoZWlnaHQgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAjIEZvcm1hdCBvYmplY3QKKyAgICBteSAkZm9ybWF0ICAgICAgPSAkX1syXTsgICAgICAgICAgICAgICAgIyBGb3JtYXQgb2JqZWN0CisgICAgbXkgJGhpZGRlbiAgICAgID0gJF9bM10gfHwgMDsgICAgICAgICAgICMgSGlkZGVuIGZsYWcKKyAgICBteSAkbGV2ZWwgICAgICAgPSAkX1s0XSB8fCAwOyAgICAgICAgICAgIyBPdXRsaW5lIGxldmVsCisgICAgbXkgJGNvbGxhcHNlZCAgID0gJF9bNV0gfHwgMDsgICAgICAgICAgICMgQ29sbGFwc2VkIHJvdworCisKKyAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJHJvdzsgICMgRW5zdXJlIGF0IGxlYXN0ICRyb3cgaXMgc3BlY2lmaWVkLgorCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAwLCAwLCAxKTsKKworICAgICMgQ2hlY2sgZm9yIGEgZm9ybWF0IG9iamVjdAorICAgIGlmIChyZWYgJGZvcm1hdCkgeworICAgICAgICAkaXhmZSA9ICRmb3JtYXQtPmdldF94Zl9pbmRleCgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGl4ZmUgPSAweDBGOworICAgIH0KKworCisgICAgIyBTZXQgdGhlIHJvdyBoZWlnaHQgaW4gdW5pdHMgb2YgMS8yMCBvZiBhIHBvaW50LiBOb3RlLCBzb21lIGhlaWdodHMgbWF5CisgICAgIyBub3QgYmUgb2J0YWluZWQgZXhhY3RseSBkdWUgdG8gcm91bmRpbmcgaW4gRXhjZWwuCisgICAgIworICAgIGlmIChkZWZpbmVkICRoZWlnaHQpIHsKKyAgICAgICAgJG1peVJ3ID0gJGhlaWdodCAqMjA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkbWl5UncgPSAweGZmOyAjIFRoZSBkZWZhdWx0IHJvdyBoZWlnaHQKKyAgICAgICAgJGhlaWdodCA9IDA7CisgICAgfQorCisKKyAgICAjIFNldCB0aGUgbGltaXRzIGZvciB0aGUgb3V0bGluZSBsZXZlbHMgKDAgPD0geCA8PSA3KS4KKyAgICAkbGV2ZWwgPSAwIGlmICRsZXZlbCA8IDA7CisgICAgJGxldmVsID0gNyBpZiAkbGV2ZWwgPiA3OworCisgICAgJHNlbGYtPntfb3V0bGluZV9yb3dfbGV2ZWx9ID0gJGxldmVsIGlmICRsZXZlbCA+JHNlbGYtPntfb3V0bGluZV9yb3dfbGV2ZWx9OworCisKKyAgICAjIFNldCB0aGUgb3B0aW9ucyBmbGFncy4KKyAgICAjIDB4MTA6IFRoZSBmQ29sbGFwc2VkIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdyBjb250YWlucyB0aGUgIisiCisgICAgIyAgICAgICB3aGVuIGFuIG91dGxpbmUgZ3JvdXAgaXMgY29sbGFwc2VkLgorICAgICMgMHgyMDogVGhlIGZEeVplcm8gaGVpZ2h0IGZsYWcgaW5kaWNhdGVzIGEgY29sbGFwc2VkIG9yIGhpZGRlbiByb3cuCisgICAgIyAweDQwOiBUaGUgZlVuc3luY2VkIGZsYWcgaXMgdXNlZCB0byBzaG93IHRoYXQgdGhlIGZvbnQgYW5kIHJvdyBoZWlnaHRzCisgICAgIyAgICAgICBhcmUgbm90IGNvbXBhdGlibGUuIFRoaXMgaXMgdXN1YWxseSB0aGUgY2FzZSBmb3IgV3JpdGVFeGNlbC4KKyAgICAjIDB4ODA6IFRoZSBmR2hvc3REaXJ0eSBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSByb3cgaGFzIGJlZW4gZm9ybWF0dGVkLgorICAgICMKKyAgICAkZ3JiaXQgfD0gJGxldmVsOworICAgICRncmJpdCB8PSAweDAwMTAgaWYgJGNvbGxhcHNlZDsKKyAgICAkZ3JiaXQgfD0gMHgwMDIwIGlmICRoaWRkZW47CisgICAgJGdyYml0IHw9IDB4MDA0MDsKKyAgICAkZ3JiaXQgfD0gMHgwMDgwIGlmICRmb3JtYXQ7CisgICAgJGdyYml0IHw9IDB4MDEwMDsKKworCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJ2dnZ2dnZ2diIsICRyb3csICRjb2xNaWMsICRjb2xNYWMsICRtaXlSdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpcndNYWMsJHJlc2VydmVkLCAkZ3JiaXQsICRpeGZlKTsKKworCisgICAgIyBTdG9yZSB0aGUgZGF0YSBvciB3cml0ZSBpbW1lZGlhdGVseSBkZXBlbmRpbmcgb24gdGhlIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICBpZiAoJHNlbGYtPntfY29tcGF0aWJpbGl0eX0pIHsKKyAgICAgICAgJHNlbGYtPntfcm93X2RhdGF9LT57JF9bMF19ID0gJGhlYWRlciAuICRkYXRhOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworICAgIH0KKworCisgICAgIyBTdG9yZSB0aGUgcm93IHNpemVzIGZvciB1c2Ugd2hlbiBjYWxjdWxhdGluZyBpbWFnZSB2ZXJ0aWNlcy4KKyAgICAjIEFsc28gc3RvcmUgdGhlIGNvbHVtbiBmb3JtYXRzLgorICAgICRzZWxmLT57X3Jvd19zaXplc30tPnskX1swXX0gICA9ICRoZWlnaHQ7CisgICAgJHNlbGYtPntfcm93X2Zvcm1hdHN9LT57JF9bMF19ID0gJGZvcm1hdCBpZiBkZWZpbmVkICRmb3JtYXQ7Cit9CisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF93cml0ZV9yb3dfZGVmYXVsdCgpCisjCisjIFdyaXRlIGEgZGVmYXVsdCByb3cgcmVjb3JkLCBpbiBjb21wYXRpYmlsaXR5IG1vZGUsIGZvciByb3dzIHRoYXQgZG9uJ3QgaGF2ZQorIyB1c2VyIHNwZWNpZmllZCB2YWx1ZXMuLgorIworc3ViIF93cml0ZV9yb3dfZGVmYXVsdCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAyMDg7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAxMDsgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cgICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAjIFJvdyBOdW1iZXIKKyAgICBteSAkY29sTWljICAgICAgPSAkX1sxXTsgICAgICAgICAgICAgICAgIyBGaXJzdCBkZWZpbmVkIGNvbHVtbgorICAgIG15ICRjb2xNYWMgICAgICA9ICRfWzJdOyAgICAgICAgICAgICAgICAjIExhc3QgZGVmaW5lZCBjb2x1bW4KKyAgICBteSAkbWl5UncgICAgICAgPSAweEZGOyAgICAgICAgICAgICAgICAgIyBSb3cgaGVpZ2h0CisgICAgbXkgJGlyd01hYyAgICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICMgVXNlZCBieSBFeGNlbCB0byBvcHRpbWlzZSBsb2FkaW5nCisgICAgbXkgJHJlc2VydmVkICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICMgUmVzZXJ2ZWQKKyAgICBteSAkZ3JiaXQgICAgICAgPSAweDAxMDA7ICAgICAgICAgICAgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkaXhmZSAgICAgICAgPSAweDBGOyAgICAgICAgICAgICAgICAgIyBYRiBpbmRleAorCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJ2dnZ2dnZ2diIsICRyb3csICRjb2xNaWMsICRjb2xNYWMsICRtaXlSdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpcndNYWMsJHJlc2VydmVkLCAkZ3JiaXQsICRpeGZlKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jaGVja19kaW1lbnNpb25zKCRyb3csICRjb2wsICRpZ25vcmVfcm93LCAkaWdub3JlX2NvbCkKKyMKKyMgQ2hlY2sgdGhhdCAkcm93IGFuZCAkY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzIGZvciB1c2UgaW4KKyMgRElNRU5TSU9OUyByZWNvcmQuIFNlZSwgX3N0b3JlX2RpbWVuc2lvbnMoKS4KKyMKKyMgVGhlICRpZ25vcmVfcm93LyRpZ25vcmVfY29sIGZsYWdzIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB3ZSB3aXNoIHRvCisjIHBlcmZvcm0gdGhlIGRpbWVuc2lvbiBjaGVjayB3aXRob3V0IHN0b3JpbmcgdGhlIHZhbHVlLgorIworIyBUaGUgaWdub3JlIGZsYWdzIGFyZSB1c2UgYnkgc2V0X3JvdygpIGFuZCBkYXRhX3ZhbGlkYXRlLgorIworc3ViIF9jaGVja19kaW1lbnNpb25zIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRyb3cgICAgICAgICA9ICRfWzBdOworICAgIG15ICRjb2wgICAgICAgICA9ICRfWzFdOworICAgIG15ICRpZ25vcmVfcm93ICA9ICRfWzJdOworICAgIG15ICRpZ25vcmVfY29sICA9ICRfWzNdOworCisKKyAgICByZXR1cm4gLTIgaWYgbm90IGRlZmluZWQgJHJvdzsKKyAgICByZXR1cm4gLTIgaWYgJHJvdyA+PSAkc2VsZi0+e194bHNfcm93bWF4fTsKKworICAgIHJldHVybiAtMiBpZiBub3QgZGVmaW5lZCAkY29sOworICAgIHJldHVybiAtMiBpZiAkY29sID49ICRzZWxmLT57X3hsc19jb2xtYXh9OworCisKKyAgICBpZiAobm90ICRpZ25vcmVfcm93KSB7CisKKyAgICAgICAgaWYgKG5vdCBkZWZpbmVkICRzZWxmLT57X2RpbV9yb3dtaW59IG9yICRyb3cgPCAkc2VsZi0+e19kaW1fcm93bWlufSkgeworICAgICAgICAgICAgJHNlbGYtPntfZGltX3Jvd21pbn0gPSAkcm93OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5vdCBkZWZpbmVkICRzZWxmLT57X2RpbV9yb3dtYXh9IG9yICRyb3cgPiAkc2VsZi0+e19kaW1fcm93bWF4fSkgeworICAgICAgICAgICAgJHNlbGYtPntfZGltX3Jvd21heH0gPSAkcm93OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5vdCAkaWdub3JlX2NvbCkgeworCisgICAgICAgIGlmIChub3QgZGVmaW5lZCAkc2VsZi0+e19kaW1fY29sbWlufSBvciAkY29sIDwgJHNlbGYtPntfZGltX2NvbG1pbn0pIHsKKyAgICAgICAgICAgICRzZWxmLT57X2RpbV9jb2xtaW59ID0gJGNvbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChub3QgZGVmaW5lZCAkc2VsZi0+e19kaW1fY29sbWF4fSBvciAkY29sID4gJHNlbGYtPntfZGltX2NvbG1heH0pIHsKKyAgICAgICAgICAgICRzZWxmLT57X2RpbV9jb2xtYXh9ID0gJGNvbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2RpbWVuc2lvbnMoKQorIworIyBXcml0ZXMgRXhjZWwgRElNRU5TSU9OUyB0byBkZWZpbmUgdGhlIGFyZWEgaW4gd2hpY2ggdGhlcmUgaXMgY2VsbCBkYXRhLgorIworIyBOb3RlczoKKyMgICBFeGNlbCBzdG9yZXMgdGhlIG1heCByb3cvY29sIGFzIHJvdy9jb2wgKzEuCisjICAgTWF4IGFuZCBtaW4gdmFsdWVzIG9mIDAgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBjZWxsIGRhdGEuCisjICAgV2Ugc2V0IHRoZSB1bmRlZiBtZW1iZXIgZGF0YSB0byAwIHNpbmNlIGl0IGlzIHVzZWQgYnkgX3N0b3JlX3RhYmxlKCkuCisjICAgSW5zZXJ0aW5nIGltYWdlcyBvciBjaGFydHMgZG9lc24ndCBjaGFuZ2UgdGhlIERJTUVOU0lPTiBkYXRhLgorIworc3ViIF9zdG9yZV9kaW1lbnNpb25zIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgID0gMHgwMjAwOyAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDBFOyAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRyb3dfbWluOyAgICAgICAgICAgICAgICAgICAgIyBGaXJzdCByb3cKKyAgICBteSAkcm93X21heDsgICAgICAgICAgICAgICAgICAgICMgTGFzdCByb3cgcGx1cyAxCisgICAgbXkgJGNvbF9taW47ICAgICAgICAgICAgICAgICAgICAjIEZpcnN0IGNvbHVtbgorICAgIG15ICRjb2xfbWF4OyAgICAgICAgICAgICAgICAgICAgIyBMYXN0IGNvbHVtbiBwbHVzIDEKKyAgICBteSAkcmVzZXJ2ZWQgID0gMHgwMDAwOyAgICAgICAgICMgUmVzZXJ2ZWQgYnkgRXhjZWwKKworICAgIGlmIChkZWZpbmVkICRzZWxmLT57X2RpbV9yb3dtaW59KSB7JHJvd19taW4gPSAkc2VsZi0+e19kaW1fcm93bWlufSAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHskcm93X21pbiA9IDAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGlmIChkZWZpbmVkICRzZWxmLT57X2RpbV9yb3dtYXh9KSB7JHJvd19tYXggPSAkc2VsZi0+e19kaW1fcm93bWF4fSArIDF9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHskcm93X21heCA9IDAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGlmIChkZWZpbmVkICRzZWxmLT57X2RpbV9jb2xtaW59KSB7JGNvbF9taW4gPSAkc2VsZi0+e19kaW1fY29sbWlufSAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHskY29sX21pbiA9IDAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGlmIChkZWZpbmVkICRzZWxmLT57X2RpbV9jb2xtYXh9KSB7JGNvbF9tYXggPSAkc2VsZi0+e19kaW1fY29sbWF4fSArIDF9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHskY29sX21heCA9IDAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgIyBTZXQgbWVtYmVyIGRhdGEgdG8gdGhlIG5ldyBtYXgvbWluIHZhbHVlIGZvciB1c2UgYnkgX3N0b3JlX3RhYmxlKCkuCisgICAgJHNlbGYtPntfZGltX3Jvd21pbn0gPSAkcm93X21pbjsKKyAgICAkc2VsZi0+e19kaW1fcm93bWF4fSA9ICRyb3dfbWF4OworICAgICRzZWxmLT57X2RpbV9jb2xtaW59ID0gJGNvbF9taW47CisgICAgJHNlbGYtPntfZGltX2NvbG1heH0gPSAkY29sX21heDsKKworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soIlZWdnZ2IiwgJHJvd19taW4sICRyb3dfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xfbWluLCAkY29sX21heCwgJHJlc2VydmVkKTsKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3dpbmRvdzIoKQorIworIyBXcml0ZSBCSUZGIHJlY29yZCBXaW5kb3cyLgorIworc3ViIF9zdG9yZV93aW5kb3cyIHsKKworICAgIHVzZSBpbnRlZ2VyOyAgICAjIEF2b2lkIDw8IHNoaWZ0IGJ1ZyBpbiBQZXJsIDUuNi4wIG9uIEhQLVVYCisKKyAgICBteSAkc2VsZiAgICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgICAgICAgPSAweDAyM0U7ICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgID0gMHgwMDEyOyAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZ3JiaXQgICAgICAgICAgPSAweDAwQjY7ICAgICAjIE9wdGlvbiBmbGFncworICAgIG15ICRyd1RvcCAgICAgICAgICA9ICRzZWxmLT57X2ZpcnN0X3Jvd307ICAgIyBUb3AgdmlzaWJsZSByb3cKKyAgICBteSAkY29sTGVmdCAgICAgICAgPSAkc2VsZi0+e19maXJzdF9jb2x9OyAgICMgTGVmdG1vc3QgdmlzaWJsZSBjb2x1bW4KKyAgICBteSAkcmdiSGRyICAgICAgICAgPSAweDAwMDAwMDQwOyAgICAgICAgICAgICMgUm93L2NvbCBoZWFkaW5nLCBncmlkIGNvbG9yCisKKyAgICBteSAkd1NjYWxlU0xWICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgICMgWm9vbSBpbiBwYWdlIGJyZWFrIHByZXZpZXcKKyAgICBteSAkd1NjYWxlTm9ybWFsICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgICMgWm9vbSBpbiBub3JtYWwgdmlldworICAgIG15ICRyZXNlcnZlZCAgICAgICA9IDB4MDAwMDAwMDA7CisKKworICAgICMgVGhlIG9wdGlvbnMgZmxhZ3MgdGhhdCBjb21wcmlzZSAkZ3JiaXQKKyAgICBteSAkZkRzcEZtbGEgICAgICAgPSAkc2VsZi0+e19kaXNwbGF5X2Zvcm11bGFzfTsgIyAwIC0gYml0CisgICAgbXkgJGZEc3BHcmlkICAgICAgID0gJHNlbGYtPntfc2NyZWVuX2dyaWRsaW5lc307ICMgMQorICAgIG15ICRmRHNwUndDb2wgICAgICA9ICRzZWxmLT57X2Rpc3BsYXlfaGVhZGVyc307ICAjIDIKKyAgICBteSAkZkZyb3plbiAgICAgICAgPSAkc2VsZi0+e19mcm96ZW59OyAgICAgICAgICAgIyAzCisgICAgbXkgJGZEc3BaZXJvcyAgICAgID0gJHNlbGYtPntfZGlzcGxheV96ZXJvc307ICAgICMgNAorICAgIG15ICRmRGVmYXVsdEhkciAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAjIDUKKyAgICBteSAkZkFyYWJpYyAgICAgICAgPSAkc2VsZi0+e19kaXNwbGF5X2FyYWJpY307ICAgIyA2CisgICAgbXkgJGZEc3BHdXRzICAgICAgID0gJHNlbGYtPntfb3V0bGluZV9vbn07ICAgICAgICMgNworICAgIG15ICRmRnJvemVuTm9TcGxpdCA9ICRzZWxmLT57X2Zyb3plbl9ub19zcGxpdH07ICAjIDAgLSBiaXQKKyAgICBteSAkZlNlbGVjdGVkICAgICAgPSAkc2VsZi0+e19zZWxlY3RlZH07ICAgICAgICAgIyAxCisgICAgbXkgJGZQYWdlZCAgICAgICAgID0gJHNlbGYtPntfYWN0aXZlfTsgICAgICAgICAgICMgMgorICAgIG15ICRmQnJlYWtQcmV2aWV3ICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMKKworICAgICRncmJpdCAgICAgICAgICAgICA9ICRmRHNwRm1sYTsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkRzcEdyaWQgICAgICAgPDwgMTsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkRzcFJ3Q29sICAgICAgPDwgMjsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkZyb3plbiAgICAgICAgPDwgMzsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkRzcFplcm9zICAgICAgPDwgNDsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkRlZmF1bHRIZHIgICAgPDwgNTsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkFyYWJpYyAgICAgICAgPDwgNjsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkRzcEd1dHMgICAgICAgPDwgNzsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkZyb3plbk5vU3BsaXQgPDwgODsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZlNlbGVjdGVkICAgICAgPDwgOTsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZlBhZ2VkICAgICAgICAgPDwgMTA7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZCcmVha1ByZXZpZXcgIDw8IDExOworCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2dnZWdnZWIiwgJGdyYml0LCAkcndUb3AsICRjb2xMZWZ0LCAkcmdiSGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3U2NhbGVTTFYsICR3U2NhbGVOb3JtYWwsICRyZXNlcnZlZCApOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3BhZ2VfdmlldygpCisjCisjIFNldCBwYWdlIHZpZXcgbW9kZS4gT25seSBhcHBsaWNhYmxlIHRvIE1hYyBFeGNlbC4KKyMKK3N1YiBfc3RvcmVfcGFnZV92aWV3IHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X3BhZ2Vfdmlld307CisKKyAgICBteSAkZGF0YSAgICA9IHBhY2sgIkgqIiwgJ0M4MDgxMTAwQzgwODAwMDAwMDAwMDA0MDAwMDAwMDAwMDkwMDAwMDAwMCc7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdGFiX2NvbG9yKCkKKyMKKyMgV3JpdGUgdGhlIFRhYiBDb2xvciBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfdGFiX2NvbG9yIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJGNvbG9yICAgPSAkc2VsZi0+e190YWJfY29sb3J9OworCisgICAgcmV0dXJuIHVubGVzcyAkY29sb3I7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MDg2MjsgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgPSAweDAwMTQ7ICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkemVybyAgICA9IDB4MDAwMDsKKyAgICBteSAkdW5rbm93biA9IDB4MDAxNDsKKworICAgIG15ICRoZWFkZXIgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICA9IHBhY2soInZ2dnZ2dnZ2dnYiLCAkcmVjb3JkLCAkemVybywgJHplcm8sICR6ZXJvLCAkemVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemVybywgJHVua25vd24sICR6ZXJvLCAkY29sb3IsICR6ZXJvKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9kZWZyb3coKQorIworIyBXcml0ZSBCSUZGIHJlY29yZCBERUZST1dIRUlHSFQuCisjCitzdWIgX3N0b3JlX2RlZnJvdyB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgPSAweDAyMjU7ICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICA9IDB4MDAwNDsgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRncmJpdCAgICA9IDB4MDAwMDsgICAgICAjIE9wdGlvbnMuCisgICAgbXkgJGhlaWdodCAgID0gMHgwMEZGOyAgICAgICMgRGVmYXVsdCByb3cgaGVpZ2h0CisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soInZ2IiwgJGdyYml0LCAgJGhlaWdodCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2RlZmNvbCgpCisjCisjIFdyaXRlIEJJRkYgcmVjb3JkIERFRkNPTFdJRFRILgorIworc3ViIF9zdG9yZV9kZWZjb2wgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJHJlY29yZCAgID0gMHgwMDU1OyAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMDI7ICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkY29sd2lkdGggPSAweDAwMDg7ICAgICAgIyBEZWZhdWx0IGNvbHVtbiB3aWR0aAorCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJ2IiwgICRjb2x3aWR0aCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NvbGluZm8oJGZpcnN0Y29sLCAkbGFzdGNvbCwgJHdpZHRoLCAkZm9ybWF0LCAkaGlkZGVuKQorIworIyBXcml0ZSBCSUZGIHJlY29yZCBDT0xJTkZPIHRvIGRlZmluZSBjb2x1bW4gd2lkdGhzCisjCisjIE5vdGU6IFRoZSBTREsgc2F5cyB0aGUgcmVjb3JkIGxlbmd0aCBpcyAweDBCIGJ1dCBFeGNlbCB3cml0ZXMgYSAweDBDCisjIGxlbmd0aCByZWNvcmQuCisjCitzdWIgX3N0b3JlX2NvbGluZm8geworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJHJlY29yZCAgID0gMHgwMDdEOyAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgID0gMHgwMDBCOyAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRjb2xGaXJzdCA9ICRfWzBdIHx8IDA7ICAgICAgIyBGaXJzdCBmb3JtYXR0ZWQgY29sdW1uCisgICAgbXkgJGNvbExhc3QgID0gJF9bMV0gfHwgMDsgICAgICAjIExhc3QgZm9ybWF0dGVkIGNvbHVtbgorICAgIG15ICR3aWR0aCAgICA9ICRfWzJdIHx8IDguNDM7ICAgIyBDb2wgd2lkdGggaW4gdXNlciB1bml0cywgOC40MyBpcyBkZWZhdWx0CisgICAgbXkgJGNvbGR4OyAgICAgICAgICAgICAgICAgICAgICAjIENvbCB3aWR0aCBpbiBpbnRlcm5hbCB1bml0cworICAgIG15ICRwaXhlbHM7ICAgICAgICAgICAgICAgICAgICAgIyBDb2wgd2lkdGggaW4gcGl4ZWxzCisKKyAgICAjIEV4Y2VsIHJvdW5kcyB0aGUgY29sdW1uIHdpZHRoIHRvIHRoZSBuZWFyZXN0IHBpeGVsLiBUaGVyZWZvcmUgd2UgZmlyc3QKKyAgICAjIGNvbnZlcnQgdG8gcGl4ZWxzIGFuZCB0aGVuIHRvIHRoZSBpbnRlcm5hbCB1bml0cy4gVGhlIHBpeGVsIHRvIHVzZXJzLXVuaXRzCisgICAgIyByZWxhdGlvbnNoaXAgaXMgZGlmZmVyZW50IGZvciB2YWx1ZXMgbGVzcyB0aGFuIDEuCisgICAgIworICAgIGlmICgkd2lkdGggPCAxKSB7CisgICAgICAgICRwaXhlbHMgPSBpbnQoJHdpZHRoICoxMik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkcGl4ZWxzID0gaW50KCR3aWR0aCAqNyApICs1OworICAgIH0KKworICAgICRjb2xkeCA9IGludCgkcGl4ZWxzICoyNTYvNyk7CisKKworICAgIG15ICRpeGZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYRiBpbmRleAorICAgIG15ICRncmJpdCAgICAgICA9IDB4MDAwMDsgICAgICAgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkcmVzZXJ2ZWQgICAgPSAweDAwOyAgICAgICAgICAgICMgUmVzZXJ2ZWQKKyAgICBteSAkZm9ybWF0ICAgICAgPSAkX1szXTsgICAgICAgICAgICMgRm9ybWF0IG9iamVjdAorICAgIG15ICRoaWRkZW4gICAgICA9ICRfWzRdIHx8IDA7ICAgICAgIyBIaWRkZW4gZmxhZworICAgIG15ICRsZXZlbCAgICAgICA9ICRfWzVdIHx8IDA7ICAgICAgIyBPdXRsaW5lIGxldmVsCisgICAgbXkgJGNvbGxhcHNlZCAgID0gJF9bNl0gfHwgMDsgICAgICAjIE91dGxpbmUgbGV2ZWwKKworCisgICAgIyBDaGVjayBmb3IgYSBmb3JtYXQgb2JqZWN0CisgICAgaWYgKHJlZiAkZm9ybWF0KSB7CisgICAgICAgICRpeGZlID0gJGZvcm1hdC0+Z2V0X3hmX2luZGV4KCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkaXhmZSA9IDB4MEY7CisgICAgfQorCisKKyAgICAjIFNldCB0aGUgbGltaXRzIGZvciB0aGUgb3V0bGluZSBsZXZlbHMgKDAgPD0geCA8PSA3KS4KKyAgICAkbGV2ZWwgPSAwIGlmICRsZXZlbCA8IDA7CisgICAgJGxldmVsID0gNyBpZiAkbGV2ZWwgPiA3OworCisKKyAgICAjIFNldCB0aGUgb3B0aW9ucyBmbGFncy4gKFNlZSBzZXRfcm93KCkgZm9yIG1vcmUgZGV0YWlscykuCisgICAgJGdyYml0IHw9IDB4MDAwMSBpZiAkaGlkZGVuOworICAgICRncmJpdCB8PSAkbGV2ZWwgPDwgODsKKyAgICAkZ3JiaXQgfD0gMHgxMDAwIGlmICRjb2xsYXBzZWQ7CisKKworICAgIG15ICRoZWFkZXIgICA9IHBhY2soInZ2IiwgICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soInZ2dnZ2QyIsICRjb2xGaXJzdCwgJGNvbExhc3QsICRjb2xkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXhmZSwgJGdyYml0LCAkcmVzZXJ2ZWQpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9maWx0ZXJtb2RlKCkKKyMKKyMgV3JpdGUgQklGRiByZWNvcmQgRklMVEVSTU9ERSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB3b3Jrc2hlZXQgY29udGFpbnMKKyMgQVVUT0ZJTFRFUiByZWNvcmQsIGllLiBhdXRvZmlsdGVycyB3aXRoIGEgZmlsdGVyIHNldC4KKyMKK3N1YiBfc3RvcmVfZmlsdGVybW9kZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA5QjsgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAwOyAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgIyBPbmx5IHdyaXRlIHRoZSByZWNvcmQgaWYgdGhlIHdvcmtzaGVldCBjb250YWlucyBhIGZpbHRlcmVkIGF1dG9maWx0ZXIuCisgICAgcmV0dXJuIHVubGVzcyAkc2VsZi0+e19maWx0ZXJfb259OworCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9hdXRvZmlsdGVyaW5mbygpCisjCisjIFdyaXRlIEJJRkYgcmVjb3JkIEFVVE9GSUxURVJJTkZPLgorIworc3ViIF9zdG9yZV9hdXRvZmlsdGVyaW5mbyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA5RDsgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRudW1fZmlsdGVycyA9ICRzZWxmLT57X2ZpbHRlcl9jb3VudH07CisKKyAgICAjIE9ubHkgd3JpdGUgdGhlIHJlY29yZCBpZiB0aGUgd29ya3NoZWV0IGNvbnRhaW5zIGFuIGF1dG9maWx0ZXIuCisgICAgcmV0dXJuIHVubGVzcyAkc2VsZi0+e19maWx0ZXJfY291bnR9OworCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJ2IiwgICRudW1fZmlsdGVycyk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3NlbGVjdGlvbigkZmlyc3Rfcm93LCAkZmlyc3RfY29sLCAkbGFzdF9yb3csICRsYXN0X2NvbCkKKyMKKyMgV3JpdGUgQklGRiByZWNvcmQgU0VMRUNUSU9OLgorIworc3ViIF9zdG9yZV9zZWxlY3Rpb24geworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJHJlY29yZCAgID0gMHgwMDFEOyAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMEY7ICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcG5uICAgICAgPSAkc2VsZi0+e19hY3RpdmVfcGFuZX07ICAgIyBQYW5lIHBvc2l0aW9uCisgICAgbXkgJHJ3QWN0ICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICMgQWN0aXZlIHJvdworICAgIG15ICRjb2xBY3QgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAjIEFjdGl2ZSBjb2x1bW4KKyAgICBteSAkaXJlZkFjdCAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIyBBY3RpdmUgY2VsbCByZWYKKyAgICBteSAkY3JlZiAgICAgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgcmVmcworCisgICAgbXkgJHJ3Rmlyc3QgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICMgRmlyc3Qgcm93IGluIHJlZmVyZW5jZQorICAgIG15ICRjb2xGaXJzdCA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAjIEZpcnN0IGNvbCBpbiByZWZlcmVuY2UKKyAgICBteSAkcndMYXN0ICAgPSAkX1syXSB8fCAkcndGaXJzdDsgICAgICAgIyBMYXN0ICByb3cgaW4gcmVmZXJlbmNlCisgICAgbXkgJGNvbExhc3QgID0gJF9bM10gfHwgJGNvbEZpcnN0OyAgICAgICMgTGFzdCAgY29sIGluIHJlZmVyZW5jZQorCisgICAgIyBTd2FwIGxhc3Qgcm93L2NvbCBmb3IgZmlyc3Qgcm93L2NvbCBhcyBuZWNlc3NhcnkKKyAgICBpZiAoJHJ3Rmlyc3QgPiAkcndMYXN0KSB7CisgICAgICAgICgkcndGaXJzdCwgJHJ3TGFzdCkgPSAoJHJ3TGFzdCwgJHJ3Rmlyc3QpOworICAgIH0KKworICAgIGlmICgkY29sRmlyc3QgPiAkY29sTGFzdCkgeworICAgICAgICAoJGNvbEZpcnN0LCAkY29sTGFzdCkgPSAoJGNvbExhc3QsICRjb2xGaXJzdCk7CisgICAgfQorCisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICAgICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJDdnZ2dnZ2Q0MiLCAgICAkcG5uLCAkcndBY3QsICRjb2xBY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlyZWZBY3QsICRjcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyd0ZpcnN0LCAkcndMYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xGaXJzdCwgJGNvbExhc3QpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2V4dGVybmNvdW50KCRjb3VudCkKKyMKKyMgV3JpdGUgQklGRiByZWNvcmQgRVhURVJOQ09VTlQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiBleHRlcm5hbCBzaGVldAorIyByZWZlcmVuY2VzIGluIGEgd29ya3NoZWV0LgorIworIyBFeGNlbCBvbmx5IHN0b3JlcyByZWZlcmVuY2VzIHRvIGV4dGVybmFsIHNoZWV0cyB0aGF0IGFyZSB1c2VkIGluIGZvcm11bGFzLgorIyBGb3Igc2ltcGxpY2l0eSB3ZSBzdG9yZSByZWZlcmVuY2VzIHRvIGFsbCB0aGUgc2hlZXRzIGluIHRoZSB3b3JrYm9vaworIyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgdXNlZCBvciBub3QuIFRoaXMgcmVkdWNlcyB0aGUgb3ZlcmFsbAorIyBjb21wbGV4aXR5IGFuZCBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciBhIHR3byB3YXkgZGlhbG9ndWUgYmV0d2VlbiB0aGUgZm9ybXVsYQorIyBwYXJzZXIgdGhlIHdvcmtzaGVldCBvYmplY3RzLgorIworc3ViIF9zdG9yZV9leHRlcm5jb3VudCB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgPSAweDAwMTY7ICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMDI7ICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGN4YWxzICAgID0gJF9bMF07ICAgICAgICAgICAjIE51bWJlciBvZiBleHRlcm5hbCByZWZlcmVuY2VzCisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soInYiLCAgJGN4YWxzKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZXh0ZXJuc2hlZXQoJHNoZWV0bmFtZSkKKyMKKyMKKyMgV3JpdGVzIHRoZSBFeGNlbCBCSUZGIEVYVEVSTlNIRUVUIHJlY29yZC4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgdXNlZCBieQorIyBmb3JtdWxhcy4gQSBmb3JtdWxhIHJlZmVyZW5jZXMgYSBzaGVldCBuYW1lIHZpYSBhbiBpbmRleC4gU2luY2Ugd2Ugc3RvcmUgYQorIyByZWZlcmVuY2UgdG8gYWxsIG9mIHRoZSBleHRlcm5hbCB3b3Jrc2hlZXRzIHRoZSBFWFRFUk5TSEVFVCBpbmRleCBpcyB0aGUgc2FtZQorIyBhcyB0aGUgd29ya3NoZWV0IGluZGV4LgorIworc3ViIF9zdG9yZV9leHRlcm5zaGVldCB7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgwMDE3OyAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHNoZWV0bmFtZSA9ICRfWzBdOyAgICAgICAgICAjIFdvcmtzaGVldCBuYW1lCisgICAgbXkgJGNjaDsgICAgICAgICAgICAgICAgICAgICAgICAjIExlbmd0aCBvZiBzaGVldCBuYW1lCisgICAgbXkgJHJnY2g7ICAgICAgICAgICAgICAgICAgICAgICAjIEZpbGVuYW1lIGVuY29kaW5nCisKKyAgICAjIFJlZmVyZW5jZXMgdG8gdGhlIGN1cnJlbnQgc2hlZXQgYXJlIGVuY29kZWQgZGlmZmVyZW50bHkgdG8gcmVmZXJlbmNlcyB0bworICAgICMgZXh0ZXJuYWwgc2hlZXRzLgorICAgICMKKyAgICBpZiAoJHNlbGYtPntfbmFtZX0gZXEgJHNoZWV0bmFtZSkgeworICAgICAgICAkc2hlZXRuYW1lID0gJyc7CisgICAgICAgICRsZW5ndGggICAgPSAweDAyOyAgIyBUaGUgZm9sbG93aW5nIDIgYnl0ZXMKKyAgICAgICAgJGNjaCAgICAgICA9IDE7ICAgICAjIFRoZSBmb2xsb3dpbmcgYnl0ZQorICAgICAgICAkcmdjaCAgICAgID0gMHgwMjsgICMgU2VsZiByZWZlcmVuY2UKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRsZW5ndGggICAgPSAweDAyICsgbGVuZ3RoKCRfWzBdKTsKKyAgICAgICAgJGNjaCAgICAgICA9IGxlbmd0aCgkc2hlZXRuYW1lKTsKKyAgICAgICAgJHJnY2ggICAgICA9IDB4MDM7ICAjIFJlZmVyZW5jZSB0byBhIHNoZWV0IGluIHRoZSBjdXJyZW50IHdvcmtib29rCisgICAgfQorCisgICAgbXkgJGhlYWRlciAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICA9IHBhY2soIkNDIiwgJGNjaCwgJHJnY2gpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhLCAkc2hlZXRuYW1lKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9wYW5lcygpCisjCisjCisjIFdyaXRlcyB0aGUgRXhjZWwgQklGRiBQQU5FIHJlY29yZC4KKyMgVGhlIHBhbmVzIGNhbiBlaXRoZXIgYmUgZnJvemVuIG9yIHRoYXdlZCAodW5mcm96ZW4pLgorIyBGcm96ZW4gcGFuZXMgYXJlIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBhIGludGVnZXIgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMuCisjIFRoYXdlZCBwYW5lcyBhcmUgc3BlY2lmaWVkIGluIHRlcm1zIG9mIEV4Y2VsJ3MgdW5pdHMgZm9yIHJvd3MgYW5kIGNvbHVtbnMuCisjCitzdWIgX3N0b3JlX3BhbmVzIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA0MTsgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwQTsgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkeSAgICAgICAgICAgPSAkX1swXSB8fCAwOyAgICMgVmVydGljYWwgc3BsaXQgcG9zaXRpb24KKyAgICBteSAkeCAgICAgICAgICAgPSAkX1sxXSB8fCAwOyAgICMgSG9yaXpvbnRhbCBzcGxpdCBwb3NpdGlvbgorICAgIG15ICRyd1RvcCAgICAgICA9ICRfWzJdOyAgICAgICAgIyBUb3Agcm93IHZpc2libGUKKyAgICBteSAkY29sTGVmdCAgICAgPSAkX1szXTsgICAgICAgICMgTGVmdG1vc3QgY29sdW1uIHZpc2libGUKKyAgICBteSAkbm9fc3BsaXQgICAgPSAkX1s0XTsgICAgICAgICMgTm8gdXNlZCBoZXJlLgorICAgIG15ICRwbm5BY3QgICAgICA9ICRfWzVdOyAgICAgICAgIyBBY3RpdmUgcGFuZQorCisKKyAgICAjIENvZGUgc3BlY2lmaWMgdG8gZnJvemVuIG9yIHRoYXdlZCBwYW5lcy4KKyAgICBpZiAoJHNlbGYtPntfZnJvemVufSkgeworICAgICAgICAjIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgJHJ3VG9wIGFuZCAkY29sTGVmdAorICAgICAgICAkcndUb3AgICA9ICR5IHVubGVzcyBkZWZpbmVkICRyd1RvcDsKKyAgICAgICAgJGNvbExlZnQgPSAkeCB1bmxlc3MgZGVmaW5lZCAkY29sTGVmdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICMgU2V0IGRlZmF1bHQgdmFsdWVzIGZvciAkcndUb3AgYW5kICRjb2xMZWZ0CisgICAgICAgICRyd1RvcCAgID0gMCAgdW5sZXNzIGRlZmluZWQgJHJ3VG9wOworICAgICAgICAkY29sTGVmdCA9IDAgIHVubGVzcyBkZWZpbmVkICRjb2xMZWZ0OworCisgICAgICAgICMgQ29udmVydCBFeGNlbCdzIHJvdyBhbmQgY29sdW1uIHVuaXRzIHRvIHRoZSBpbnRlcm5hbCB1bml0cy4KKyAgICAgICAgIyBUaGUgZGVmYXVsdCByb3cgaGVpZ2h0IGlzIDEyLjc1CisgICAgICAgICMgVGhlIGRlZmF1bHQgY29sdW1uIHdpZHRoIGlzIDguNDMKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIHNsb3BlIGFuZCBpbnRlcnNlY3Rpb24gdmFsdWVzIHdlcmUgaW50ZXJwb2xhdGVkLgorICAgICAgICAjCisgICAgICAgICR5ID0gMjAqJHkgICAgICArIDI1NTsKKyAgICAgICAgJHggPSAxMTMuODc5KiR4ICsgMzkwOworICAgIH0KKworCisgICAgIyBEZXRlcm1pbmUgd2hpY2ggcGFuZSBzaG91bGQgYmUgYWN0aXZlLiBUaGVyZSBpcyBhbHNvIHRoZSB1bmRvY3VtZW50ZWQKKyAgICAjIG9wdGlvbiB0byBvdmVycmlkZSB0aGlzIHNob3VsZCBpdCBiZSBuZWNlc3Nhcnk6IG1heSBiZSByZW1vdmVkIGxhdGVyLgorICAgICMKKyAgICBpZiAobm90IGRlZmluZWQgJHBubkFjdCkgeworICAgICAgICAkcG5uQWN0ID0gMCBpZiAoJHggIT0gMCAmJiAkeSAhPSAwKTsgIyBCb3R0b20gcmlnaHQKKyAgICAgICAgJHBubkFjdCA9IDEgaWYgKCR4ICE9IDAgJiYgJHkgPT0gMCk7ICMgVG9wIHJpZ2h0CisgICAgICAgICRwbm5BY3QgPSAyIGlmICgkeCA9PSAwICYmICR5ICE9IDApOyAjIEJvdHRvbSBsZWZ0CisgICAgICAgICRwbm5BY3QgPSAzIGlmICgkeCA9PSAwICYmICR5ID09IDApOyAjIFRvcCBsZWZ0CisgICAgfQorCisgICAgJHNlbGYtPntfYWN0aXZlX3BhbmV9ID0gJHBubkFjdDsgIyBVc2VkIGluIF9zdG9yZV9zZWxlY3Rpb24KKworICAgIG15ICRoZWFkZXIgICAgID0gcGFjaygidnYiLCAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICA9IHBhY2soInZ2dnZ2IiwgJHgsICR5LCAkcndUb3AsICRjb2xMZWZ0LCAkcG5uQWN0KTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zZXR1cCgpCisjCisjIFN0b3JlIHRoZSBwYWdlIHNldHVwIFNFVFVQIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9zZXR1cCB7CisKKyAgICB1c2UgaW50ZWdlcjsgICAgIyBBdm9pZCA8PCBzaGlmdCBidWcgaW4gUGVybCA1LjYuMCBvbiBIUC1VWAorCisgICAgbXkgJHNlbGYgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRyZWNvcmQgICAgICAgPSAweDAwQTE7ICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgPSAweDAwMjI7ICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKworICAgIG15ICRpUGFwZXJTaXplICAgPSAkc2VsZi0+e19wYXBlcl9zaXplfTsgICAgIyBQYXBlciBzaXplCisgICAgbXkgJGlTY2FsZSAgICAgICA9ICRzZWxmLT57X3ByaW50X3NjYWxlfTsgICAjIFByaW50IHNjYWxpbmcgZmFjdG9yCisgICAgbXkgJGlQYWdlU3RhcnQgICA9ICRzZWxmLT57X3BhZ2Vfc3RhcnR9OyAgICAjIFN0YXJ0aW5nIHBhZ2UgbnVtYmVyCisgICAgbXkgJGlGaXRXaWR0aCAgICA9ICRzZWxmLT57X2ZpdF93aWR0aH07ICAgICAjIEZpdCB0byBudW1iZXIgb2YgcGFnZXMgd2lkZQorICAgIG15ICRpRml0SGVpZ2h0ICAgPSAkc2VsZi0+e19maXRfaGVpZ2h0fTsgICAgIyBGaXQgdG8gbnVtYmVyIG9mIHBhZ2VzIGhpZ2gKKyAgICBteSAkZ3JiaXQgICAgICAgID0gMHgwMDsgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uIGZsYWdzCisgICAgbXkgJGlSZXMgICAgICAgICA9IDB4MDI1ODsgICAgICAgICAgICAgICAgICAjIFByaW50IHJlc29sdXRpb24KKyAgICBteSAkaVZSZXMgICAgICAgID0gMHgwMjU4OyAgICAgICAgICAgICAgICAgICMgVmVydGljYWwgcHJpbnQgcmVzb2x1dGlvbgorICAgIG15ICRudW1IZHIgICAgICAgPSAkc2VsZi0+e19tYXJnaW5faGVhZGVyfTsgIyBIZWFkZXIgTWFyZ2luCisgICAgbXkgJG51bUZ0ciAgICAgICA9ICRzZWxmLT57X21hcmdpbl9mb290ZXJ9OyAjIEZvb3RlciBNYXJnaW4KKyAgICBteSAkaUNvcGllcyAgICAgID0gMHgwMTsgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGNvcGllcworCisKKyAgICBteSAkZkxlZnRUb1JpZ2h0ID0gJHNlbGYtPntfcGFnZV9vcmRlcn07ICAgICMgUHJpbnQgb3ZlciB0aGVuIGRvd24KKyAgICBteSAkZkxhbmRzY2FwZSAgID0gJHNlbGYtPntfb3JpZW50YXRpb259OyAgICMgUGFnZSBvcmllbnRhdGlvbgorICAgIG15ICRmTm9QbHMgICAgICAgPSAweDA7ICAgICAgICAgICAgICAgICAgICAgIyBTZXR1cCBub3QgcmVhZCBmcm9tIHByaW50ZXIKKyAgICBteSAkZk5vQ29sb3IgICAgID0gJHNlbGYtPntfYmxhY2tfd2hpdGV9OyAgICMgUHJpbnQgYmxhY2sgYW5kIHdoaXRlCisgICAgbXkgJGZEcmFmdCAgICAgICA9ICRzZWxmLT57X2RyYWZ0X3F1YWxpdHl9OyAjIFByaW50IGRyYWZ0IHF1YWxpdHkKKyAgICBteSAkZk5vdGVzICAgICAgID0gJHNlbGYtPntfcHJpbnRfY29tbWVudHN9OyMgUHJpbnQgbm90ZXMKKyAgICBteSAkZk5vT3JpZW50ICAgID0gMHgwOyAgICAgICAgICAgICAgICAgICAgICMgT3JpZW50YXRpb24gbm90IHNldAorICAgIG15ICRmVXNlUGFnZSAgICAgPSAkc2VsZi0+e19jdXN0b21fc3RhcnR9OyAgIyBVc2UgY3VzdG9tIHN0YXJ0aW5nIHBhZ2UKKworCisgICAgJGdyYml0ICAgICAgICAgICA9ICRmTGVmdFRvUmlnaHQ7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmTGFuZHNjYXBlICAgIDw8IDE7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmTm9QbHMgICAgICAgIDw8IDI7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmTm9Db2xvciAgICAgIDw8IDM7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmRHJhZnQgICAgICAgIDw8IDQ7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmTm90ZXMgICAgICAgIDw8IDU7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmTm9PcmllbnQgICAgIDw8IDY7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmVXNlUGFnZSAgICAgIDw8IDc7CisKKworICAgICRudW1IZHIgPSBwYWNrKCJkIiwgJG51bUhkcik7CisgICAgJG51bUZ0ciA9IHBhY2soImQiLCAkbnVtRnRyKTsKKworICAgIGlmICgkc2VsZi0+e19ieXRlX29yZGVyfSkgeworICAgICAgICAkbnVtSGRyID0gcmV2ZXJzZSAkbnVtSGRyOworICAgICAgICAkbnVtRnRyID0gcmV2ZXJzZSAkbnVtRnRyOworICAgIH0KKworICAgIG15ICRoZWFkZXIgPSBwYWNrKCJ2diIsICAgICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGExICA9IHBhY2soInZ2dnZ2dnZ2IiwgICAkaVBhcGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaVBhZ2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpRml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaUZpdEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRncmJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlWUmVzKTsKKyAgICBteSAkZGF0YTIgID0gJG51bUhkciAuJG51bUZ0cjsKKyAgICBteSAkZGF0YTMgID0gcGFjaygidiIsICRpQ29waWVzKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YTEsICRkYXRhMiwgJGRhdGEzKTsKKworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9oZWFkZXIoKQorIworIyBTdG9yZSB0aGUgaGVhZGVyIGNhcHRpb24gQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2hlYWRlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAxNDsgICAgICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHN0ciAgICAgICAgID0gJHNlbGYtPntfaGVhZGVyfTsgICAgICAgICAgICAgIyBoZWFkZXIgc3RyaW5nCisgICAgbXkgJGNjaCAgICAgICAgID0gbGVuZ3RoKCRzdHIpOyAgICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgaGVhZGVyIHN0cmluZworICAgIG15ICRlbmNvZGluZyAgICA9ICRzZWxmLT57X2hlYWRlcl9lbmNvZGluZ307ICAgICMgQ2hhcmFjdGVyIGVuY29kaW5nCisKKworICAgICMgQ2hhcmFjdGVyIGxlbmd0aCBpcyBudW0gb2YgY2hhcnMgbm90IG51bSBvZiBieXRlcworICAgICRjY2ggICAgICAgICAgIC89IDIgaWYgJGVuY29kaW5nOworCisgICAgIyBDaGFuZ2UgdGhlIFVURi0xNiBuYW1lIGZyb20gQkUgdG8gTEUKKyAgICAkc3RyICAgICAgICAgICAgPSBwYWNrICduKicsIHVucGFjayAndionLCAkc3RyIGlmICRlbmNvZGluZzsKKworICAgICRsZW5ndGggICAgICAgICA9IDMgKyBsZW5ndGgoJHN0cik7CisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2QyIsICAkY2NoLCAkZW5jb2RpbmcpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhLCAkc3RyKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9mb290ZXIoKQorIworIyBTdG9yZSB0aGUgZm9vdGVyIGNhcHRpb24gQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2Zvb3RlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAxNTsgICAgICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHN0ciAgICAgICAgID0gJHNlbGYtPntfZm9vdGVyfTsgICAgICAgICAgICAgIyBmb290ZXIgc3RyaW5nCisgICAgbXkgJGNjaCAgICAgICAgID0gbGVuZ3RoKCRzdHIpOyAgICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgZm9vdGVyIHN0cmluZworICAgIG15ICRlbmNvZGluZyAgICA9ICRzZWxmLT57X2Zvb3Rlcl9lbmNvZGluZ307ICAgICMgQ2hhcmFjdGVyIGVuY29kaW5nCisKKworICAgICMgQ2hhcmFjdGVyIGxlbmd0aCBpcyBudW0gb2YgY2hhcnMgbm90IG51bSBvZiBieXRlcworICAgICRjY2ggICAgICAgICAgIC89IDIgaWYgJGVuY29kaW5nOworCisgICAgIyBDaGFuZ2UgdGhlIFVURi0xNiBuYW1lIGZyb20gQkUgdG8gTEUKKyAgICAkc3RyICAgICAgICAgICAgPSBwYWNrICduKicsIHVucGFjayAndionLCAkc3RyIGlmICRlbmNvZGluZzsKKworICAgICRsZW5ndGggICAgICAgICA9IDMgKyBsZW5ndGgoJHN0cik7CisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2QyIsICAkY2NoLCAkZW5jb2RpbmcpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhLCAkc3RyKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9oY2VudGVyKCkKKyMKKyMgU3RvcmUgdGhlIGhvcml6b250YWwgY2VudGVyaW5nIEhDRU5URVIgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2hjZW50ZXIgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgPSAweDAwODM7ICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgID0gMHgwMDAyOyAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRmSENlbnRlciA9ICRzZWxmLT57X2hjZW50ZXJ9OyAgICMgSG9yaXpvbnRhbCBjZW50ZXJpbmcKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygidiIsICAgJGZIQ2VudGVyKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdmNlbnRlcigpCisjCisjIFN0b3JlIHRoZSB2ZXJ0aWNhbCBjZW50ZXJpbmcgVkNFTlRFUiBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfdmNlbnRlciB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MDA4NDsgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMDI7ICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGZWQ2VudGVyID0gJHNlbGYtPntfdmNlbnRlcn07ICAgIyBIb3Jpem9udGFsIGNlbnRlcmluZworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2IiwgICAkZlZDZW50ZXIpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tYXJnaW5fbGVmdCgpCisjCisjIFN0b3JlIHRoZSBMRUZUTUFSR0lOIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9tYXJnaW5fbGVmdCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgPSAweDAwMjY7ICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwODsgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRtYXJnaW4gID0gJHNlbGYtPntfbWFyZ2luX2xlZnR9OyAgICAjIE1hcmdpbiBpbiBpbmNoZXMKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygiZCIsICAgJG1hcmdpbik7CisKKyAgICBpZiAoJHNlbGYtPntfYnl0ZV9vcmRlcn0pIHsgJGRhdGEgPSByZXZlcnNlICRkYXRhIH0KKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbWFyZ2luX3JpZ2h0KCkKKyMKKyMgU3RvcmUgdGhlIFJJR0hUTUFSR0lOIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9tYXJnaW5fcmlnaHQgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgID0gMHgwMDI3OyAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgPSAweDAwMDg7ICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkbWFyZ2luICA9ICRzZWxmLT57X21hcmdpbl9yaWdodH07ICAgIyBNYXJnaW4gaW4gaW5jaGVzCisKKyAgICBteSAkaGVhZGVyICAgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soImQiLCAgICRtYXJnaW4pOworCisgICAgaWYgKCRzZWxmLT57X2J5dGVfb3JkZXJ9KSB7ICRkYXRhID0gcmV2ZXJzZSAkZGF0YSB9CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21hcmdpbl90b3AoKQorIworIyBTdG9yZSB0aGUgVE9QTUFSR0lOIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9tYXJnaW5fdG9wIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MDAyODsgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggID0gMHgwMDA4OyAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG1hcmdpbiAgPSAkc2VsZi0+e19tYXJnaW5fdG9wfTsgICAgICMgTWFyZ2luIGluIGluY2hlcworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJkIiwgICAkbWFyZ2luKTsKKworICAgIGlmICgkc2VsZi0+e19ieXRlX29yZGVyfSkgeyAkZGF0YSA9IHJldmVyc2UgJGRhdGEgfQorCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tYXJnaW5fYm90dG9tKCkKKyMKKyMgU3RvcmUgdGhlIEJPVFRPTU1BUkdJTiBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfbWFyZ2luX2JvdHRvbSB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgPSAweDAwMjk7ICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwODsgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRtYXJnaW4gID0gJHNlbGYtPntfbWFyZ2luX2JvdHRvbX07ICAjIE1hcmdpbiBpbiBpbmNoZXMKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygiZCIsICAgJG1hcmdpbik7CisKKyAgICBpZiAoJHNlbGYtPntfYnl0ZV9vcmRlcn0pIHsgJGRhdGEgPSByZXZlcnNlICRkYXRhIH0KKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBtZXJnZV9jZWxscygkZmlyc3Rfcm93LCAkZmlyc3RfY29sLCAkbGFzdF9yb3csICRsYXN0X2NvbCkKKyMKKyMgVGhpcyBpcyBhbiBFeGNlbDk3LzIwMDAgbWV0aG9kLiBJdCBpcyByZXF1aXJlZCB0byBwZXJmb3JtIG1vcmUgY29tcGxpY2F0ZWQKKyMgbWVyZ2luZyB0aGFuIHRoZSBub3JtYWwgYWxpZ24gbWVyZ2UgaW4gRm9ybWF0LnBtCisjCitzdWIgbWVyZ2VfY2VsbHMgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgbXkgJHJlY29yZCAgPSAweDAwRTU7ICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwQTsgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRjcmVmICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiByZWZzCisgICAgbXkgJHJ3Rmlyc3QgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICMgRmlyc3Qgcm93IGluIHJlZmVyZW5jZQorICAgIG15ICRjb2xGaXJzdCA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAjIEZpcnN0IGNvbCBpbiByZWZlcmVuY2UKKyAgICBteSAkcndMYXN0ICAgPSAkX1syXSB8fCAkcndGaXJzdDsgICAgICAgIyBMYXN0ICByb3cgaW4gcmVmZXJlbmNlCisgICAgbXkgJGNvbExhc3QgID0gJF9bM10gfHwgJGNvbEZpcnN0OyAgICAgICMgTGFzdCAgY29sIGluIHJlZmVyZW5jZQorCisKKyAgICAjIEV4Y2VsIGRvZXNuJ3QgYWxsb3cgYSBzaW5nbGUgY2VsbCB0byBiZSBtZXJnZWQKKyAgICByZXR1cm4gaWYgJHJ3Rmlyc3QgPT0gJHJ3TGFzdCBhbmQgJGNvbEZpcnN0ID09ICRjb2xMYXN0OworCisgICAgIyBTd2FwIGxhc3Qgcm93L2NvbCB3aXRoIGZpcnN0IHJvdy9jb2wgYXMgbmVjZXNzYXJ5CisgICAgKCRyd0ZpcnN0LCAgJHJ3TGFzdCApID0gKCRyd0xhc3QsICAkcndGaXJzdCApIGlmICRyd0ZpcnN0ICA+ICRyd0xhc3Q7CisgICAgKCRjb2xGaXJzdCwgJGNvbExhc3QpID0gKCRjb2xMYXN0LCAkY29sRmlyc3QpIGlmICRjb2xGaXJzdCA+ICRjb2xMYXN0OworCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJ2dnZ2diIsICAgICRjcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJ3Rmlyc3QsICRyd0xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sRmlyc3QsICRjb2xMYXN0KTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG1lcmdlX3JhbmdlKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkc3RyaW5nLCAkZm9ybWF0LCAkZW5jb2RpbmcpCisjCisjIFRoaXMgaXMgYSB3cmFwcGVyIHRvIGVuc3VyZSBjb3JyZWN0IHVzZSBvZiB0aGUgbWVyZ2VfY2VsbHMgbWV0aG9kLCBpLmUuLCB3cml0ZQorIyB0aGUgZmlyc3QgY2VsbCBvZiB0aGUgcmFuZ2UsIHdyaXRlIHRoZSBmb3JtYXR0ZWQgYmxhbmsgY2VsbHMgaW4gdGhlIHJhbmdlIGFuZAorIyB0aGVuIGNhbGwgdGhlIG1lcmdlX2NlbGxzIHJlY29yZC4gRmFpbGluZyB0byBkbyB0aGUgc3RlcHMgaW4gdGhpcyBvcmRlciB3aWxsCisjIGNhdXNlIEV4Y2VsIDk3IHRvIGNyYXNoLgorIworc3ViIG1lcmdlX3JhbmdlIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKyAgICBjcm9hayAiSW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMiIGlmIEBfICE9IDYgYW5kIEBfICE9IDc7CisgICAgY3JvYWsgIkZvcm1hdCBhcmd1bWVudCBpcyBub3QgYSBmb3JtYXQgb2JqZWN0IiB1bmxlc3MgcmVmICRfWzVdOworCisgICAgbXkgJHJ3Rmlyc3QgID0gJF9bMF07CisgICAgbXkgJGNvbEZpcnN0ID0gJF9bMV07CisgICAgbXkgJHJ3TGFzdCAgID0gJF9bMl07CisgICAgbXkgJGNvbExhc3QgID0gJF9bM107CisgICAgbXkgJHN0cmluZyAgID0gJF9bNF07CisgICAgbXkgJGZvcm1hdCAgID0gJF9bNV07CisgICAgbXkgJGVuY29kaW5nID0gJF9bNl0gPyAxIDogMDsKKworCisgICAgIyBUZW1wIGNvZGUgdG8gcHJldmVudCBtZXJnZWQgZm9ybWF0cyBpbiBub24tbWVyZ2VkIGNlbGxzLgorICAgIG15ICRlcnJvciA9ICJFcnJvcjogcmVmZXIgdG8gbWVyZ2VfcmFuZ2UoKSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gIiAuCisgICAgICAgICAgICAgICAgIkNhbid0IHVzZSBwcmV2aW91c2x5IG5vbi1tZXJnZWQgZm9ybWF0IGluIG1lcmdlZCBjZWxscyI7CisKKyAgICBjcm9hayAkZXJyb3IgaWYgJGZvcm1hdC0+e191c2VkX21lcmdlfSA9PSAtMTsKKyAgICAkZm9ybWF0LT57X3VzZWRfbWVyZ2V9ID0gMDsgIyBVbnRpbCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24uCisKKworICAgICMgU2V0IHRoZSBtZXJnZV9yYW5nZSBwcm9wZXJ0eSBvZiB0aGUgZm9ybWF0IG9iamVjdC4gRm9yIEJJRkY4Ky4KKyAgICAkZm9ybWF0LT5zZXRfbWVyZ2VfcmFuZ2UoKTsKKworICAgICMgRXhjZWwgZG9lc24ndCBhbGxvdyBhIHNpbmdsZSBjZWxsIHRvIGJlIG1lcmdlZAorICAgIGNyb2FrICJDYW4ndCBtZXJnZSBzaW5nbGUgY2VsbCIgaWYgJHJ3Rmlyc3QgID09ICRyd0xhc3QgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sRmlyc3QgPT0gJGNvbExhc3Q7CisKKyAgICAjIFN3YXAgbGFzdCByb3cvY29sIHdpdGggZmlyc3Qgcm93L2NvbCBhcyBuZWNlc3NhcnkKKyAgICAoJHJ3Rmlyc3QsICAkcndMYXN0ICkgPSAoJHJ3TGFzdCwgICRyd0ZpcnN0ICkgaWYgJHJ3Rmlyc3QgID4gJHJ3TGFzdDsKKyAgICAoJGNvbEZpcnN0LCAkY29sTGFzdCkgPSAoJGNvbExhc3QsICRjb2xGaXJzdCkgaWYgJGNvbEZpcnN0ID4gJGNvbExhc3Q7CisKKyAgICAjIFdyaXRlIHRoZSBmaXJzdCBjZWxsCisgICAgaWYgKCRlbmNvZGluZykgeworICAgICAgICAkc2VsZi0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJHJ3Rmlyc3QsICRjb2xGaXJzdCwgJHN0cmluZywgJGZvcm1hdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+d3JpdGUgICAgICAgICAgICAgICAoJHJ3Rmlyc3QsICRjb2xGaXJzdCwgJHN0cmluZywgJGZvcm1hdCk7CisgICAgfQorCisgICAgIyBQYWQgb3V0IHRoZSByZXN0IG9mIHRoZSBhcmVhIHdpdGggZm9ybWF0dGVkIGJsYW5rIGNlbGxzLgorICAgIGZvciBteSAkcm93ICgkcndGaXJzdCAuLiAkcndMYXN0KSB7CisgICAgICAgIGZvciBteSAkY29sICgkY29sRmlyc3QgLi4gJGNvbExhc3QpIHsKKyAgICAgICAgICAgIG5leHQgaWYgJHJvdyA9PSAkcndGaXJzdCBhbmQgJGNvbCA9PSAkY29sRmlyc3Q7CisgICAgICAgICAgICAkc2VsZi0+d3JpdGVfYmxhbmsoJHJvdywgJGNvbCwgJGZvcm1hdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAkc2VsZi0+bWVyZ2VfY2VsbHMoJHJ3Rmlyc3QsICRjb2xGaXJzdCwgJHJ3TGFzdCwgJGNvbExhc3QpOworCisgICAgIyBUZW1wIGNvZGUgdG8gcHJldmVudCBtZXJnZWQgZm9ybWF0cyBpbiBub24tbWVyZ2VkIGNlbGxzLgorICAgICRmb3JtYXQtPntfdXNlZF9tZXJnZX0gPSAxOworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcHJpbnRfaGVhZGVycygpCisjCisjIFdyaXRlIHRoZSBQUklOVEhFQURFUlMgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3ByaW50X2hlYWRlcnMgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwMmE7ICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDI7ICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZlByaW50UndDb2wgPSAkc2VsZi0+e19wcmludF9oZWFkZXJzfTsgICMgQm9vbGVhbiBmbGFnCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2IiwgICAkZlByaW50UndDb2wpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9wcmludF9ncmlkbGluZXMoKQorIworIyBXcml0ZSB0aGUgUFJJTlRHUklETElORVMgQklGRiByZWNvcmQuIE11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorIyBHUklEU0VUIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfcHJpbnRfZ3JpZGxpbmVzIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDJiOyAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwMjsgICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZlByaW50R3JpZCAgPSAkc2VsZi0+e19wcmludF9ncmlkbGluZXN9OyAjIEJvb2xlYW4gZmxhZworCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidiIsICAgJGZQcmludEdyaWQpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9ncmlkc2V0KCkKKyMKKyMgV3JpdGUgdGhlIEdSSURTRVQgQklGRiByZWNvcmQuIE11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorIyBQUklOVEdSSURMSU5FUyByZWNvcmQuCisjCitzdWIgX3N0b3JlX2dyaWRzZXQgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwODI7ICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwMjsgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGZHcmlkU2V0ICAgID0gbm90ICRzZWxmLT57X3ByaW50X2dyaWRsaW5lc307ICMgQm9vbGVhbiBmbGFnCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2IiwgICAkZkdyaWRTZXQpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2d1dHMoKQorIworIyBXcml0ZSB0aGUgR1VUUyBCSUZGIHJlY29yZC4gVGhpcyBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZ3V0dGVyIG1hcmdpbnMKKyMgd2hlcmUgRXhjZWwgb3V0bGluZSBzeW1ib2xzIGFyZSBkaXNwbGF5ZWQuIFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBndXR0ZXJzIGlzCisjIGNvbnRyb2xsZWQgYnkgYSBmbGFnIGluIFdTQk9PTC4gU2VlIGFsc28gX3N0b3JlX3dzYm9vbCgpLgorIworIyBXZSBhcmUgYWxsIGluIHRoZSBndXR0ZXIgYnV0IHNvbWUgb2YgdXMgYXJlIGxvb2tpbmcgYXQgdGhlIHN0YXJzLgorIworc3ViIF9zdG9yZV9ndXRzIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDgwOyAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDg7ICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRkeFJ3R3V0ICAgICA9IDB4MDAwMDsgICAjIFNpemUgb2Ygcm93IGd1dHRlcgorICAgIG15ICRkeENvbEd1dCAgICA9IDB4MDAwMDsgICAjIFNpemUgb2YgY29sIGd1dHRlcgorCisgICAgbXkgJHJvd19sZXZlbCAgID0gJHNlbGYtPntfb3V0bGluZV9yb3dfbGV2ZWx9OworICAgIG15ICRjb2xfbGV2ZWwgICA9IDA7CisKKworICAgICMgQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGNvbHVtbiBvdXRsaW5lIGxldmVsLiBUaGUgZXF1aXZhbGVudCBjYWxjdWxhdGlvbgorICAgICMgZm9yIHRoZSByb3cgb3V0bGluZSBsZXZlbCBpcyBjYXJyaWVkIG91dCBpbiBzZXRfcm93KCkuCisgICAgIworICAgIGZvcmVhY2ggbXkgJGNvbGluZm8gKEB7JHNlbGYtPntfY29saW5mb319KSB7CisgICAgICAgICMgU2tpcCBjb2xzIHdpdGhvdXQgb3V0bGluZSBsZXZlbCBpbmZvLgorICAgICAgICBuZXh0IGlmIEB7JGNvbGluZm99IDwgNjsKKyAgICAgICAgJGNvbF9sZXZlbCA9IEB7JGNvbGluZm99WzVdIGlmIEB7JGNvbGluZm99WzVdID4gJGNvbF9sZXZlbDsKKyAgICB9CisKKworICAgICMgU2V0IHRoZSBsaW1pdHMgZm9yIHRoZSBvdXRsaW5lIGxldmVscyAoMCA8PSB4IDw9IDcpLgorICAgICRjb2xfbGV2ZWwgPSAwIGlmICRjb2xfbGV2ZWwgPCAwOworICAgICRjb2xfbGV2ZWwgPSA3IGlmICRjb2xfbGV2ZWwgPiA3OworCisKKyAgICAjIFRoZSBkaXNwbGF5ZWQgbGV2ZWwgaXMgb25lIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IG91dGxpbmUgbGV2ZWxzCisgICAgJHJvd19sZXZlbCsrIGlmICRyb3dfbGV2ZWwgPiAwOworICAgICRjb2xfbGV2ZWwrKyBpZiAkY29sX2xldmVsID4gMDsKKworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2dnZ2IiwgJGR4UndHdXQsICRkeENvbEd1dCwgJHJvd19sZXZlbCwgJGNvbF9sZXZlbCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfd3Nib29sKCkKKyMKKyMgV3JpdGUgdGhlIFdTQk9PTCBCSUZGIHJlY29yZCwgbWFpbmx5IGZvciBmaXQtdG8tcGFnZS4gVXNlZCBpbiBjb25qdW5jdGlvbgorIyB3aXRoIHRoZSBTRVRVUCByZWNvcmQuCisjCitzdWIgX3N0b3JlX3dzYm9vbCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA4MTsgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZ3JiaXQgICAgICAgPSAweDAwMDA7ICAgIyBPcHRpb24gZmxhZ3MKKworICAgICMgU2V0IHRoZSBvcHRpb24gZmxhZ3MKKyAgICAkZ3JiaXQgfD0gMHgwMDAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEF1dG8gcGFnZSBicmVha3MgdmlzaWJsZQorICAgICRncmJpdCB8PSAweDAwMjAgaWYgJHNlbGYtPntfb3V0bGluZV9zdHlsZX07ICMgQXV0byBvdXRsaW5lIHN0eWxlcworICAgICRncmJpdCB8PSAweDAwNDAgaWYgJHNlbGYtPntfb3V0bGluZV9iZWxvd307ICMgT3V0bGluZSBzdW1tYXJ5IGJlbG93CisgICAgJGdyYml0IHw9IDB4MDA4MCBpZiAkc2VsZi0+e19vdXRsaW5lX3JpZ2h0fTsgIyBPdXRsaW5lIHN1bW1hcnkgcmlnaHQKKyAgICAkZ3JiaXQgfD0gMHgwMTAwIGlmICRzZWxmLT57X2ZpdF9wYWdlfTsgICAgICAjIFBhZ2Ugc2V0dXAgZml0IHRvIHBhZ2UKKyAgICAkZ3JiaXQgfD0gMHgwNDAwIGlmICRzZWxmLT57X291dGxpbmVfb259OyAgICAjIE91dGxpbmUgc3ltYm9scyBkaXNwbGF5ZWQKKworCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidiIsICAgJGdyYml0KTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfaGJyZWFrKCkKKyMKKyMgV3JpdGUgdGhlIEhPUklaT05UQUxQQUdFQlJFQUtTIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9oYnJlYWsgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgICMgUmV0dXJuIGlmIHRoZSB1c2VyIGhhc24ndCBzcGVjaWZpZWQgcGFnZWJyZWFrcworICAgIHJldHVybiB1bmxlc3MgQHskc2VsZi0+e19oYnJlYWtzfX07CisKKyAgICAjIFNvcnQgYW5kIGZpbHRlciBhcnJheSBvZiBwYWdlIGJyZWFrcworICAgIG15IEBicmVha3MgID0gJHNlbGYtPl9zb3J0X3BhZ2VicmVha3MoQHskc2VsZi0+e19oYnJlYWtzfX0pOworCisgICAgbXkgJHJlY29yZCAgPSAweDAwMWI7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRjYnJrICAgID0gc2NhbGFyIEBicmVha3M7ICAgICAgICMgTnVtYmVyIG9mIHBhZ2UgYnJlYWtzCisgICAgbXkgJGxlbmd0aCAgPSAyICsgNiokY2JyazsgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICA9IHBhY2soInYiLCAgICRjYnJrKTsKKworICAgICMgQXBwZW5kIGVhY2ggcGFnZSBicmVhaworICAgIGZvcmVhY2ggbXkgJGJyZWFrIChAYnJlYWtzKSB7CisgICAgICAgICRkYXRhIC49IHBhY2soInZ2diIsICRicmVhaywgMHgwMDAwLCAweDAwZmYpOworICAgIH0KKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdmJyZWFrKCkKKyMKKyMgV3JpdGUgdGhlIFZFUlRJQ0FMUEFHRUJSRUFLUyBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfdmJyZWFrIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICAjIFJldHVybiBpZiB0aGUgdXNlciBoYXNuJ3Qgc3BlY2lmaWVkIHBhZ2VicmVha3MKKyAgICByZXR1cm4gdW5sZXNzIEB7JHNlbGYtPntfdmJyZWFrc319OworCisgICAgIyBTb3J0IGFuZCBmaWx0ZXIgYXJyYXkgb2YgcGFnZSBicmVha3MKKyAgICBteSBAYnJlYWtzICA9ICRzZWxmLT5fc29ydF9wYWdlYnJlYWtzKEB7JHNlbGYtPntfdmJyZWFrc319KTsKKworICAgIG15ICRyZWNvcmQgID0gMHgwMDFhOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkY2JyayAgICA9IHNjYWxhciBAYnJlYWtzOyAgICAgICAjIE51bWJlciBvZiBwYWdlIGJyZWFrcworICAgIG15ICRsZW5ndGggID0gMiArIDYqJGNicms7ICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKworICAgIG15ICRoZWFkZXIgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2IiwgICAkY2Jyayk7CisKKyAgICAjIEFwcGVuZCBlYWNoIHBhZ2UgYnJlYWsKKyAgICBmb3JlYWNoIG15ICRicmVhayAoQGJyZWFrcykgeworICAgICAgICAkZGF0YSAuPSBwYWNrKCJ2dnYiLCAkYnJlYWssIDB4MDAwMCwgMHhmZmZmKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3Byb3RlY3QoKQorIworIyBTZXQgdGhlIEJpZmYgUFJPVEVDVCByZWNvcmQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgd29ya3NoZWV0IGlzIHByb3RlY3RlZC4KKyMKK3N1YiBfc3RvcmVfcHJvdGVjdCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgICMgRXhpdCB1bmxlc3Mgc2hlZXQgcHJvdGVjdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQKKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X3Byb3RlY3R9OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDEyOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDI7ICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRmTG9jayAgICAgICA9ICRzZWxmLT57X3Byb3RlY3R9OyAgICAjIFdvcmtzaGVldCBpcyBwcm90ZWN0ZWQKKworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidiIsICAkZkxvY2spOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9vYmpfcHJvdGVjdCgpCisjCisjIFNldCB0aGUgQmlmZiBPQkpQUk9URUNUIHJlY29yZCB0byBpbmRpY2F0ZSB0aGF0IG9iamVjdHMgYXJlIHByb3RlY3RlZC4KKyMKK3N1YiBfc3RvcmVfb2JqX3Byb3RlY3QgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICAjIEV4aXQgdW5sZXNzIHNoZWV0IHByb3RlY3Rpb24gaGFzIGJlZW4gc3BlY2lmaWVkCisgICAgcmV0dXJuIHVubGVzcyAkc2VsZi0+e19wcm90ZWN0fTsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA2MzsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZkxvY2sgICAgICAgPSAkc2VsZi0+e19wcm90ZWN0fTsgICAgIyBXb3Jrc2hlZXQgaXMgcHJvdGVjdGVkCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInYiLCAgJGZMb2NrKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcGFzc3dvcmQoKQorIworIyBXcml0ZSB0aGUgd29ya3NoZWV0IFBBU1NXT1JEIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfcGFzc3dvcmQgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICAjIEV4aXQgdW5sZXNzIHNoZWV0IHByb3RlY3Rpb24gYW5kIHBhc3N3b3JkIGhhdmUgYmVlbiBzcGVjaWZpZWQKKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X3Byb3RlY3R9IGFuZCBkZWZpbmVkICRzZWxmLT57X3Bhc3N3b3JkfTsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAxMzsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkd1Bhc3N3b3JkICAgPSAkc2VsZi0+e19wYXNzd29yZH07ICAgIyBFbmNvZGVkIHBhc3N3b3JkCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInYiLCAgJHdQYXNzd29yZCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMKKyMgTm90ZSBhYm91dCBjb21wYXRpYmlsaXR5IG1vZGUuCisjCisjIEV4Y2VsIGRvZXNuJ3QgcmVxdWlyZSBldmVyeSBwb3NzaWJsZSBCaWZmIHJlY29yZCB0byBiZSBwcmVzZW50IGluIGEgZmlsZS4KKyMgSW4gcGFydGljdWxhciBpZiB0aGUgaW5kZXhpbmcgcmVjb3JkcyBJTkRFWCwgUk9XIGFuZCBEQkNFTEwgYXJlbid0IHByZXNlbnQKKyMgaXQganVzdCBpZ25vcmVzIHRoZSBmYWN0IGFuZCByZWFkcyB0aGUgY2VsbHMgYW55d2F5LiBUaGlzIGlzIGFsc28gdHJ1ZSBvZgorIyB0aGUgRVhUU1NUIHJlY29yZC4gR251bWVyaWMgYW5kIE9PbyBhbHNvIHRha2UgdGhpcyBhcHByb2FjaC4gVGhpcyBhbGxvd3MKKyMgV3JpdGVFeGNlbCB0byBpZ25vcmUgdGhlc2UgcmVjb3JkcyBpbiBvcmRlciB0byBtaW5pbWlzZSB0aGUgYW1vdW50IG9mIGRhdGEKKyMgc3RvcmVkIGluIG1lbW9yeS4gSG93ZXZlciwgb3RoZXIgdGhpcmQgcGFydHkgYXBwbGljYXRpb25zIHRoYXQgcmVhZCBFeGNlbAorIyBmaWxlcyBvZnRlbiBleHBlY3QgdGhlc2UgcmVjb3JkcyB0byBiZSBwcmVzZW50LiBJbiAiY29tcGF0aWJpbGl0eSBtb2RlIgorIyBXcml0ZUV4Y2VsIHdyaXRlcyB0aGVzZSByZWNvcmRzIGFuZCB0cmllcyB0byBiZSBhcyBjbG9zZSB0byBhbiBFeGNlbAorIyBnZW5lcmF0ZWQgZmlsZSBhcyBwb3NzaWJsZS4KKyMKKyMgVGhpcyByZXF1aXJlcyBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgc3RvcmVkIGluIG1lbW9yeSB1bnRpbCB0aGUgZmlsZSBpcworIyBhYm91dCB0byBiZSB3cml0dGVuLiBUaGlzIGluY3VycyBhIG1lbW9yeSBhbmQgc3BlZWQgcGVuYWx0eSBhbmQgbWF5IG5vdCBiZQorIyBzdWl0YWJsZSBmb3IgdmVyeSBsYXJnZSBmaWxlcy4KKyMKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3RhYmxlKCkKKyMKKyMgV3JpdGUgY2VsbCBkYXRhIHN0b3JlZCBpbiB0aGUgd29ya3NoZWV0IHJvdy9jb2wgdGFibGUuCisjCisjIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gY29tcGF0aWJpdHlfbW9kZSgpIGlzIGluIG9wZXJhdGlvbi4KKyMKKyMgVGhpcyBtZXRob2Qgd3JpdGVzIFJPVyBkYXRhLCB0aGVuIGNlbGwgZGF0YSAoTlVNQkVSLCBMQUJFTFNTVCwgZXRjKSBhbmQgdGhlbgorIyBEQkNFTEwgcmVjb3JkcyBpbiBibG9ja3Mgb2YgMzIgcm93cy4gVGhpcyBpcyBleHBsYWluZWQgaW4gZGV0YWlsIChmb3IgYQorIyBjaGFuZ2UpIGluIHRoZSBFeGNlbCBTREsgYW5kIGluIHRoZSBPT28gRXhjZWwgZmlsZSBmb3JtYXQgZG9jLgorIworc3ViIF9zdG9yZV90YWJsZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIHVubGVzcyAkc2VsZi0+e19jb21wYXRpYmlsaXR5fTsKKworICAgICMgT2Zmc2V0IGZyb20gdGhlIERCQ0VMTCByZWNvcmQgYmFjayB0byB0aGUgZmlyc3QgUk9XIG9mIHRoZSAzMiByb3cgYmxvY2suCisgICAgbXkgJHJvd19vZmZzZXQgPSAwOworCisgICAgIyBUcmFjayByb3dzIHRoYXQgaGF2ZSBjZWxsIGRhdGEgb3IgbW9kaWZpZWQgYnkgc2V0X3JvdygpLgorICAgIG15IEB3cml0dGVuX3Jvd3M7CisKKworICAgICMgV3JpdGUgdGhlIFJPVyByZWNvcmRzIHdpdGggdXBkYXRlZCBtYXgvbWluIGNvbCBmaWVsZHMuCisgICAgIworICAgIGZvciBteSAkcm93ICgwIC4uICRzZWxmLT57X2RpbV9yb3dtYXh9IC0xKSB7CisgICAgICAgICMgU2tpcCB1bmxlc3MgdGhlcmUgaXMgY2VsbCBkYXRhIGluIHJvdyBvciB0aGUgcm93IGhhcyBiZWVuIG1vZGlmaWVkLgorICAgICAgICBuZXh0IHVubGVzcyAkc2VsZi0+e190YWJsZX0tPlskcm93XSBvciAkc2VsZi0+e19yb3dfZGF0YX0tPnskcm93fTsKKworICAgICAgICAjIFN0b3JlIHRoZSByb3dzIHdpdGggZGF0YS4KKyAgICAgICAgcHVzaCBAd3JpdHRlbl9yb3dzLCAkcm93OworCisgICAgICAgICMgSW5jcmVhc2UgdGhlIHJvdyBvZmZzZXQgYnkgdGhlIGxlbmd0aCBvZiBhIFJPVyByZWNvcmQ7CisgICAgICAgICRyb3dfb2Zmc2V0ICs9IDIwOworCisgICAgICAgICMgVGhlIG1heC9taW4gY29scyBpbiB0aGUgUk9XIHJlY29yZHMgYXJlIHRoZSBzYW1lIGFzIGluIERJTUVOU0lPTlMuCisgICAgICAgIG15ICRjb2xfbWluID0gJHNlbGYtPntfZGltX2NvbG1pbn07CisgICAgICAgIG15ICRjb2xfbWF4ID0gJHNlbGYtPntfZGltX2NvbG1heH07CisKKyAgICAgICAgIyBXcml0ZSBhIHVzZXIgc3BlY2lmaWVkIFJPVyByZWNvcmQgKG1vZGlmaWVkIGJ5IHNldF9yb3coKSkuCisgICAgICAgIGlmICgkc2VsZi0+e19yb3dfZGF0YX0tPnskcm93fSkgeworICAgICAgICAgICAgIyBSZXdyaXRlIHRoZSBtaW4gYW5kIG1heCBjb2xzIGZvciB1c2VyIGRlZmluZWQgcm93IHJlY29yZC4KKyAgICAgICAgICAgIG15ICRwYWNrZWRfcm93ID0gJHNlbGYtPntfcm93X2RhdGF9LT57JHJvd307CisgICAgICAgICAgICBzdWJzdHIgJHBhY2tlZF9yb3csIDYsIDQsIHBhY2soJ3Z2JywgJGNvbF9taW4sICRjb2xfbWF4KTsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRwYWNrZWRfcm93KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgV3JpdGUgYSBkZWZhdWx0IFJvdyByZWNvcmQgaWYgdGhlcmUgaXNuJ3QgYSAgdXNlciBkZWZpbmVkIFJPVy4KKyAgICAgICAgICAgICRzZWxmLT5fd3JpdGVfcm93X2RlZmF1bHQoJHJvdywgJGNvbF9taW4sICRjb2xfbWF4KTsKKyAgICAgICAgfQorCisKKworICAgICAgICAjIElmIDMyIHJvd3MgaGF2ZSBiZWVuIHdyaXR0ZW4gb3Igd2UgYXJlIGF0IHRoZSBsYXN0IHJvdyBpbiB0aGUKKyAgICAgICAgIyB3b3Jrc2hlZXQgdGhlbiB3cml0ZSB0aGUgY2VsbCBkYXRhIGFuZCB0aGUgREJDRUxMIHJlY29yZC4KKyAgICAgICAgIworICAgICAgICBpZiAoQHdyaXR0ZW5fcm93cyA9PSAzMiBvciAkcm93ID09ICRzZWxmLT57X2RpbV9yb3dtYXh9IC0xKSB7CisKKyAgICAgICAgICAgICMgT2Zmc2V0cyB0byB0aGUgZmlyc3QgY2VsbCBvZiBlYWNoIHJvdy4KKyAgICAgICAgICAgIG15IEBjZWxsX29mZnNldHM7CisgICAgICAgICAgICBwdXNoIEBjZWxsX29mZnNldHMsICRyb3dfb2Zmc2V0IC0gMjA7CisKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIGNlbGwgZGF0YSBpbiBlYWNoIHJvdyBhbmQgc3VtIHRoZWlyIGxlbmd0aHMgZm9yIHRoZQorICAgICAgICAgICAgIyBjZWxsIG9mZnNldHMuCisgICAgICAgICAgICAjCisgICAgICAgICAgICBmb3IgbXkgJHJvdyAoQHdyaXR0ZW5fcm93cykgeworICAgICAgICAgICAgICAgIG15ICRjZWxsX29mZnNldCA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IgbXkgJGNvbCAoQHskc2VsZi0+e190YWJsZX0tPlskcm93XX0pIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCB1bmxlc3MgJGNvbDsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGNvbCk7CisgICAgICAgICAgICAgICAgICAgIG15ICRsZW5ndGggPSBsZW5ndGggJGNvbDsKKyAgICAgICAgICAgICAgICAgICAgJHJvd19vZmZzZXQgICs9ICRsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICRjZWxsX29mZnNldCArPSAkbGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdXNoIEBjZWxsX29mZnNldHMsICRjZWxsX29mZnNldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBUaGUgbGFzdCBvZmZzZXQgaXNuJ3QgcmVxdWlyZWQuCisgICAgICAgICAgICBwb3AgQGNlbGxfb2Zmc2V0czsKKworICAgICAgICAgICAgIyBTdG9yZXMgdGhlIERCQ0VMTCBvZmZzZXQgZm9yIHVzZSBpbiB0aGUgSU5ERVggcmVjb3JkLgorICAgICAgICAgICAgcHVzaCBAeyRzZWxmLT57X2RiX2luZGljZXN9fSwgJHNlbGYtPntfZGF0YXNpemV9OworCisgICAgICAgICAgICAjIFdyaXRlIHRoZSBEQkNFTEwgcmVjb3JkLgorICAgICAgICAgICAgJHNlbGYtPl9zdG9yZV9kYmNlbGwoJHJvd19vZmZzZXQsIEBjZWxsX29mZnNldHMpOworCisgICAgICAgICAgICAjIENsZWFyIHRoZSB2YXJpYWJsZSBmb3IgdGhlIG5leHQgYmxvY2sgb2Ygcm93cy4KKyAgICAgICAgICAgIEB3cml0dGVuX3Jvd3MgICA9ICgpOworICAgICAgICAgICAgQGNlbGxfb2Zmc2V0cyAgID0gKCk7CisgICAgICAgICAgICAkcm93X29mZnNldCAgICAgPSAwOworICAgICAgICB9CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2RiY2VsbCgpCisjCisjIFN0b3JlIHRoZSBEQkNFTEwgcmVjb3JkIHVzaW5nIHRoZSBvZmZzZXQgY2FsY3VsYXRlZCBpbiBfc3RvcmVfdGFibGUoKS4KKyMKKyMgVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiBjb21wYXRpYml0eV9tb2RlKCkgaXMgaW4gb3BlcmF0aW9uLgorIworc3ViIF9zdG9yZV9kYmNlbGwgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRyb3dfb2Zmc2V0ICAgICAgPSBzaGlmdDsKKyAgICBteSBAY2VsbF9vZmZzZXRzICAgID0gQF87CisKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwRDc7ICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDQgKyAyICogQGNlbGxfb2Zmc2V0czsgICMgQnl0ZXMgdG8gZm9sbG93CisKKworICAgIG15ICRoZWFkZXIgICAgICAgICAgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgICAgICAgICAgICA9IHBhY2sgJ1YnLCAgJHJvd19vZmZzZXQ7CisgICAgICAgJGRhdGEgICAgICAgICAgIC49IHBhY2sgJ3YnLCAkXyBmb3IgQGNlbGxfb2Zmc2V0czsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9pbmRleCgpCisjCisjIFN0b3JlIHRoZSBJTkRFWCByZWNvcmQgdXNpbmcgdGhlIERCQ0VMTCBvZmZzZXRzIGNhbGN1bGF0ZWQgaW4gX3N0b3JlX3RhYmxlKCkuCisjCisjIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gY29tcGF0aWJpdHlfbW9kZSgpIGlzIGluIG9wZXJhdGlvbi4KKyMKK3N1YiBfc3RvcmVfaW5kZXggeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiB1bmxlc3MgJHNlbGYtPntfY29tcGF0aWJpbGl0eX07CisKKyAgICBteSBAaW5kaWNlcyAgICAgPSBAeyRzZWxmLT57X2RiX2luZGljZXN9fTsKKyAgICBteSAkcmVzZXJ2ZWQgICAgPSAweDAwMDAwMDAwOworICAgIG15ICRyb3dfbWluICAgICA9ICRzZWxmLT57X2RpbV9yb3dtaW59OworICAgIG15ICRyb3dfbWF4ICAgICA9ICRzZWxmLT57X2RpbV9yb3dtYXh9OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMjBCOyAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMTYgKyA0ICogQGluZGljZXM7ICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjayAndnYnLCAgICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjayAnVlZWVicsICRyZXNlcnZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJvd19taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3dfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzZXJ2ZWQ7CisKKyAgICBmb3IgbXkgJGluZGV4IChAaW5kaWNlcykgeworICAgICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkaW5kZXggKyAkc2VsZi0+e19vZmZzZXR9ICsgMjAgKyAkbGVuZ3RoICs0OworICAgIH0KKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGluc2VydF9jaGFydCgkcm93LCAkY29sLCAkY2hhcnQsICR4LCAkeSwgJHNjYWxlX3gsICRzY2FsZV95KQorIworIyBJbnNlcnQgYSBjaGFydCBpbnRvIGEgd29ya3NoZWV0LiBUaGUgJGNoYXJ0IGFyZ3VtZW50IHNob3VsZCBiZSBhIENoYXJ0CisjIG9iamVjdCBvciBlbHNlIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBmaWxlbmFtZSBvZiBhbiBleHRlcm5hbCBiaW5hcnkgZmlsZS4KKyMgVGhlIGxhdHRlciBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisjCitzdWIgaW5zZXJ0X2NoYXJ0IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBteSAkcm93ICAgICAgICAgPSAkX1swXTsKKyAgICBteSAkY29sICAgICAgICAgPSAkX1sxXTsKKyAgICBteSAkY2hhcnQgICAgICAgPSAkX1syXTsKKyAgICBteSAkeF9vZmZzZXQgICAgPSAkX1szXSB8fCAwOworICAgIG15ICR5X29mZnNldCAgICA9ICRfWzRdIHx8IDA7CisgICAgbXkgJHNjYWxlX3ggICAgID0gJF9bNV0gfHwgMTsKKyAgICBteSAkc2NhbGVfeSAgICAgPSAkX1s2XSB8fCAxOworCisgICAgY3JvYWsgIkluc3VmZmljaWVudCBhcmd1bWVudHMgaW4gaW5zZXJ0X2NoYXJ0KCkiIHVubGVzcyBAXyA+PSAzOworCisgICAgaWYgKCByZWYgJGNoYXJ0ICkgeworICAgICAgICAjIENoZWNrIGZvciBhIENoYXJ0IG9iamVjdC4KKyAgICAgICAgY3JvYWsgIk5vdCBhIENoYXJ0IG9iamVjdCBpbiBpbnNlcnRfY2hhcnQoKSIKKyAgICAgICAgICB1bmxlc3MgJGNoYXJ0LT5pc2EoICdTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQnICk7CisKKyAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBjaGFydCBpcyBhbiBlbWJlZGRlZCBzdHlsZSBjaGFydC4KKyAgICAgICAgY3JvYWsgIk5vdCBhIGVtYmVkZGVkIHN0eWxlIENoYXJ0IG9iamVjdCBpbiBpbnNlcnRfY2hhcnQoKSIKKyAgICAgICAgICB1bmxlc3MgJGNoYXJ0LT57X2VtYmVkZGVkfTsKKworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAjIEFzc3VtZSBhbiBleHRlcm5hbCBiaW4gZmlsZW5hbWUuCisgICAgICAgIGNyb2FrICJDb3VsZG4ndCBsb2NhdGUgJGNoYXJ0IGluIGluc2VydF9jaGFydCgpOiAkISIgdW5sZXNzIC1lICRjaGFydDsKKyAgICB9CisKKyAgICAkc2VsZi0+e19jaGFydHN9LT57JHJvd30tPnskY29sfSA9ICBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY2FsZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY2FsZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CisKK30KKworIyBPbGRlciBtZXRob2QgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisqZW1iZWRfY2hhcnQgPSAqaW5zZXJ0X2NoYXJ0OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGluc2VydF9pbWFnZSgkcm93LCAkY29sLCAkZmlsZW5hbWUsICR4LCAkeSwgJHNjYWxlX3gsICRzY2FsZV95KQorIworIyBJbnNlcnQgYW4gaW1hZ2UgaW50byB0aGUgd29ya3NoZWV0LgorIworc3ViIGluc2VydF9pbWFnZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMF07CisgICAgbXkgJGNvbCAgICAgICAgID0gJF9bMV07CisgICAgbXkgJGltYWdlICAgICAgID0gJF9bMl07CisgICAgbXkgJHhfb2Zmc2V0ICAgID0gJF9bM10gfHwgMDsKKyAgICBteSAkeV9vZmZzZXQgICAgPSAkX1s0XSB8fCAwOworICAgIG15ICRzY2FsZV94ICAgICA9ICRfWzVdIHx8IDE7CisgICAgbXkgJHNjYWxlX3kgICAgID0gJF9bNl0gfHwgMTsKKworICAgIGNyb2FrICJJbnN1ZmZpY2llbnQgYXJndW1lbnRzIGluIGluc2VydF9pbWFnZSgpIiB1bmxlc3MgQF8gPj0gMzsKKyAgICBjcm9hayAiQ291bGRuJ3QgbG9jYXRlICRpbWFnZTogJCEiICAgICAgICAgICAgICAgdW5sZXNzIC1lICRpbWFnZTsKKworICAgICRzZWxmLT57X2ltYWdlc30tPnskcm93fS0+eyRjb2x9ID0gWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NhbGVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NhbGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOworCit9CisKKyMgT2xkZXIgbWV0aG9kIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorKmluc2VydF9iaXRtYXAgPSAqaW5zZXJ0X2ltYWdlOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIF9wb3NpdGlvbl9vYmplY3QoKQorIworIyBDYWxjdWxhdGUgdGhlIHZlcnRpY2VzIHRoYXQgZGVmaW5lIHRoZSBwb3NpdGlvbiBvZiBhIGdyYXBoaWNhbCBvYmplY3Qgd2l0aGluCisjIHRoZSB3b3Jrc2hlZXQuCisjCisjICAgICAgICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCisjICAgICAgICAgfCAgICAgQSAgICAgIHwgICAgICBCICAgICB8CisjICAgKy0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCisjICAgfCAgICAgfCh4MSx5MSkgICAgIHwgICAgICAgICAgICB8CisjICAgfCAgMSAgfChBMSkuX19fX19fX3xfX19fX18gICAgICB8CisjICAgfCAgICAgfCAgICB8ICAgICAgICAgICAgICB8ICAgICB8CisjICAgfCAgICAgfCAgICB8ICAgICAgICAgICAgICB8ICAgICB8CisjICAgKy0tLS0tKy0tLS18ICAgIEJJVE1BUCAgICB8LS0tLS0rCisjICAgfCAgICAgfCAgICB8ICAgICAgICAgICAgICB8ICAgICB8CisjICAgfCAgMiAgfCAgICB8X19fX19fX19fX19fX18uICAgICB8CisjICAgfCAgICAgfCAgICAgICAgICAgIHwgICAgICAgIChCMil8CisjICAgfCAgICAgfCAgICAgICAgICAgIHwgICAgICh4Mix5Mil8CisjICAgKy0tLS0gKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCisjCisjIEV4YW1wbGUgb2YgYSBiaXRtYXAgdGhhdCBjb3ZlcnMgc29tZSBvZiB0aGUgYXJlYSBmcm9tIGNlbGwgQTEgdG8gY2VsbCBCMi4KKyMKKyMgQmFzZWQgb24gdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGJpdG1hcCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSA4IHZhcnM6CisjICAgICAkY29sX3N0YXJ0LCAkcm93X3N0YXJ0LCAkY29sX2VuZCwgJHJvd19lbmQsICR4MSwgJHkxLCAkeDIsICR5Mi4KKyMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNlbGxzIGFyZSBhbHNvIHZhcmlhYmxlIGFuZCBoYXZlIHRvIGJlIHRha2VuIGludG8KKyMgYWNjb3VudC4KKyMgVGhlIHZhbHVlcyBvZiAkY29sX3N0YXJ0IGFuZCAkcm93X3N0YXJ0IGFyZSBwYXNzZWQgaW4gZnJvbSB0aGUgY2FsbGluZworIyBmdW5jdGlvbi4gVGhlIHZhbHVlcyBvZiAkY29sX2VuZCBhbmQgJHJvd19lbmQgYXJlIGNhbGN1bGF0ZWQgYnkgc3VidHJhY3RpbmcKKyMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGJpdG1hcCBmcm9tIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZQorIyB1bmRlcmx5aW5nIGNlbGxzLgorIyBUaGUgdmVydGljZXMgYXJlIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHVuZGVybHlpbmcgY2VsbCB3aWR0aCBhcworIyBmb2xsb3dzIChyaHMgdmFsdWVzIGFyZSBpbiBwaXhlbHMpOgorIworIyAgICAgICB4MSA9IFggLyBXICoxMDI0CisjICAgICAgIHkxID0gWSAvIEggKjI1NgorIyAgICAgICB4MiA9IChYLTEpIC8gVyAqMTAyNAorIyAgICAgICB5MiA9IChZLTEpIC8gSCAqMjU2CisjCisjICAgICAgIFdoZXJlOiAgWCBpcyBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHVuZGVybHlpbmcgY2VsbAorIyAgICAgICAgICAgICAgIFkgaXMgZGlzdGFuY2UgZnJvbSB0aGUgdG9wIG9mIHRoZSB1bmRlcmx5aW5nIGNlbGwKKyMgICAgICAgICAgICAgICBXIGlzIHRoZSB3aWR0aCBvZiB0aGUgY2VsbAorIyAgICAgICAgICAgICAgIEggaXMgdGhlIGhlaWdodCBvZiB0aGUgY2VsbAorIworIyBOb3RlOiB0aGUgU0RLIGluY29ycmVjdGx5IHN0YXRlcyB0aGF0IHRoZSBoZWlnaHQgc2hvdWxkIGJlIGV4cHJlc3NlZCBhcyBhCisjIHBlcmNlbnRhZ2Ugb2YgMTAyNC4KKyMKK3N1YiBfcG9zaXRpb25fb2JqZWN0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkY29sX3N0YXJ0OyAgIyBDb2wgY29udGFpbmluZyB1cHBlciBsZWZ0IGNvcm5lciBvZiBvYmplY3QKKyAgICBteSAkeDE7ICAgICAgICAgIyBEaXN0YW5jZSB0byBsZWZ0IHNpZGUgb2Ygb2JqZWN0CisKKyAgICBteSAkcm93X3N0YXJ0OyAgIyBSb3cgY29udGFpbmluZyB0b3AgbGVmdCBjb3JuZXIgb2Ygb2JqZWN0CisgICAgbXkgJHkxOyAgICAgICAgICMgRGlzdGFuY2UgdG8gdG9wIG9mIG9iamVjdAorCisgICAgbXkgJGNvbF9lbmQ7ICAgICMgQ29sIGNvbnRhaW5pbmcgbG93ZXIgcmlnaHQgY29ybmVyIG9mIG9iamVjdAorICAgIG15ICR4MjsgICAgICAgICAjIERpc3RhbmNlIHRvIHJpZ2h0IHNpZGUgb2Ygb2JqZWN0CisKKyAgICBteSAkcm93X2VuZDsgICAgIyBSb3cgY29udGFpbmluZyBib3R0b20gcmlnaHQgY29ybmVyIG9mIG9iamVjdAorICAgIG15ICR5MjsgICAgICAgICAjIERpc3RhbmNlIHRvIGJvdHRvbSBvZiBvYmplY3QKKworICAgIG15ICR3aWR0aDsgICAgICAjIFdpZHRoIG9mIGltYWdlIGZyYW1lCisgICAgbXkgJGhlaWdodDsgICAgICMgSGVpZ2h0IG9mIGltYWdlIGZyYW1lCisKKyAgICAoJGNvbF9zdGFydCwgJHJvd19zdGFydCwgJHgxLCAkeTEsICR3aWR0aCwgJGhlaWdodCkgPSBAXzsKKworCisgICAgIyBBZGp1c3Qgc3RhcnQgY29sdW1uIGZvciBvZmZzZXRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiB0aGUgY29sIHdpZHRoCisgICAgd2hpbGUgKCR4MSA+PSAkc2VsZi0+X3NpemVfY29sKCRjb2xfc3RhcnQpKSB7CisgICAgICAgICR4MSAtPSAkc2VsZi0+X3NpemVfY29sKCRjb2xfc3RhcnQpOworICAgICAgICAkY29sX3N0YXJ0Kys7CisgICAgfQorCisgICAgIyBBZGp1c3Qgc3RhcnQgcm93IGZvciBvZmZzZXRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiB0aGUgcm93IGhlaWdodAorICAgIHdoaWxlICgkeTEgPj0gJHNlbGYtPl9zaXplX3Jvdygkcm93X3N0YXJ0KSkgeworICAgICAgICAkeTEgLT0gJHNlbGYtPl9zaXplX3Jvdygkcm93X3N0YXJ0KTsKKyAgICAgICAgJHJvd19zdGFydCsrOworICAgIH0KKworCisgICAgIyBJbml0aWFsaXNlIGVuZCBjZWxsIHRvIHRoZSBzYW1lIGFzIHRoZSBzdGFydCBjZWxsCisgICAgJGNvbF9lbmQgICAgPSAkY29sX3N0YXJ0OworICAgICRyb3dfZW5kICAgID0gJHJvd19zdGFydDsKKworICAgICR3aWR0aCAgICAgID0gJHdpZHRoICArICR4MTsKKyAgICAkaGVpZ2h0ICAgICA9ICRoZWlnaHQgKyAkeTE7CisKKworICAgICMgU3VidHJhY3QgdGhlIHVuZGVybHlpbmcgY2VsbCB3aWR0aHMgdG8gZmluZCB0aGUgZW5kIGNlbGwgb2YgdGhlIGltYWdlCisgICAgd2hpbGUgKCR3aWR0aCA+PSAkc2VsZi0+X3NpemVfY29sKCRjb2xfZW5kKSkgeworICAgICAgICAkd2lkdGggLT0gJHNlbGYtPl9zaXplX2NvbCgkY29sX2VuZCk7CisgICAgICAgICRjb2xfZW5kKys7CisgICAgfQorCisgICAgIyBTdWJ0cmFjdCB0aGUgdW5kZXJseWluZyBjZWxsIGhlaWdodHMgdG8gZmluZCB0aGUgZW5kIGNlbGwgb2YgdGhlIGltYWdlCisgICAgd2hpbGUgKCRoZWlnaHQgPj0gJHNlbGYtPl9zaXplX3Jvdygkcm93X2VuZCkpIHsKKyAgICAgICAgJGhlaWdodCAtPSAkc2VsZi0+X3NpemVfcm93KCRyb3dfZW5kKTsKKyAgICAgICAgJHJvd19lbmQrKzsKKyAgICB9CisKKyAgICAjIEJpdG1hcCBpc24ndCBhbGxvd2VkIHRvIHN0YXJ0IG9yIGZpbmlzaCBpbiBhIGhpZGRlbiBjZWxsLCBpLmUuIGEgY2VsbAorICAgICMgd2l0aCB6ZXJvIGVpZ2h0IG9yIHdpZHRoLgorICAgICMKKyAgICByZXR1cm4gaWYgJHNlbGYtPl9zaXplX2NvbCgkY29sX3N0YXJ0KSA9PSAwOworICAgIHJldHVybiBpZiAkc2VsZi0+X3NpemVfY29sKCRjb2xfZW5kKSAgID09IDA7CisgICAgcmV0dXJuIGlmICRzZWxmLT5fc2l6ZV9yb3coJHJvd19zdGFydCkgPT0gMDsKKyAgICByZXR1cm4gaWYgJHNlbGYtPl9zaXplX3Jvdygkcm93X2VuZCkgICA9PSAwOworCisgICAgIyBDb252ZXJ0IHRoZSBwaXhlbCB2YWx1ZXMgdG8gdGhlIHBlcmNlbnRhZ2UgdmFsdWUgZXhwZWN0ZWQgYnkgRXhjZWwKKyAgICAkeDEgPSAkeDEgICAgIC8gJHNlbGYtPl9zaXplX2NvbCgkY29sX3N0YXJ0KSAgICogMTAyNDsKKyAgICAkeTEgPSAkeTEgICAgIC8gJHNlbGYtPl9zaXplX3Jvdygkcm93X3N0YXJ0KSAgICogIDI1NjsKKyAgICAkeDIgPSAkd2lkdGggIC8gJHNlbGYtPl9zaXplX2NvbCgkY29sX2VuZCkgICAgICogMTAyNDsKKyAgICAkeTIgPSAkaGVpZ2h0IC8gJHNlbGYtPl9zaXplX3Jvdygkcm93X2VuZCkgICAgICogIDI1NjsKKworICAgICMgU2ltdWxhdGUgY2VpbCgpIHdpdGhvdXQgY2FsbGluZyBQT1NJWDo6Y2VpbCgpLgorICAgICR4MSA9IGludCgkeDEgKzAuNSk7CisgICAgJHkxID0gaW50KCR5MSArMC41KTsKKyAgICAkeDIgPSBpbnQoJHgyICswLjUpOworICAgICR5MiA9IGludCgkeTIgKzAuNSk7CisKKyAgICByZXR1cm4oICRjb2xfc3RhcnQsICR4MSwKKyAgICAgICAgICAgICRyb3dfc3RhcnQsICR5MSwKKyAgICAgICAgICAgICRjb2xfZW5kLCAgICR4MiwKKyAgICAgICAgICAgICRyb3dfZW5kLCAgICR5MgorICAgICAgICAgICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc2l6ZV9jb2woJGNvbCkKKyMKKyMgQ29udmVydCB0aGUgd2lkdGggb2YgYSBjZWxsIGZyb20gdXNlcidzIHVuaXRzIHRvIHBpeGVscy4gRXhjZWwgcm91bmRzIHRoZQorIyBjb2x1bW4gd2lkdGggdG8gdGhlIG5lYXJlc3QgcGl4ZWwuIElmIHRoZSB3aWR0aCBoYXNuJ3QgYmVlbiBzZXQgYnkgdGhlIHVzZXIKKyMgd2UgdXNlIHRoZSBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgY29sdW1uIGlzIGhpZGRlbiB3ZSB1c2UgYSB2YWx1ZSBvZiB6ZXJvLgorIworc3ViIF9zaXplX2NvbCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRjb2wgID0gJF9bMF07CisKKyAgICAjIExvb2sgdXAgdGhlIGNlbGwgdmFsdWUgdG8gc2VlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQKKyAgICBpZiAoZXhpc3RzICRzZWxmLT57X2NvbF9zaXplc30tPnskY29sfSkgeworICAgICAgICBteSAkd2lkdGggPSAkc2VsZi0+e19jb2xfc2l6ZXN9LT57JGNvbH07CisKKyAgICAgICAgIyBUaGUgcmVsYXRpb25zaGlwIGlzIGRpZmZlcmVudCBmb3IgdXNlciB1bml0cyBsZXNzIHRoYW4gMS4KKyAgICAgICAgaWYgKCR3aWR0aCA8IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnQoJHdpZHRoICoxMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gaW50KCR3aWR0aCAqNyApICs1OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gNjQ7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3NpemVfcm93KCRyb3cpCisjCisjIENvbnZlcnQgdGhlIGhlaWdodCBvZiBhIGNlbGwgZnJvbSB1c2VyJ3MgdW5pdHMgdG8gcGl4ZWxzLiBCeSBpbnRlcnBvbGF0aW9uCisjIHRoZSByZWxhdGlvbnNoaXAgaXM6IHkgPSA0LzN4LiBJZiB0aGUgaGVpZ2h0IGhhc24ndCBiZWVuIHNldCBieSB0aGUgdXNlciB3ZQorIyB1c2UgdGhlIGRlZmF1bHQgdmFsdWUuIElmIHRoZSByb3cgaXMgaGlkZGVuIHdlIHVzZSBhIHZhbHVlIG9mIHplcm8uIChOb3QKKyMgcG9zc2libGUgdG8gaGlkZSByb3cgeWV0KS4KKyMKK3N1YiBfc2l6ZV9yb3cgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkcm93ICA9ICRfWzBdOworCisgICAgIyBMb29rIHVwIHRoZSBjZWxsIHZhbHVlIHRvIHNlZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkCisgICAgaWYgKGV4aXN0cyAkc2VsZi0+e19yb3dfc2l6ZXN9LT57JHJvd30pIHsKKyAgICAgICAgaWYgKCRzZWxmLT57X3Jvd19zaXplc30tPnskcm93fSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpbnQgKDQvMyAqICRzZWxmLT57X3Jvd19zaXplc30tPnskcm93fSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAxNzsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfem9vbSgkem9vbSkKKyMKKyMKKyMgU3RvcmUgdGhlIHdpbmRvdyB6b29tIGZhY3Rvci4gVGhpcyBzaG91bGQgYmUgYSByZWR1Y2VkIGZyYWN0aW9uIGJ1dCBmb3IKKyMgc2ltcGxpY2l0eSB3ZSB3aWxsIHN0b3JlIGFsbCBmcmFjdGlvbnMgd2l0aCBhIG51bWVyYXRvciBvZiAxMDAuCisjCitzdWIgX3N0b3JlX3pvb20geworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICAjIElmIHNjYWxlIGlzIDEwMCB3ZSBkb24ndCBuZWVkIHRvIHdyaXRlIGEgcmVjb3JkCisgICAgcmV0dXJuIGlmICRzZWxmLT57X3pvb219ID09IDEwMDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDBBMDsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDA0OyAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGggICApOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInZ2IiwgJHNlbGYtPntfem9vbX0sIDEwMCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV91dGYxNmJlX3N0cmluZygkcm93LCAkY29sLCAkc3RyaW5nLCAkZm9ybWF0KQorIworIyBXcml0ZSBhIFVuaWNvZGUgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4gKHplcm8gaW5kZXhlZCkuCisjICRmb3JtYXQgaXMgb3B0aW9uYWwuCisjIFJldHVybnMgIDAgOiBub3JtYWwgdGVybWluYXRpb24KKyMgICAgICAgICAtMSA6IGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzCisjICAgICAgICAgLTIgOiByb3cgb3IgY29sdW1uIG91dCBvZiByYW5nZQorIyAgICAgICAgIC0zIDogbG9uZyBzdHJpbmcgdHJ1bmNhdGVkIHRvIDI1NSBjaGFycworIworc3ViIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgIGlmIChAXyA8IDMpIHsgcmV0dXJuIC0xIH0gICAgICAgICAgICAgICAgICAgICAgICAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMEZEOyAgICAgICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMEE7ICAgICAgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cgICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCByb3cKKyAgICBteSAkY29sICAgICAgICAgPSAkX1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBaZXJvIGluZGV4ZWQgY29sdW1uCisgICAgbXkgJHN0cmxlbiAgICAgID0gbGVuZ3RoKCRfWzJdKTsKKyAgICBteSAkc3RyICAgICAgICAgPSAkX1syXTsKKyAgICBteSAkeGYgICAgICAgICAgPSBfWEYoJHNlbGYsICRyb3csICRjb2wsICRfWzNdKTsgIyBUaGUgY2VsbCBmb3JtYXQKKyAgICBteSAkZW5jb2RpbmcgICAgPSAweDE7CisgICAgbXkgJHN0cl9lcnJvciAgID0gMDsKKworICAgICMgQ2hlY2sgdGhhdCByb3cgYW5kIGNvbCBhcmUgdmFsaWQgYW5kIHN0b3JlIG1heCBhbmQgbWluIHZhbHVlcworICAgIHJldHVybiAtMiBpZiAkc2VsZi0+X2NoZWNrX2RpbWVuc2lvbnMoJHJvdywgJGNvbCk7CisKKyAgICAjIExpbWl0IHRoZSB1dGYxNiBzdHJpbmcgdG8gdGhlIG1heCBudW1iZXIgb2YgY2hhcnMgKG5vdCBieXRlcykuCisgICAgaWYgKCRzdHJsZW4gPiAzMjc2NyogMikgeworICAgICAgICAkc3RyICAgICAgID0gc3Vic3RyKCRzdHIsIDAsIDMyNzY3KjIpOworICAgICAgICAkc3RyX2Vycm9yID0gLTM7CisgICAgfQorCisKKyAgICBteSAkbnVtX2J5dGVzID0gbGVuZ3RoICRzdHI7CisgICAgbXkgJG51bV9jaGFycyA9IGludCgkbnVtX2J5dGVzIC8gMik7CisKKworICAgICMgQ2hlY2sgZm9yIGEgdmFsaWQgMi1ieXRlIGNoYXIgc3RyaW5nLgorICAgIGNyb2FrICJVbmV2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIFVuaWNvZGUgc3RyaW5nIiBpZiAkbnVtX2J5dGVzICUgMjsKKworCisgICAgIyBDaGFuZ2UgZnJvbSBVVEYxNiBiaWctZW5kaWFuIHRvIGxpdHRsZSBlbmRpYW4KKyAgICAkc3RyID0gcGFjayAidioiLCB1bnBhY2sgIm4qIiwgJHN0cjsKKworCisgICAgIyBBZGQgdGhlIGVuY29kaW5nIGFuZCBsZW5ndGggaGVhZGVyIHRvIHRoZSBzdHJpbmcuCisgICAgbXkgJHN0cl9oZWFkZXIgID0gcGFjaygidkMiLCAkbnVtX2NoYXJzLCAkZW5jb2RpbmcpOworICAgICRzdHIgICAgICAgICAgICA9ICRzdHJfaGVhZGVyIC4gJHN0cjsKKworCisgICAgaWYgKG5vdCBleGlzdHMgJHskc2VsZi0+e19zdHJfdGFibGV9fS0+eyRzdHJ9KSB7CisgICAgICAgICR7JHNlbGYtPntfc3RyX3RhYmxlfX0tPnskc3RyfSA9ICR7JHNlbGYtPntfc3RyX3VuaXF1ZX19Kys7CisgICAgfQorCisKKyAgICAkeyRzZWxmLT57X3N0cl90b3RhbH19Kys7CisKKworICAgIG15ICRoZWFkZXIgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICA9IHBhY2soInZ2dlYiLCAkcm93LCAkY29sLCAkeGYsICR7JHNlbGYtPntfc3RyX3RhYmxlfX0tPnskc3RyfSk7CisKKyAgICAjIFN0b3JlIHRoZSBkYXRhIG9yIHdyaXRlIGltbWVkaWF0ZWx5IGRlcGVuZGluZyBvbiB0aGUgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgIGlmICgkc2VsZi0+e19jb21wYXRpYmlsaXR5fSkgeworICAgICAgICAkc2VsZi0+e190YWJsZX0tPlskcm93XS0+WyRjb2xdID0gJGhlYWRlciAuICRkYXRhOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworICAgIH0KKworICAgIHJldHVybiAkc3RyX2Vycm9yOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd3JpdGVfdXRmMTZsZV9zdHJpbmcoJHJvdywgJGNvbCwgJHN0cmluZywgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSBVVEYtMTZMRSBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiAoemVybyBpbmRleGVkKS4KKyMgJGZvcm1hdCBpcyBvcHRpb25hbC4KKyMgUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjICAgICAgICAgLTMgOiBsb25nIHN0cmluZyB0cnVuY2F0ZWQgdG8gMjU1IGNoYXJzCisjCitzdWIgd3JpdGVfdXRmMTZsZV9zdHJpbmcgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgaWYgKEBfIDwgMykgeyByZXR1cm4gLTEgfSAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwRkQ7ICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwQTsgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgICMgWmVybyBpbmRleGVkIHJvdworICAgIG15ICRjb2wgICAgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCBjb2x1bW4KKyAgICBteSAkc3RyICAgICAgICAgPSAkX1syXTsKKyAgICBteSAkZm9ybWF0ICAgICAgPSAkX1szXTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY2VsbCBmb3JtYXQKKworCisgICAgIyBDaGFuZ2UgZnJvbSBVVEYxNiBiaWctZW5kaWFuIHRvIGxpdHRsZSBlbmRpYW4KKyAgICAkc3RyID0gcGFjayAidioiLCB1bnBhY2sgIm4qIiwgJHN0cjsKKworCisgICAgcmV0dXJuICRzZWxmLT53cml0ZV91dGYxNmJlX3N0cmluZygkcm93LCAkY29sLCAkc3RyLCAkZm9ybWF0KTsKK30KKworCisjIE9sZGVyIG1ldGhvZCBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyp3cml0ZV91bmljb2RlICAgID0gKndyaXRlX3V0ZjE2YmVfc3RyaW5nOworKndyaXRlX3VuaWNvZGVfbGUgPSAqd3JpdGVfdXRmMTZsZV9zdHJpbmc7CisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9hdXRvZmlsdGVycygpCisjCisjIEZ1bmN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgY29sdW1ucyB0aGF0IGZvcm0gcGFydCBvZiBhbiBhdXRvZmlsdGVyCisjIHJhbmdlIGFuZCB3cml0ZSBCaWZmIEFVVE9GSUxURVIgcmVjb3JkcyBpZiBhIGZpbHRlciBleHByZXNzaW9uIGhhcyBiZWVuIHNldC4KKyMKK3N1YiBfc3RvcmVfYXV0b2ZpbHRlcnMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgU2tpcCBhbGwgY29sdW1ucyBpZiBubyBmaWx0ZXIgaGF2ZSBiZWVuIHNldC4KKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X2ZpbHRlcl9vbn07CisKKyAgICBteSAodW5kZWYsIHVuZGVmLCAkY29sMSwgJGNvbDIpID0gQHskc2VsZi0+e19maWx0ZXJfYXJlYX19OworCisgICAgZm9yIG15ICRpICgkY29sMSAuLiAkY29sMikgeworICAgICAgICAjIFJldmVyc2Ugb3JkZXIgc2luY2UgcmVjb3JkcyBhcmUgYmVpbmcgcHJlLXBlbmRlZC4KKyAgICAgICAgbXkgJGNvbCA9ICRjb2wyIC0kaTsKKworICAgICAgICAjIFNraXAgaWYgY29sdW1uIGRvZXNuJ3QgaGF2ZSBhbiBhY3RpdmUgZmlsdGVyLgorICAgICAgICBuZXh0IHVubGVzcyAkc2VsZi0+e19maWx0ZXJfY29sc30tPnskY29sfTsKKworICAgICAgICAjIFJldHJpZXZlIHRoZSBmaWx0ZXIgdG9rZW5zIGFuZCB3cml0ZSB0aGUgYXV0b2ZpbHRlciByZWNvcmRzLgorICAgICAgICBteSBAdG9rZW5zID0gIEB7JHNlbGYtPntfZmlsdGVyX2NvbHN9LT57JGNvbH19OworICAgICAgICAkc2VsZi0+X3N0b3JlX2F1dG9maWx0ZXIoJGNvbCwgQHRva2Vucyk7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F1dG9maWx0ZXIoKQorIworIyBGdW5jdGlvbiB0byB3cml0ZSB3b3Jrc2hlZXQgQVVUT0ZJTFRFUiByZWNvcmRzLiBUaGVzZSBjb250YWluIDIgQmlmZiBEb3BlcgorIyBzdHJ1Y3R1cmVzIHRvIHJlcHJlc2VudCB0aGUgMiBwb3NzaWJsZSBmaWx0ZXIgY29uZGl0aW9ucy4KKyMKK3N1YiBfc3RvcmVfYXV0b2ZpbHRlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMDlFOworICAgIG15ICRsZW5ndGggICAgICAgICAgPSAweDAwMDA7CisKKyAgICBteSAkaW5kZXggICAgICAgICAgID0gJF9bMF07CisgICAgbXkgJG9wZXJhdG9yXzEgICAgICA9ICRfWzFdOworICAgIG15ICR0b2tlbl8xICAgICAgICAgPSAkX1syXTsKKyAgICBteSAkam9pbiAgICAgICAgICAgID0gJF9bM107ICMgQW5kL09yCisgICAgbXkgJG9wZXJhdG9yXzIgICAgICA9ICRfWzRdOworICAgIG15ICR0b2tlbl8yICAgICAgICAgPSAkX1s1XTsKKworICAgIG15ICR0b3AxMF9hY3RpdmUgICAgPSAwOworICAgIG15ICR0b3AxMF9kaXJlY3Rpb24gPSAwOworICAgIG15ICR0b3AxMF9wZXJjZW50ICAgPSAwOworICAgIG15ICR0b3AxMF92YWx1ZSAgICAgPSAxMDE7CisKKyAgICBteSAkZ3JiaXQgICAgICAgPSAkam9pbjsKKyAgICBteSAkb3B0aW1pc2VkXzEgPSAwOworICAgIG15ICRvcHRpbWlzZWRfMiA9IDA7CisgICAgbXkgJGRvcGVyXzEgICAgID0gJyc7CisgICAgbXkgJGRvcGVyXzIgICAgID0gJyc7CisgICAgbXkgJHN0cmluZ18xICAgID0gJyc7CisgICAgbXkgJHN0cmluZ18yICAgID0gJyc7CisKKyAgICAjIEV4Y2VsIHVzZWQgYW4gb3B0aW1pc2F0aW9uIGluIHRoZSBjYXNlIG9mIGEgc2ltcGxlIGVxdWFsaXR5LgorICAgICRvcHRpbWlzZWRfMSA9IDEgaWYgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yXzEgPT0gMjsKKyAgICAkb3B0aW1pc2VkXzIgPSAxIGlmIGRlZmluZWQgJG9wZXJhdG9yXzIgYW5kICRvcGVyYXRvcl8yID09IDI7CisKKworICAgICMgQ29udmVydCBub24tc2ltcGxlIGVxdWFsaXRpZXMgYmFjayB0byB0eXBlIDIuIFNlZSAgX3BhcnNlX2ZpbHRlcl90b2tlbnMoKS4KKyAgICAkb3BlcmF0b3JfMSA9IDIgaWYgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yXzEgPT0gMjI7CisgICAgJG9wZXJhdG9yXzIgPSAyIGlmIGRlZmluZWQgJG9wZXJhdG9yXzIgYW5kICRvcGVyYXRvcl8yID09IDIyOworCisKKyAgICAjIEhhbmRsZSBhICJUb3AiIHN0eWxlIGV4cHJlc3Npb24uCisgICAgaWYgKCRvcGVyYXRvcl8xID49IDMwKSB7CisgICAgICAgICMgUmVtb3ZlIHRoZSBzZWNvbmQgZXhwcmVzc2lvbiBpZiBwcmVzZW50LgorICAgICAgICAkb3BlcmF0b3JfMiA9IHVuZGVmOworICAgICAgICAkdG9rZW5fMiAgICA9IHVuZGVmOworCisgICAgICAgICMgU2V0IHRoZSBhY3RpdmUgZmxhZy4KKyAgICAgICAgJHRvcDEwX2FjdGl2ZSAgICA9IDE7CisKKyAgICAgICAgaWYgKCRvcGVyYXRvcl8xID09IDMwIG9yICRvcGVyYXRvcl8xID09IDMxKSB7CisgICAgICAgICAgICAkdG9wMTBfZGlyZWN0aW9uID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkb3BlcmF0b3JfMSA9PSAzMSBvciAkb3BlcmF0b3JfMSA9PSAzMykgeworICAgICAgICAgICAgJHRvcDEwX3BlcmNlbnQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0b3AxMF9kaXJlY3Rpb24gPT0gMSkgeworICAgICAgICAgICAgJG9wZXJhdG9yXzEgPSA2CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkb3BlcmF0b3JfMSA9IDMKKyAgICAgICAgfQorCisgICAgICAgICR0b3AxMF92YWx1ZSAgICAgPSAkdG9rZW5fMTsKKyAgICAgICAgJHRva2VuXzEgICAgICAgICA9IDA7CisgICAgfQorCisKKyAgICAkZ3JiaXQgICAgIHw9ICRvcHRpbWlzZWRfMSAgICAgIDw8IDI7CisgICAgJGdyYml0ICAgICB8PSAkb3B0aW1pc2VkXzIgICAgICA8PCAzOworICAgICRncmJpdCAgICAgfD0gJHRvcDEwX2FjdGl2ZSAgICAgPDwgNDsKKyAgICAkZ3JiaXQgICAgIHw9ICR0b3AxMF9kaXJlY3Rpb24gIDw8IDU7CisgICAgJGdyYml0ICAgICB8PSAkdG9wMTBfcGVyY2VudCAgICA8PCA2OworICAgICRncmJpdCAgICAgfD0gJHRvcDEwX3ZhbHVlICAgICAgPDwgNzsKKworICAgICgkZG9wZXJfMSwgJHN0cmluZ18xKSA9ICRzZWxmLT5fcGFja19kb3Blcigkb3BlcmF0b3JfMSwgJHRva2VuXzEpOworICAgICgkZG9wZXJfMiwgJHN0cmluZ18yKSA9ICRzZWxmLT5fcGFja19kb3Blcigkb3BlcmF0b3JfMiwgJHRva2VuXzIpOworCisgICAgbXkgJGRhdGEgICAgPSBwYWNrICd2JywgJGluZGV4OworICAgICAgICRkYXRhICAgLj0gcGFjayAndicsICRncmJpdDsKKyAgICAgICAkZGF0YSAgIC49ICRkb3Blcl8xOworICAgICAgICRkYXRhICAgLj0gJGRvcGVyXzI7CisgICAgICAgJGRhdGEgICAuPSAkc3RyaW5nXzE7CisgICAgICAgJGRhdGEgICAuPSAkc3RyaW5nXzI7CisKKyAgICAgICAkbGVuZ3RoICA9IGxlbmd0aCAkZGF0YTsKKyAgICBteSAkaGVhZGVyICA9IHBhY2soJ3Z2JywgICRyZWNvcmQsICRsZW5ndGgpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX2RvcGVyKCkKKyMKKyMgQ3JlYXRlIGEgQmlmZiBEb3BlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgZmlsdGVyIGV4cHJlc3Npb24uIERlcGVuZGluZworIyBvbiB0aGUgdHlwZSBvZiB0aGUgdG9rZW4gd2UgcGFjayBhbiBFbXB0eSwgU3RyaW5nIG9yIE51bWJlciBkb3Blci4KKyMKK3N1YiBfcGFja19kb3BlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRvcGVyYXRvciAgICA9ICRfWzBdOworICAgIG15ICR0b2tlbiAgICAgICA9ICRfWzFdOworCisgICAgbXkgJGRvcGVyICAgICAgID0gJyc7CisgICAgbXkgJHN0cmluZyAgICAgID0gJyc7CisKKworICAgICMgUmV0dXJuIGRlZmF1bHQgZG9wZXIgZm9yIG5vbi1kZWZpbmVkIGZpbHRlcnMuCisgICAgaWYgKG5vdCBkZWZpbmVkICRvcGVyYXRvcikgeworICAgICAgICByZXR1cm4gKCRzZWxmLT5fcGFja191bnVzZWRfZG9wZXIsICRzdHJpbmcpOworICAgIH0KKworCisgICAgaWYgKCR0b2tlbiA9fiAvXmJsYW5rc3xub25ibGFua3MkL2kpIHsKKyAgICAgICAgJGRvcGVyICA9ICRzZWxmLT5fcGFja19ibGFua3NfZG9wZXIoJG9wZXJhdG9yLCAkdG9rZW4pOworICAgIH0KKyAgICBlbHNpZiAoJG9wZXJhdG9yID09IDIgb3IKKyAgICAgICAgJHRva2VuICAgICF+IC9eKFsrLV0/KSg/PVxkfFwuXGQpXGQqKFwuXGQqKT8oW0VlXShbKy1dP1xkKykpPyQvKQorICAgIHsKKyAgICAgICAgIyBFeGNlbCB0cmVhdHMgYWxsIHRva2VucyBhcyBzdHJpbmdzIGlmIHRoZSBvcGVyYXRvciBpcyBlcXVhbGl0eSwgPS4KKworICAgICAgICAkc3RyaW5nID0gJHRva2VuOworCisgICAgICAgIG15ICRlbmNvZGluZyA9IDA7CisgICAgICAgIG15ICRsZW5ndGggICA9IGxlbmd0aCAkc3RyaW5nOworCisgICAgICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICAgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkc3RyaW5nKSkgeworICAgICAgICAgICAgICAgICRzdHJpbmcgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2QkUiLCAkc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgJHN0cmluZyA9IHBhY2soJ0MnLCAkZW5jb2RpbmcpIC4gJHN0cmluZzsKKyAgICAgICAgJGRvcGVyICA9ICRzZWxmLT5fcGFja19zdHJpbmdfZG9wZXIoJG9wZXJhdG9yLCAkbGVuZ3RoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzdHJpbmcgPSAnJzsKKyAgICAgICAgJGRvcGVyICA9ICRzZWxmLT5fcGFja19udW1iZXJfZG9wZXIoJG9wZXJhdG9yLCAkdG9rZW4pOworICAgIH0KKworICAgIHJldHVybiAoJGRvcGVyLCAkc3RyaW5nKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX3VudXNlZF9kb3BlcigpCisjCisjIFBhY2sgYW4gZW1wdHkgRG9wZXIgc3RydWN0dXJlLgorIworc3ViIF9wYWNrX3VudXNlZF9kb3BlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIHJldHVybiBwYWNrICdDMTAnLCAoMHgwKSB4IDEwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhY2tfYmxhbmtzX2RvcGVyKCkKKyMKKyMgUGFjayBhbiBCbGFua3MvTm9uQmxhbmtzIERvcGVyIHN0cnVjdHVyZS4KKyMKK3N1YiBfcGFja19ibGFua3NfZG9wZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkb3BlcmF0b3IgICAgPSAkX1swXTsKKyAgICBteSAkdG9rZW4gICAgICAgPSAkX1sxXTsKKyAgICBteSAkdHlwZTsKKworICAgIGlmICgkdG9rZW4gZXEgJ2JsYW5rcycpIHsKKyAgICAgICAgJHR5cGUgICAgID0gMHgwQzsKKyAgICAgICAgJG9wZXJhdG9yID0gMjsKKworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHR5cGUgICAgID0gMHgwRTsKKyAgICAgICAgJG9wZXJhdG9yID0gNTsKKyAgICB9CisKKworICAgIG15ICRkb3BlciAgICAgICA9IHBhY2sgJ0NDVlYnLCAgICAkdHlwZSwgICAgICAgICAjIERhdGEgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3BlcmF0b3IsICAgICAjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCwgICAgICAgICMgUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOyAgICAgICAgIyBSZXNlcnZlZAorICAgIHJldHVybiAkZG9wZXI7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcGFja19zdHJpbmdfZG9wZXIoKQorIworIyBQYWNrIGFuIHN0cmluZyBEb3BlciBzdHJ1Y3R1cmUuCisjCitzdWIgX3BhY2tfc3RyaW5nX2RvcGVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJG9wZXJhdG9yICAgID0gJF9bMF07CisgICAgbXkgJGxlbmd0aCAgICAgID0gJF9bMV07CisgICAgbXkgJGRvcGVyICAgICAgID0gcGFjayAnQ0NWQ0NDQycsIDB4MDYsICAgICAgICAgICMgRGF0YSB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvcGVyYXRvciwgICAgICMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLCAgICAgICAgIyBSZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuZ3RoLCAgICAgICAjIFN0cmluZyBjaGFyIGxlbmd0aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLCAweDAsIDB4MDsgIyBSZXNlcnZlZAorICAgIHJldHVybiAkZG9wZXI7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcGFja19udW1iZXJfZG9wZXIoKQorIworIyBQYWNrIGFuIElFRUUgZG91YmxlIG51bWJlciBEb3BlciBzdHJ1Y3R1cmUuCisjCitzdWIgX3BhY2tfbnVtYmVyX2RvcGVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJG9wZXJhdG9yICAgID0gJF9bMF07CisgICAgbXkgJG51bWJlciAgICAgID0gJF9bMV07CisgICAgICAgJG51bWJlciAgICAgID0gcGFjayAnZCcsICRudW1iZXI7CisgICAgICAgJG51bWJlciAgICAgID0gcmV2ZXJzZSAkbnVtYmVyIGlmICRzZWxmLT57X2J5dGVfb3JkZXJ9OworCisgICAgbXkgJGRvcGVyICAgICAgID0gcGFjayAnQ0MnLCAweDA0LCAkb3BlcmF0b3I7CisgICAgICAgJGRvcGVyICAgICAgLj0gJG51bWJlcjsKKworICAgIHJldHVybiAkZG9wZXI7Cit9CisKKworIworIyBNZXRob2RzIHJlbGF0ZWQgdG8gY29tbWVudHMgYW5kIE1TTyBvYmplY3RzLgorIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3ByZXBhcmVfaW1hZ2VzKCkKKyMKKyMgVHVybiB0aGUgSG9IIHRoYXQgc3RvcmVzIHRoZSBpbWFnZXMgaW50byBhbiBhcnJheSBmb3IgZWFzaWVyIGhhbmRsaW5nLgorIworc3ViIF9wcmVwYXJlX2ltYWdlcyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJGNvdW50ICAgPSAwOworICAgIG15IEBpbWFnZXM7CisKKworICAgICMgV2Ugc29ydCB0aGUgaW1hZ2VzIGJ5IHJvdyBhbmQgY29sdW1uIGJ1dCB0aGF0IGlzbid0IHN0cmljdGx5IHJlcXVpcmVkLgorICAgICMKKyAgICBteSBAcm93cyA9IHNvcnQgeyRhIDw9PiAkYn0ga2V5cyAleyRzZWxmLT57X2ltYWdlc319OworCisgICAgZm9yIG15ICRyb3cgKEByb3dzKSB7CisgICAgICAgIG15IEBjb2xzID0gc29ydCB7JGEgPD0+ICRifSBrZXlzICV7JHNlbGYtPntfaW1hZ2VzfS0+eyRyb3d9fTsKKworICAgICAgICBmb3IgbXkgJGNvbCAoQGNvbHMpIHsKKyAgICAgICAgICAgIHB1c2ggQGltYWdlcywgJHNlbGYtPntfaW1hZ2VzfS0+eyRyb3d9LT57JGNvbH07CisgICAgICAgICAgICAkY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICRzZWxmLT57X2ltYWdlc30gICAgICAgPSB7fTsKKyAgICAkc2VsZi0+e19pbWFnZXNfYXJyYXl9ID0gXEBpbWFnZXM7CisKKyAgICByZXR1cm4gJGNvdW50OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3ByZXBhcmVfY29tbWVudHMoKQorIworIyBUdXJuIHRoZSBIb0ggdGhhdCBzdG9yZXMgdGhlIGNvbW1lbnRzIGludG8gYW4gYXJyYXkgZm9yIGVhc2llciBoYW5kbGluZy4KKyMKK3N1YiBfcHJlcGFyZV9jb21tZW50cyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJGNvdW50ICAgPSAwOworICAgIG15IEBjb21tZW50czsKKworCisgICAgIyBXZSBzb3J0IHRoZSBjb21tZW50cyBieSByb3cgYW5kIGNvbHVtbiBidXQgdGhhdCBpc24ndCBzdHJpY3RseSByZXF1aXJlZC4KKyAgICAjCisgICAgbXkgQHJvd3MgPSBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJXskc2VsZi0+e19jb21tZW50c319OworCisgICAgZm9yIG15ICRyb3cgKEByb3dzKSB7CisgICAgICAgIG15IEBjb2xzID0gc29ydCB7JGEgPD0+ICRifSBrZXlzICV7JHNlbGYtPntfY29tbWVudHN9LT57JHJvd319OworCisgICAgICAgIGZvciBteSAkY29sIChAY29scykgeworICAgICAgICAgICAgcHVzaCBAY29tbWVudHMsICRzZWxmLT57X2NvbW1lbnRzfS0+eyRyb3d9LT57JGNvbH07CisgICAgICAgICAgICAkY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICRzZWxmLT57X2NvbW1lbnRzfSAgICAgICA9IHt9OworICAgICRzZWxmLT57X2NvbW1lbnRzX2FycmF5fSA9IFxAY29tbWVudHM7CisKKyAgICByZXR1cm4gJGNvdW50OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3ByZXBhcmVfY2hhcnRzKCkKKyMKKyMgVHVybiB0aGUgSG9IIHRoYXQgc3RvcmVzIHRoZSBjaGFydHMgaW50byBhbiBhcnJheSBmb3IgZWFzaWVyIGhhbmRsaW5nLgorIworc3ViIF9wcmVwYXJlX2NoYXJ0cyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJGNvdW50ICAgPSAwOworICAgIG15IEBjaGFydHM7CisKKworICAgICMgV2Ugc29ydCB0aGUgY2hhcnRzIGJ5IHJvdyBhbmQgY29sdW1uIGJ1dCB0aGF0IGlzbid0IHN0cmljdGx5IHJlcXVpcmVkLgorICAgICMKKyAgICBteSBAcm93cyA9IHNvcnQgeyRhIDw9PiAkYn0ga2V5cyAleyRzZWxmLT57X2NoYXJ0c319OworCisgICAgZm9yIG15ICRyb3cgKEByb3dzKSB7CisgICAgICAgIG15IEBjb2xzID0gc29ydCB7JGEgPD0+ICRifSBrZXlzICV7JHNlbGYtPntfY2hhcnRzfS0+eyRyb3d9fTsKKworICAgICAgICBmb3IgbXkgJGNvbCAoQGNvbHMpIHsKKyAgICAgICAgICAgIHB1c2ggQGNoYXJ0cywgJHNlbGYtPntfY2hhcnRzfS0+eyRyb3d9LT57JGNvbH07CisgICAgICAgICAgICAkY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICRzZWxmLT57X2NoYXJ0c30gICAgICAgPSB7fTsKKyAgICAkc2VsZi0+e19jaGFydHNfYXJyYXl9ID0gXEBjaGFydHM7CisKKyAgICByZXR1cm4gJGNvdW50OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2ltYWdlcygpCisjCisjIFN0b3JlIHRoZSBjb2xsZWN0aW9ucyBvZiByZWNvcmRzIHRoYXQgbWFrZSB1cCBpbWFnZXMuCisjCitzdWIgX3N0b3JlX2ltYWdlcyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMEVDOyAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgICAgPSAweDAwMDA7ICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgQGlkcyAgICAgICAgICAgICA9IEB7JHNlbGYtPntfb2JqZWN0X2lkcyAgfX07CisgICAgbXkgJHNwaWQgICAgICAgICAgICA9IHNoaWZ0IEBpZHM7CisKKyAgICBteSBAaW1hZ2VzICAgICAgICAgID0gQHskc2VsZi0+e19pbWFnZXNfYXJyYXl9fTsKKyAgICBteSAkbnVtX2ltYWdlcyAgICAgID0gc2NhbGFyIEBpbWFnZXM7CisKKyAgICBteSAkbnVtX2ZpbHRlcnMgICAgID0gJHNlbGYtPntfZmlsdGVyX2NvdW50fTsKKyAgICBteSAkbnVtX2NvbW1lbnRzICAgID0gQHskc2VsZi0+e19jb21tZW50c19hcnJheX19OworICAgIG15ICRudW1fY2hhcnRzICAgICAgPSBAeyRzZWxmLT57X2NoYXJ0c19hcnJheSAgfX07CisKKyAgICAjIFNraXAgdGhpcyBpZiB0aGVyZSBhcmVuJ3QgYW55IGltYWdlcy4KKyAgICByZXR1cm4gdW5sZXNzICRudW1faW1hZ2VzOworCisgICAgZm9yIG15ICRpICgwIC4uICRudW1faW1hZ2VzLTEpIHsKKyAgICAgICAgbXkgJHJvdyAgICAgICAgID0gICAkaW1hZ2VzWyRpXS0+WzBdOworICAgICAgICBteSAkY29sICAgICAgICAgPSAgICRpbWFnZXNbJGldLT5bMV07CisgICAgICAgIG15ICRuYW1lICAgICAgICA9ICAgJGltYWdlc1skaV0tPlsyXTsKKyAgICAgICAgbXkgJHhfb2Zmc2V0ICAgID0gICAkaW1hZ2VzWyRpXS0+WzNdOworICAgICAgICBteSAkeV9vZmZzZXQgICAgPSAgICRpbWFnZXNbJGldLT5bNF07CisgICAgICAgIG15ICRzY2FsZV94ICAgICA9ICAgJGltYWdlc1skaV0tPls1XTsKKyAgICAgICAgbXkgJHNjYWxlX3kgICAgID0gICAkaW1hZ2VzWyRpXS0+WzZdOworICAgICAgICBteSAkaW1hZ2VfaWQgICAgPSAgICRpbWFnZXNbJGldLT5bN107CisgICAgICAgIG15ICR0eXBlICAgICAgICA9ICAgJGltYWdlc1skaV0tPls4XTsKKyAgICAgICAgbXkgJHdpZHRoICAgICAgID0gICAkaW1hZ2VzWyRpXS0+WzldOworICAgICAgICBteSAkaGVpZ2h0ICAgICAgPSAgICRpbWFnZXNbJGldLT5bMTBdOworCisgICAgICAgICR3aWR0aCAgKj0gJHNjYWxlX3ggaWYgJHNjYWxlX3g7CisgICAgICAgICRoZWlnaHQgKj0gJHNjYWxlX3kgaWYgJHNjYWxlX3k7CisKKworICAgICAgICAjIENhbGN1bGF0ZSB0aGUgcG9zaXRpb25zIG9mIGltYWdlIG9iamVjdC4KKyAgICAgICAgbXkgQHZlcnRpY2VzID0gJHNlbGYtPl9wb3NpdGlvbl9vYmplY3QoICRjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgaWYgKCRpID09IDApIHsKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIHBhcmVudCBNU09EUkFXSUlORyByZWNvcmQuCisgICAgICAgICAgICBteSAkZGdfbGVuZ3RoICAgID0gMTU2ICsgODQqKCRudW1faW1hZ2VzIC0xKTsKKyAgICAgICAgICAgIG15ICRzcGdyX2xlbmd0aCAgPSAxMzIgKyA4NCooJG51bV9pbWFnZXMgLTEpOworCisgICAgICAgICAgICAgICAkZGdfbGVuZ3RoICAgKz0gMTIwICokbnVtX2NoYXJ0czsKKyAgICAgICAgICAgICAgICRzcGdyX2xlbmd0aCArPSAxMjAgKiRudW1fY2hhcnRzOworCisgICAgICAgICAgICAgICAkZGdfbGVuZ3RoICAgKz0gIDk2ICokbnVtX2ZpbHRlcnM7CisgICAgICAgICAgICAgICAkc3Bncl9sZW5ndGggKz0gIDk2ICokbnVtX2ZpbHRlcnM7CisKKyAgICAgICAgICAgICAgICRkZ19sZW5ndGggICArPSAxMjggKiRudW1fY29tbWVudHM7CisgICAgICAgICAgICAgICAkc3Bncl9sZW5ndGggKz0gMTI4ICokbnVtX2NvbW1lbnRzOworCisKKworICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fZGdfY29udGFpbmVyKCRkZ19sZW5ndGgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fZGcoQGlkcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcGdyX2NvbnRhaW5lcigkc3Bncl9sZW5ndGgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDQwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwZ3IoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDB4MCwgJHNwaWQrKywgMHgwMDA1KTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwX2NvbnRhaW5lcig3Nik7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcCg3NSwgJHNwaWQrKywgMHgwQTAwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdF9pbWFnZSgkaW1hZ2VfaWQpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2FuY2hvcigyLCBAdmVydGljZXMpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2RhdGEoKTsKKworICAgICAgICAgICAgJGxlbmd0aCAgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgICAgICAgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBXcml0ZSB0aGUgY2hpbGQgTVNPRFJBV0lJTkcgcmVjb3JkLgorICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDc2KTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDc1LCAkc3BpZCsrLCAweDBBMDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fb3B0X2ltYWdlKCRpbWFnZV9pZCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfYW5jaG9yKDIsIEB2ZXJ0aWNlcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfZGF0YSgpOworCisgICAgICAgICAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgICAgICAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisKKyAgICAgICAgfQorCisgICAgICAgICRzZWxmLT5fc3RvcmVfb2JqX2ltYWdlKCRpKzEpOworICAgIH0KKworICAgICRzZWxmLT57X29iamVjdF9pZHN9LT5bMF0gPSAkc3BpZDsKK30KKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0cygpCisjCisjIFN0b3JlIHRoZSBjb2xsZWN0aW9ucyBvZiByZWNvcmRzIHRoYXQgbWFrZSB1cCBjaGFydHMuCisjCitzdWIgX3N0b3JlX2NoYXJ0cyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMEVDOyAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgICAgPSAweDAwMDA7ICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgQGlkcyAgICAgICAgICAgICA9IEB7JHNlbGYtPntfb2JqZWN0X2lkc319OworICAgIG15ICRzcGlkICAgICAgICAgICAgPSBzaGlmdCBAaWRzOworCisgICAgbXkgQGNoYXJ0cyAgICAgICAgICA9IEB7JHNlbGYtPntfY2hhcnRzX2FycmF5fX07CisgICAgbXkgJG51bV9jaGFydHMgICAgICA9IHNjYWxhciBAY2hhcnRzOworCisgICAgbXkgJG51bV9maWx0ZXJzICAgICA9ICRzZWxmLT57X2ZpbHRlcl9jb3VudH07CisgICAgbXkgJG51bV9jb21tZW50cyAgICA9IEB7JHNlbGYtPntfY29tbWVudHNfYXJyYXl9fTsKKworICAgICMgTnVtYmVyIG9mIG9iamVjdHMgd3JpdHRlbiBzbyBmYXIuCisgICAgbXkgJG51bV9vYmplY3RzICAgICA9IEB7JHNlbGYtPntfaW1hZ2VzX2FycmF5fX07CisKKyAgICAjIFNraXAgdGhpcyBpZiB0aGVyZSBhcmVuJ3QgYW55IGNoYXJ0cy4KKyAgICByZXR1cm4gdW5sZXNzICRudW1fY2hhcnRzOworCisgICAgZm9yIG15ICRpICgwIC4uICRudW1fY2hhcnRzLTEgKSB7CisgICAgICAgIG15ICRyb3cgICAgICAgICA9ICAgJGNoYXJ0c1skaV0tPlswXTsKKyAgICAgICAgbXkgJGNvbCAgICAgICAgID0gICAkY2hhcnRzWyRpXS0+WzFdOworICAgICAgICBteSAkY2hhcnQgICAgICAgID0gICAkY2hhcnRzWyRpXS0+WzJdOworICAgICAgICBteSAkeF9vZmZzZXQgICAgPSAgICRjaGFydHNbJGldLT5bM107CisgICAgICAgIG15ICR5X29mZnNldCAgICA9ICAgJGNoYXJ0c1skaV0tPls0XTsKKyAgICAgICAgbXkgJHNjYWxlX3ggICAgID0gICAkY2hhcnRzWyRpXS0+WzVdOworICAgICAgICBteSAkc2NhbGVfeSAgICAgPSAgICRjaGFydHNbJGldLT5bNl07CisgICAgICAgIG15ICR3aWR0aCAgICAgICA9ICAgNTI2OworICAgICAgICBteSAkaGVpZ2h0ICAgICAgPSAgIDMxOTsKKworICAgICAgICAkd2lkdGggICo9ICRzY2FsZV94IGlmICRzY2FsZV94OworICAgICAgICAkaGVpZ2h0ICo9ICRzY2FsZV95IGlmICRzY2FsZV95OworCisgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBwb3NpdGlvbnMgb2YgY2hhcnQgb2JqZWN0LgorICAgICAgICBteSBAdmVydGljZXMgPSAkc2VsZi0+X3Bvc2l0aW9uX29iamVjdCggJGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCisgICAgICAgIGlmICgkaSA9PSAwIGFuZCBub3QgJG51bV9vYmplY3RzKSB7CisgICAgICAgICAgICAjIFdyaXRlIHRoZSBwYXJlbnQgTVNPRFJBV0lJTkcgcmVjb3JkLgorICAgICAgICAgICAgbXkgJGRnX2xlbmd0aCAgICA9IDE5MiArIDEyMCooJG51bV9jaGFydHMgLTEpOworICAgICAgICAgICAgbXkgJHNwZ3JfbGVuZ3RoICA9IDE2OCArIDEyMCooJG51bV9jaGFydHMgLTEpOworCisgICAgICAgICAgICAgICAkZGdfbGVuZ3RoICAgKz0gIDk2ICokbnVtX2ZpbHRlcnM7CisgICAgICAgICAgICAgICAkc3Bncl9sZW5ndGggKz0gIDk2ICokbnVtX2ZpbHRlcnM7CisKKyAgICAgICAgICAgICAgICRkZ19sZW5ndGggICArPSAxMjggKiRudW1fY29tbWVudHM7CisgICAgICAgICAgICAgICAkc3Bncl9sZW5ndGggKz0gMTI4ICokbnVtX2NvbW1lbnRzOworCisKKyAgICAgICAgICAgIG15ICRkYXRhICAgICAgICA9ICRzZWxmLT5fc3RvcmVfbXNvX2RnX2NvbnRhaW5lcigkZGdfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2RnKEBpZHMpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3Bncl9jb250YWluZXIoJHNwZ3JfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwX2NvbnRhaW5lcig0MCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcGdyKCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcCgweDAsICRzcGlkKyssIDB4MDAwNSk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcF9jb250YWluZXIoMTEyKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDIwMSwgJHNwaWQrKywgMHgwQTAwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdF9jaGFydCgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2FuY2hvcigwLCBAdmVydGljZXMpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2RhdGEoKTsKKworICAgICAgICAgICAgJGxlbmd0aCAgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgICAgICAgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBXcml0ZSB0aGUgY2hpbGQgTVNPRFJBV0lJTkcgcmVjb3JkLgorICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDExMik7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcCgyMDEsICRzcGlkKyssIDB4MEEwMCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19vcHRfY2hhcnQoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9hbmNob3IoMCwgQHZlcnRpY2VzKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9kYXRhKCk7CisKKyAgICAgICAgICAgICRsZW5ndGggICAgICAgICA9IGxlbmd0aCAkZGF0YTsKKyAgICAgICAgICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKworICAgICAgICB9CisKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9vYmpfY2hhcnQoJG51bV9vYmplY3RzKyRpKzEpOworICAgICAgICAkc2VsZi0+X3N0b3JlX2NoYXJ0X2JpbmFyeSgkY2hhcnQpOworICAgIH0KKworCisgICAgIyBTaW11bGF0ZSB0aGUgRVhURVJOU0hFRVQgbGluayBiZXR3ZWVuIHRoZSBjaGFydCBhbmQgZGF0YSB1c2luZyBhIGZvcm11bGEKKyAgICAjIHN1Y2ggYXMgJz1TaGVldDEhQTEnLgorICAgICMgVE9ETy4gV29uJ3Qgd29yayBmb3IgZXh0ZXJuYWwgZGF0YSByZWZzLiBBbHNvIHNob3VsZCB1c2UgYSBtb3JlIGRpcmVjdAorICAgICMgICAgICAgbWV0aG9kLgorICAgICMKKyAgICBteSAkZm9ybXVsYSA9ICI9JyRzZWxmLT57X25hbWV9JyFBMSI7CisgICAgJHNlbGYtPnN0b3JlX2Zvcm11bGEoJGZvcm11bGEpOworCisgICAgJHNlbGYtPntfb2JqZWN0X2lkc30tPlswXSA9ICRzcGlkOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0X2JpbmFyeQorIworIyBBZGQgdGhlIGJpbmFyeSBkYXRhIGZvciBhIGNoYXJ0LiBUaGlzIGNvdWxkIGVpdGhlciBiZSBmcm9tIGEgQ2hhcnQgb2JqZWN0CisjIG9yIGZyb20gYW4gZXh0ZXJuYWwgYmluYXJ5IGZpbGUgKGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkuCisjCitzdWIgX3N0b3JlX2NoYXJ0X2JpbmFyeSB7CisKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkY2hhcnQgPSAkX1swXTsKKyAgICBteSAkdG1wOworCisKKyAgICBpZiAoIHJlZiAkY2hhcnQgKSB7CisgICAgICAgICRjaGFydC0+X2Nsb3NlKCk7CisgICAgICAgIG15ICR0bXAgPSAkY2hhcnQtPmdldF9kYXRhKCk7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCAkdG1wICk7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIG15ICRmaWxlaGFuZGxlID0gRmlsZUhhbmRsZS0+bmV3KCAkY2hhcnQgKQorICAgICAgICAgIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiAkY2hhcnQgaW4gaW5zZXJ0X2NoYXJ0KCk6ICQhLlxuIjsKKworICAgICAgICBiaW5tb2RlKCAkZmlsZWhhbmRsZSApOworCisgICAgICAgIHdoaWxlICggcmVhZCggJGZpbGVoYW5kbGUsICR0bXAsIDQwOTYgKSApIHsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCAkdG1wICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZmlsdGVycygpCisjCisjIFN0b3JlIHRoZSBjb2xsZWN0aW9ucyBvZiByZWNvcmRzIHRoYXQgbWFrZSB1cCBmaWx0ZXJzLgorIworc3ViIF9zdG9yZV9maWx0ZXJzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwRUM7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSBAaWRzICAgICAgICAgICAgID0gQHskc2VsZi0+e19vYmplY3RfaWRzfX07CisgICAgbXkgJHNwaWQgICAgICAgICAgICA9IHNoaWZ0IEBpZHM7CisKKyAgICBteSAkZmlsdGVyX2FyZWEgICAgID0gJHNlbGYtPntfZmlsdGVyX2FyZWF9OworICAgIG15ICRudW1fZmlsdGVycyAgICAgPSAkc2VsZi0+e19maWx0ZXJfY291bnR9OworCisgICAgbXkgJG51bV9jb21tZW50cyAgICA9IEB7JHNlbGYtPntfY29tbWVudHNfYXJyYXl9fTsKKworICAgICMgTnVtYmVyIG9mIG9iamVjdHMgd3JpdHRlbiBzbyBmYXIuCisgICAgbXkgJG51bV9vYmplY3RzICAgICA9IEB7JHNlbGYtPntfaW1hZ2VzX2FycmF5fX0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgQHskc2VsZi0+e19jaGFydHNfYXJyYXl9fTsKKworICAgICMgU2tpcCB0aGlzIGlmIHRoZXJlIGFyZW4ndCBhbnkgZmlsdGVycy4KKyAgICByZXR1cm4gdW5sZXNzICRudW1fZmlsdGVyczsKKworCisgICAgbXkgKCRyb3cxLCAkcm93MiwgJGNvbDEsICRjb2wyKSA9IEAkZmlsdGVyX2FyZWE7CisKKyAgICBmb3IgbXkgJGkgKDAgLi4gJG51bV9maWx0ZXJzLTEgKSB7CisKKyAgICAgICAgbXkgQHZlcnRpY2VzID0gKCAkY29sMSArJGksCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkcm93MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICRjb2wxICskaSArMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICRyb3cxICsxLAorICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgICAgIGlmICgkaSA9PSAwIGFuZCBub3QgJG51bV9vYmplY3RzKSB7CisgICAgICAgICAgICAjIFdyaXRlIHRoZSBwYXJlbnQgTVNPRFJBV0lJTkcgcmVjb3JkLgorICAgICAgICAgICAgbXkgJGRnX2xlbmd0aCAgICA9IDE2OCArIDk2KigkbnVtX2ZpbHRlcnMgLTEpOworICAgICAgICAgICAgbXkgJHNwZ3JfbGVuZ3RoICA9IDE0NCArIDk2KigkbnVtX2ZpbHRlcnMgLTEpOworCisgICAgICAgICAgICAgICAkZGdfbGVuZ3RoICAgKz0gMTI4ICokbnVtX2NvbW1lbnRzOworICAgICAgICAgICAgICAgJHNwZ3JfbGVuZ3RoICs9IDEyOCAqJG51bV9jb21tZW50czsKKworCisgICAgICAgICAgICBteSAkZGF0YSAgICAgICAgPSAkc2VsZi0+X3N0b3JlX21zb19kZ19jb250YWluZXIoJGRnX2xlbmd0aCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19kZyhAaWRzKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwZ3JfY29udGFpbmVyKCRzcGdyX2xlbmd0aCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcF9jb250YWluZXIoNDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BncigpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3AoMHgwLCAkc3BpZCsrLCAweDAwMDUpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDg4KTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDIwMSwgJHNwaWQrKywgMHgwQTAwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdF9maWx0ZXIoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9hbmNob3IoMSwgQHZlcnRpY2VzKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9kYXRhKCk7CisKKyAgICAgICAgICAgICRsZW5ndGggICAgICAgICA9IGxlbmd0aCAkZGF0YTsKKyAgICAgICAgICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIGNoaWxkIE1TT0RSQVdJSU5HIHJlY29yZC4KKyAgICAgICAgICAgIG15ICRkYXRhICAgICAgICA9ICRzZWxmLT5fc3RvcmVfbXNvX3NwX2NvbnRhaW5lcig4OCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcCgyMDEsICRzcGlkKyssIDB4MEEwMCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19vcHRfZmlsdGVyKCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfYW5jaG9yKDEsIEB2ZXJ0aWNlcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfZGF0YSgpOworCisgICAgICAgICAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgICAgICAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisKKyAgICAgICAgfQorCisgICAgICAgICRzZWxmLT5fc3RvcmVfb2JqX2ZpbHRlcigkbnVtX29iamVjdHMrJGkrMSwgJGNvbDEgKyRpKTsKKyAgICB9CisKKworICAgICMgU2ltdWxhdGUgdGhlIEVYVEVSTlNIRUVUIGxpbmsgYmV0d2VlbiB0aGUgZmlsdGVyIGFuZCBkYXRhIHVzaW5nIGEgZm9ybXVsYQorICAgICMgc3VjaCBhcyAnPVNoZWV0MSFBMScuCisgICAgIyBUT0RPLiBXb24ndCB3b3JrIGZvciBleHRlcm5hbCBkYXRhIHJlZnMuIEFsc28gc2hvdWxkIHVzZSBhIG1vcmUgZGlyZWN0CisgICAgIyAgICAgICBtZXRob2QuCisgICAgIworICAgIG15ICRmb3JtdWxhID0gIj0nJHNlbGYtPntfbmFtZX0nIUExIjsKKyAgICAkc2VsZi0+c3RvcmVfZm9ybXVsYSgkZm9ybXVsYSk7CisKKyAgICAkc2VsZi0+e19vYmplY3RfaWRzfS0+WzBdID0gJHNwaWQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY29tbWVudHMoKQorIworIyBTdG9yZSB0aGUgY29sbGVjdGlvbnMgb2YgcmVjb3JkcyB0aGF0IG1ha2UgdXAgY2VsbCBjb21tZW50cy4KKyMKKyMgTk9URTogV2Ugd3JpdGUgdGhlIGNvbW1lbnQgb2JqZWN0cyBsYXN0IHNpbmNlIHRoYXQgbWFrZXMgaXQgYSBsaXR0bGUgZWFzaWVyCisjIHRvIHdyaXRlIHRoZSBOT1RFIHJlY29yZHMgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1TT0RSQVdJSU5HIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX2NvbW1lbnRzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwRUM7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSBAaWRzICAgICAgICAgICAgID0gQHskc2VsZi0+e19vYmplY3RfaWRzfX07CisgICAgbXkgJHNwaWQgICAgICAgICAgICA9IHNoaWZ0IEBpZHM7CisKKyAgICBteSBAY29tbWVudHMgICAgICAgID0gQHskc2VsZi0+e19jb21tZW50c19hcnJheX19OworICAgIG15ICRudW1fY29tbWVudHMgICAgPSBzY2FsYXIgQGNvbW1lbnRzOworCisgICAgIyBOdW1iZXIgb2Ygb2JqZWN0cyB3cml0dGVuIHNvIGZhci4KKyAgICBteSAkbnVtX29iamVjdHMgICAgID0gQHskc2VsZi0+e19pbWFnZXNfYXJyYXl9fQorICAgICAgICAgICAgICAgICAgICAgICAgKyAgICRzZWxmLT57X2ZpbHRlcl9jb3VudH0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgQHskc2VsZi0+e19jaGFydHNfYXJyYXl9fTsKKworICAgICMgU2tpcCB0aGlzIGlmIHRoZXJlIGFyZW4ndCBhbnkgY29tbWVudHMuCisgICAgcmV0dXJuIHVubGVzcyAkbnVtX2NvbW1lbnRzOworCisgICAgZm9yIG15ICRpICgwIC4uICRudW1fY29tbWVudHMtMSkgeworCisgICAgICAgIG15ICRyb3cgICAgICAgICA9ICAgJGNvbW1lbnRzWyRpXS0+WzBdOworICAgICAgICBteSAkY29sICAgICAgICAgPSAgICRjb21tZW50c1skaV0tPlsxXTsKKyAgICAgICAgbXkgJHN0ciAgICAgICAgID0gICAkY29tbWVudHNbJGldLT5bMl07CisgICAgICAgIG15ICRlbmNvZGluZyAgICA9ICAgJGNvbW1lbnRzWyRpXS0+WzNdOworICAgICAgICBteSAkdmlzaWJsZSAgICAgPSAgICRjb21tZW50c1skaV0tPls2XTsKKyAgICAgICAgbXkgJGNvbG9yICAgICAgID0gICAkY29tbWVudHNbJGldLT5bN107CisgICAgICAgIG15IEB2ZXJ0aWNlcyAgICA9IEB7JGNvbW1lbnRzWyRpXS0+WzhdfTsKKyAgICAgICAgbXkgJHN0cl9sZW4gICAgID0gbGVuZ3RoICRzdHI7CisgICAgICAgICAgICRzdHJfbGVuICAgIC89IDIgaWYgJGVuY29kaW5nOyAjIE51bSBvZiBjaGFycyBub3QgYnl0ZXMuCisgICAgICAgIG15ICRmb3JtYXRzICAgICA9IFtbMCwgOV0sIFskc3RyX2xlbiwgMF1dOworCisKKyAgICAgICAgaWYgKCRpID09IDAgYW5kIG5vdCAkbnVtX29iamVjdHMpIHsKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIHBhcmVudCBNU09EUkFXSUlORyByZWNvcmQuCisgICAgICAgICAgICBteSAkZGdfbGVuZ3RoICAgPSAyMDAgKyAxMjgqKCRudW1fY29tbWVudHMgLTEpOworICAgICAgICAgICAgbXkgJHNwZ3JfbGVuZ3RoID0gMTc2ICsgMTI4KigkbnVtX2NvbW1lbnRzIC0xKTsKKworICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fZGdfY29udGFpbmVyKCRkZ19sZW5ndGgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fZGcoQGlkcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcGdyX2NvbnRhaW5lcigkc3Bncl9sZW5ndGgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDQwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwZ3IoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDB4MCwgJHNwaWQrKywgMHgwMDA1KTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwX2NvbnRhaW5lcigxMjApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3AoMjAyLCAkc3BpZCsrLCAweDBBMDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fb3B0X2NvbW1lbnQoMHg4MCwgJHZpc2libGUsICRjb2xvcik7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfYW5jaG9yKDMsIEB2ZXJ0aWNlcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfZGF0YSgpOworCisgICAgICAgICAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgICAgICAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIFdyaXRlIHRoZSBjaGlsZCBNU09EUkFXSUlORyByZWNvcmQuCisgICAgICAgICAgICBteSAkZGF0YSAgICAgICAgPSAkc2VsZi0+X3N0b3JlX21zb19zcF9jb250YWluZXIoMTIwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDIwMiwgJHNwaWQrKywgMHgwQTAwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdF9jb21tZW50KDB4ODAsICR2aXNpYmxlLCAkY29sb3IpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2FuY2hvcigzLCBAdmVydGljZXMpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2RhdGEoKTsKKworICAgICAgICAgICAgJGxlbmd0aCAgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgICAgICAgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworCisgICAgICAgIH0KKworICAgICAgICAkc2VsZi0+X3N0b3JlX29ial9jb21tZW50KCRudW1fb2JqZWN0cyskaSsxKTsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9tc29fZHJhd2luZ190ZXh0X2JveCgpOworICAgICAgICAkc2VsZi0+X3N0b3JlX3R4bygkc3RyX2xlbik7CisgICAgICAgICRzZWxmLT5fc3RvcmVfdHhvX2NvbnRpbnVlXzEoJHN0ciwgJGVuY29kaW5nKTsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV90eG9fY29udGludWVfMigkZm9ybWF0cyk7CisgICAgfQorCisKKyAgICAjIFdyaXRlIHRoZSBOT1RFIHJlY29yZHMgYWZ0ZXIgTVNPRFJBV0lJTkcgcmVjb3Jkcy4KKyAgICBmb3IgbXkgJGkgKDAgLi4gJG51bV9jb21tZW50cy0xKSB7CisKKyAgICAgICAgbXkgJHJvdyAgICAgICAgID0gJGNvbW1lbnRzWyRpXS0+WzBdOworICAgICAgICBteSAkY29sICAgICAgICAgPSAkY29tbWVudHNbJGldLT5bMV07CisgICAgICAgIG15ICRhdXRob3IgICAgICA9ICRjb21tZW50c1skaV0tPls0XTsKKyAgICAgICAgbXkgJGF1dGhvcl9lbmMgID0gJGNvbW1lbnRzWyRpXS0+WzVdOworICAgICAgICBteSAkdmlzaWJsZSAgICAgPSAkY29tbWVudHNbJGldLT5bNl07CisKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9ub3RlKCRyb3csICRjb2wsICRudW1fb2JqZWN0cyskaSsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJGF1dGhvciwgJGF1dGhvcl9lbmMsICR2aXNpYmxlKTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX2RnX2NvbnRhaW5lcigpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgRGdDb250YWluZXIgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fZGdfY29udGFpbmVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDAyOworICAgIG15ICR2ZXJzaW9uICAgICA9IDE1OworICAgIG15ICRpbnN0YW5jZSAgICA9IDA7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gJF9bMF07CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19kZygpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgRGcgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fZGcgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDg7CisgICAgbXkgJHZlcnNpb24gICAgID0gMDsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAkX1swXTsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSA4OworCisgICAgbXkgJG51bV9zaGFwZXMgID0gJF9bMV07CisgICAgbXkgJG1heF9zcGlkICAgID0gJF9bMl07CisKKyAgICAkZGF0YSAgICAgICAgICAgPSBwYWNrICJWViIsICRudW1fc2hhcGVzLCAkbWF4X3NwaWQ7CisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fc3Bncl9jb250YWluZXIoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIFNwZ3JDb250YWluZXIgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fc3Bncl9jb250YWluZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDM7CisgICAgbXkgJHZlcnNpb24gICAgID0gMTU7CisgICAgbXkgJGluc3RhbmNlICAgID0gMDsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAkX1swXTsKKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX3NwX2NvbnRhaW5lcigpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgU3BDb250YWluZXIgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fc3BfY29udGFpbmVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDA0OworICAgIG15ICR2ZXJzaW9uICAgICA9IDE1OworICAgIG15ICRpbnN0YW5jZSAgICA9IDA7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gJF9bMF07CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19zcGdyKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBTcGdyIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lORy4KKyMKK3N1YiBfc3RvcmVfbXNvX3NwZ3IgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDk7CisgICAgbXkgJHZlcnNpb24gICAgID0gMTsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAwOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2sgIlZWVlYiLCAwLCAwLCAwLCAwOworICAgIG15ICRsZW5ndGggICAgICA9IDE2OworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fc3AoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIFNwIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lORy4KKyMKK3N1YiBfc3RvcmVfbXNvX3NwIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDBBOworICAgIG15ICR2ZXJzaW9uICAgICA9IDI7CisgICAgbXkgJGluc3RhbmNlICAgID0gJF9bMF07CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gODsKKworICAgIG15ICRzcGlkICAgICAgICA9ICRfWzFdOworICAgIG15ICRvcHRpb25zICAgICA9ICRfWzJdOworCisgICAgJGRhdGEgICAgICAgICAgID0gcGFjayAiVlYiLCAkc3BpZCwgJG9wdGlvbnM7CisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fb3B0X2NvbW1lbnQoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIE9wdCByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkcuCisjCitzdWIgX3N0b3JlX21zb19vcHRfY29tbWVudCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwQjsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAzOworICAgIG15ICRpbnN0YW5jZSAgICA9IDk7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gNTQ7CisKKyAgICBteSAkc3BpZCAgICAgICAgPSAkX1swXTsKKyAgICBteSAkdmlzaWJsZSAgICAgPSAkX1sxXTsKKyAgICBteSAkY29sb3VyICAgICAgPSAkX1syXSB8fCAweDUwOworCisKKyAgICAjIFVzZSB0aGUgdmlzaWJsZSBmbGFnIGlmIHNldCBieSB0aGUgdXNlciBvciBlbHNlIHVzZSB0aGUgd29ya3NoZWV0IHZhbHVlLgorICAgICMgTm90ZSB0aGF0IHRoZSB2YWx1ZSB1c2VkIGlzIHRoZSBvcHBvc2l0ZSBvZiBfc3RvcmVfbm90ZSgpLgorICAgICMKKyAgICBpZiAoZGVmaW5lZCAkdmlzaWJsZSkgeworICAgICAgICAkdmlzaWJsZSA9ICR2aXNpYmxlICAgICAgICAgICAgICAgICAgID8gMHgwMDAwIDogMHgwMDAyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHZpc2libGUgPSAkc2VsZi0+e19jb21tZW50c192aXNpYmxlfSA/IDB4MDAwMCA6IDB4MDAwMjsKKyAgICB9CisKKworICAgICRkYXRhICAgID0gcGFjayAiViIsICAkc3BpZDsKKyAgICAkZGF0YSAgIC49IHBhY2sgIkgqIiwgJzAwMDBCRjAwMDgwMDA4MDA1ODAxMDAwMDAwMDA4MTAxJyA7CisgICAgJGRhdGEgICAuPSBwYWNrICJDIiwgICRjb2xvdXI7CisgICAgJGRhdGEgICAuPSBwYWNrICJIKiIsICcwMDAwMDg4MzAxNTAwMDAwMDhCRjAxMTAwMDExMDAwMScgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAnMDIwMDAwMDAwMDNGMDIwMzAwMDMwMEJGMDMnOworICAgICRkYXRhICAgLj0gcGFjayAidiIsICAkdmlzaWJsZTsKKyAgICAkZGF0YSAgIC49IHBhY2sgIkgqIiwgJzBBMDAnOworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fb3B0X2ltYWdlKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBPcHQgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fb3B0X2ltYWdlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDBCOworICAgIG15ICR2ZXJzaW9uICAgICA9IDM7CisgICAgbXkgJGluc3RhbmNlICAgID0gMzsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSB1bmRlZjsKKyAgICBteSAkc3BpZCAgICAgICAgPSAkX1swXTsKKworICAgICRkYXRhICAgID0gcGFjayAndicsIDB4NDEwNDsgICAgICAgICMgQmxpcCAtPiBwaWIKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAkc3BpZDsKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxQkY7ICAgICAgICAjIEZpbGwgU3R5bGUgLT4gZk5vRmlsbEhpdFRlc3QKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMDEwMDAwOworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDNCRjsgICAgICAgICMgR3JvdXAgU2hhcGUgLT4gZlByaW50CisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwMDA4MDAwMDsKKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX29wdF9jaGFydCgpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgT3B0IHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lORy4KKyMKK3N1YiBfc3RvcmVfbXNvX29wdF9jaGFydCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwQjsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAzOworICAgIG15ICRpbnN0YW5jZSAgICA9IDk7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gdW5kZWY7CisKKyAgICAkZGF0YSAgICA9IHBhY2sgJ3YnLCAweDAwN0Y7ICAgICAgICAjIFByb3RlY3Rpb24gLT4gZkxvY2tBZ2FpbnN0R3JvdXBpbmcKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAxMDQwMTA0OworCisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwMEJGOyAgICAgICAgIyBUZXh0IC0+IGZGaXRUZXh0VG9TaGFwZQorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDAwODAwMDg7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxODE7ICAgICAgICAjIEZpbGwgU3R5bGUgLT4gZmlsbENvbG9yCisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwODAwMDA0RSA7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxODM7ICAgICAgICAjIEZpbGwgU3R5bGUgLT4gZmlsbEJhY2tDb2xvcgorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDgwMDAwNEQ7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxQkY7ICAgICAgICAjIEZpbGwgU3R5bGUgLT4gZk5vRmlsbEhpdFRlc3QKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMTEwMDEwOworCisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwMUMwOyAgICAgICAgIyBMaW5lIFN0eWxlIC0+IGxpbmVDb2xvcgorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDgwMDAwNEQ7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxRkY7ICAgICAgICAjIExpbmUgU3R5bGUgLT4gZk5vTGluZURyYXdEYXNoCisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwMDA4MDAwODsKKworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDIzRjsgICAgICAgICMgU2hhZG93IFN0eWxlIC0+IGZzaGFkb3dPYnNjdXJlZAorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDAwMjAwMDA7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAzQkY7ICAgICAgICAjIEdyb3VwIFNoYXBlIC0+IGZQcmludAorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDAwODAwMDA7CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19vcHRfZmlsdGVyKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBPcHQgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fb3B0X2ZpbHRlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwQjsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAzOworICAgIG15ICRpbnN0YW5jZSAgICA9IDU7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gdW5kZWY7CisKKworCisgICAgJGRhdGEgICAgPSBwYWNrICd2JywgMHgwMDdGOyAgICAgICAgIyBQcm90ZWN0aW9uIC0+IGZMb2NrQWdhaW5zdEdyb3VwaW5nCisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwMTA0MDEwNDsKKworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDBCRjsgICAgICAgICMgVGV4dCAtPiBmRml0VGV4dFRvU2hhcGUKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMDgwMDA4OworCisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwMUJGOyAgICAgICAgIyBGaWxsIFN0eWxlIC0+IGZOb0ZpbGxIaXRUZXN0CisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwMDAxMDAwMDsKKworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDFGRjsgICAgICAgICMgTGluZSBTdHlsZSAtPiBmTm9MaW5lRHJhd0Rhc2gKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMDgwMDAwOworCisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwM0JGOyAgICAgICAgIyBHcm91cCBTaGFwZSAtPiBmUHJpbnQKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMEEwMDAwOworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fY2xpZW50X2FuY2hvcigpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgQ2xpZW50QW5jaG9yIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lORy4KKyMKK3N1YiBfc3RvcmVfbXNvX2NsaWVudF9hbmNob3IgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMTA7CisgICAgbXkgJHZlcnNpb24gICAgID0gMDsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAwOworICAgIG15ICRkYXRhICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICA9IDE4OworCisgICAgbXkgJGZsYWcgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkY29sX3N0YXJ0ICAgPSAkX1swXTsgICAgIyBDb2wgY29udGFpbmluZyB1cHBlciBsZWZ0IGNvcm5lciBvZiBvYmplY3QKKyAgICBteSAkeDEgICAgICAgICAgPSAkX1sxXTsgICAgIyBEaXN0YW5jZSB0byBsZWZ0IHNpZGUgb2Ygb2JqZWN0CisKKyAgICBteSAkcm93X3N0YXJ0ICAgPSAkX1syXTsgICAgIyBSb3cgY29udGFpbmluZyB0b3AgbGVmdCBjb3JuZXIgb2Ygb2JqZWN0CisgICAgbXkgJHkxICAgICAgICAgID0gJF9bM107ICAgICMgRGlzdGFuY2UgdG8gdG9wIG9mIG9iamVjdAorCisgICAgbXkgJGNvbF9lbmQgICAgID0gJF9bNF07ICAgICMgQ29sIGNvbnRhaW5pbmcgbG93ZXIgcmlnaHQgY29ybmVyIG9mIG9iamVjdAorICAgIG15ICR4MiAgICAgICAgICA9ICRfWzVdOyAgICAjIERpc3RhbmNlIHRvIHJpZ2h0IHNpZGUgb2Ygb2JqZWN0CisKKyAgICBteSAkcm93X2VuZCAgICAgPSAkX1s2XTsgICAgIyBSb3cgY29udGFpbmluZyBib3R0b20gcmlnaHQgY29ybmVyIG9mIG9iamVjdAorICAgIG15ICR5MiAgICAgICAgICA9ICRfWzddOyAgICAjIERpc3RhbmNlIHRvIGJvdHRvbSBvZiBvYmplY3QKKworICAgICRkYXRhICAgPSBwYWNrICJ2OSIsICAgICRmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xfc3RhcnQsICR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcm93X3N0YXJ0LCAkeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbF9lbmQsICAgJHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3dfZW5kLCAgICR5MjsKKworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fY2xpZW50X2RhdGEoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIENsaWVudERhdGEgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fY2xpZW50X2RhdGEgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMTE7CisgICAgbXkgJHZlcnNpb24gICAgID0gMDsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAwOworICAgIG15ICRkYXRhICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICA9IDA7CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX29ial9jb21tZW50KCkKKyMKKyMgV3JpdGUgdGhlIE9CSiByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIGNlbGwgY29tbWVudHMuCisjCitzdWIgX3N0b3JlX29ial9jb21tZW50IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDVEOyAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMzQ7ICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRvYmpfaWQgICAgICA9ICRfWzBdOyAgICAjIE9iamVjdCBJRCBudW1iZXIuCisgICAgbXkgJG9ial90eXBlICAgID0gMHgwMDE5OyAgICMgT2JqZWN0IHR5cGUgKGNvbW1lbnQpLgorICAgIG15ICRkYXRhICAgICAgICA9ICcnOyAgICAgICAjIFJlY29yZCBkYXRhLgorCisgICAgbXkgJHN1Yl9yZWNvcmQgID0gMHgwMDAwOyAgICMgU3ViLXJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRzdWJfbGVuZ3RoICA9IDB4MDAwMDsgICAjIExlbmd0aCBvZiBzdWItcmVjb3JkLgorICAgIG15ICRzdWJfZGF0YSAgICA9ICcnOyAgICAgICAjIERhdGEgb2Ygc3ViLXJlY29yZC4KKyAgICBteSAkb3B0aW9ucyAgICAgPSAweDQwMTE7CisgICAgbXkgJHJlc2VydmVkICAgID0gMHgwMDAwOworCisgICAgIyBBZGQgZnRDbW8gKGNvbW1vbiBvYmplY3QgZGF0YSkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDE1OyAgICMgZnRDbW8KKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMTI7CisgICAgJHN1Yl9kYXRhICAgICAgID0gcGFjayAidnZ2VlZWIiwgJG9ial90eXBlLCAkb2JqX2lkLCAgICRvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXNlcnZlZCwgJHJlc2VydmVkLCAkcmVzZXJ2ZWQ7CisgICAgJGRhdGEgICAgICAgICAgID0gcGFjaygidnYiLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoKTsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKworICAgICMgQWRkIGZ0TnRzIChub3RlIHN0cnVjdHVyZSkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDBEOyAgICMgZnROdHMKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMTY7CisgICAgJHN1Yl9kYXRhICAgICAgID0gcGFjayAiVlZWVlZ2IiwgKCRyZXNlcnZlZCkgeCA2OworICAgICRkYXRhICAgICAgICAgIC49IHBhY2soInZ2IiwgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aCk7CisgICAgJGRhdGEgICAgICAgICAgLj0gJHN1Yl9kYXRhOworCisKKyAgICAjIEFkZCBmdEVuZCAoZW5kIG9mIG9iamVjdCkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDAwOyAgICMgZnROdHMKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMDA7CisgICAgJGRhdGEgICAgICAgICAgLj0gcGFjaygidnYiLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoKTsKKworCisgICAgIyBQYWNrIHRoZSByZWNvcmQuCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX29ial9pbWFnZSgpCisjCisjIFdyaXRlIHRoZSBPQkogcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBpbWFnZSByZWNvcmRzLgorIworc3ViIF9zdG9yZV9vYmpfaW1hZ2UgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwNUQ7ICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAyNjsgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG9ial9pZCAgICAgID0gJF9bMF07ICAgICMgT2JqZWN0IElEIG51bWJlci4KKyAgICBteSAkb2JqX3R5cGUgICAgPSAweDAwMDg7ICAgIyBPYmplY3QgdHlwZSAoUGljdHVyZSkuCisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7ICAgICAgICMgUmVjb3JkIGRhdGEuCisKKyAgICBteSAkc3ViX3JlY29yZCAgPSAweDAwMDA7ICAgIyBTdWItcmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJHN1Yl9sZW5ndGggID0gMHgwMDAwOyAgICMgTGVuZ3RoIG9mIHN1Yi1yZWNvcmQuCisgICAgbXkgJHN1Yl9kYXRhICAgID0gJyc7ICAgICAgICMgRGF0YSBvZiBzdWItcmVjb3JkLgorICAgIG15ICRvcHRpb25zICAgICA9IDB4NjAxMTsKKyAgICBteSAkcmVzZXJ2ZWQgICAgPSAweDAwMDA7CisKKyAgICAjIEFkZCBmdENtbyAoY29tbW9uIG9iamVjdCBkYXRhKSBzdWJvYmplY3QKKyAgICAkc3ViX3JlY29yZCAgICAgPSAweDAwMTU7ICAgIyBmdENtbworICAgICRzdWJfbGVuZ3RoICAgICA9IDB4MDAxMjsKKyAgICAkc3ViX2RhdGEgICAgICAgPSBwYWNrICd2dnZWVlYnLCAkb2JqX3R5cGUsICRvYmpfaWQsICAgJG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc2VydmVkLCAkcmVzZXJ2ZWQsICRyZXNlcnZlZDsKKyAgICAkZGF0YSAgICAgICAgICAgPSBwYWNrICd2dicsICAgICAkc3ViX3JlY29yZCwgJHN1Yl9sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgLj0gJHN1Yl9kYXRhOworCisKKyAgICAjIEFkZCBmdENmIChDbGlwYm9hcmQgZm9ybWF0KSBzdWJvYmplY3QKKyAgICAkc3ViX3JlY29yZCAgICAgPSAweDAwMDc7ICAgIyBmdENmCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDAyOworICAgICRzdWJfZGF0YSAgICAgICA9IHBhY2sgJ3YnLCAgICAgIDB4RkZGRjsKKyAgICAkZGF0YSAgICAgICAgICAuPSBwYWNrICd2dicsICAgICAkc3ViX3JlY29yZCwgJHN1Yl9sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgLj0gJHN1Yl9kYXRhOworCisgICAgIyBBZGQgZnRQaW9HcmJpdCAoUGljdHVyZSBvcHRpb24gZmxhZ3MpIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAwODsgICAjIGZ0UGlvR3JiaXQKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMDI7CisgICAgJHN1Yl9kYXRhICAgICAgID0gcGFjayAndicsICAgICAgMHgwMDAxOworICAgICRkYXRhICAgICAgICAgIC49IHBhY2sgJ3Z2JywgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aDsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKworICAgICMgQWRkIGZ0RW5kIChlbmQgb2Ygb2JqZWN0KSBzdWJvYmplY3QKKyAgICAkc3ViX3JlY29yZCAgICAgPSAweDAwMDA7ICAgIyBmdE50cworICAgICRzdWJfbGVuZ3RoICAgICA9IDB4MDAwMDsKKyAgICAkZGF0YSAgICAgICAgICAuPSBwYWNrICd2dicsICAgICAkc3ViX3JlY29yZCwgJHN1Yl9sZW5ndGg7CisKKworICAgICMgUGFjayB0aGUgcmVjb3JkLgorICAgIG15ICRoZWFkZXIgID0gcGFjaygndnYnLCAgICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9vYmpfY2hhcnQoKQorIworIyBXcml0ZSB0aGUgT0JKIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgY2hhcnQgcmVjb3Jkcy4KKyMKK3N1YiBfc3RvcmVfb2JqX2NoYXJ0IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDVEOyAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMUE7ICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRvYmpfaWQgICAgICA9ICRfWzBdOyAgICAjIE9iamVjdCBJRCBudW1iZXIuCisgICAgbXkgJG9ial90eXBlICAgID0gMHgwMDA1OyAgICMgT2JqZWN0IHR5cGUgKGNoYXJ0KS4KKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsgICAgICAgIyBSZWNvcmQgZGF0YS4KKworICAgIG15ICRzdWJfcmVjb3JkICA9IDB4MDAwMDsgICAjIFN1Yi1yZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkc3ViX2xlbmd0aCAgPSAweDAwMDA7ICAgIyBMZW5ndGggb2Ygc3ViLXJlY29yZC4KKyAgICBteSAkc3ViX2RhdGEgICAgPSAnJzsgICAgICAgIyBEYXRhIG9mIHN1Yi1yZWNvcmQuCisgICAgbXkgJG9wdGlvbnMgICAgID0gMHg2MDExOworICAgIG15ICRyZXNlcnZlZCAgICA9IDB4MDAwMDsKKworICAgICMgQWRkIGZ0Q21vIChjb21tb24gb2JqZWN0IGRhdGEpIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAxNTsgICAjIGZ0Q21vCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDEyOworICAgICRzdWJfZGF0YSAgICAgICA9IHBhY2sgJ3Z2dlZWVicsICRvYmpfdHlwZSwgJG9ial9pZCwgICAkb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzZXJ2ZWQsICRyZXNlcnZlZCwgJHJlc2VydmVkOworICAgICRkYXRhICAgICAgICAgICA9IHBhY2sgJ3Z2JywgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aDsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKyAgICAjIEFkZCBmdEVuZCAoZW5kIG9mIG9iamVjdCkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDAwOyAgICMgZnROdHMKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMDA7CisgICAgJGRhdGEgICAgICAgICAgLj0gcGFjayAndnYnLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoOworCisKKyAgICAjIFBhY2sgdGhlIHJlY29yZC4KKyAgICBteSAkaGVhZGVyICA9IHBhY2soJ3Z2JywgICAgICAgICRyZWNvcmQsICRsZW5ndGgpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX29ial9maWx0ZXIoKQorIworIyBXcml0ZSB0aGUgT0JKIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgZmlsdGVyIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX29ial9maWx0ZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwNUQ7ICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDA0NjsgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG9ial9pZCAgICAgID0gJF9bMF07ICAgICMgT2JqZWN0IElEIG51bWJlci4KKyAgICBteSAkb2JqX3R5cGUgICAgPSAweDAwMTQ7ICAgIyBPYmplY3QgdHlwZSAoY29tYm8gYm94KS4KKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsgICAgICAgIyBSZWNvcmQgZGF0YS4KKworICAgIG15ICRzdWJfcmVjb3JkICA9IDB4MDAwMDsgICAjIFN1Yi1yZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkc3ViX2xlbmd0aCAgPSAweDAwMDA7ICAgIyBMZW5ndGggb2Ygc3ViLXJlY29yZC4KKyAgICBteSAkc3ViX2RhdGEgICAgPSAnJzsgICAgICAgIyBEYXRhIG9mIHN1Yi1yZWNvcmQuCisgICAgbXkgJG9wdGlvbnMgICAgID0gMHgyMTAxOworICAgIG15ICRyZXNlcnZlZCAgICA9IDB4MDAwMDsKKworICAgICMgQWRkIGZ0Q21vIChjb21tb24gb2JqZWN0IGRhdGEpIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAxNTsgICAjIGZ0Q21vCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDEyOworICAgICRzdWJfZGF0YSAgICAgICA9IHBhY2sgJ3Z2dlZWVicsICRvYmpfdHlwZSwgJG9ial9pZCwgICAkb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzZXJ2ZWQsICRyZXNlcnZlZCwgJHJlc2VydmVkOworICAgICRkYXRhICAgICAgICAgICA9IHBhY2sgJ3Z2JywgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aDsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKyAgICAjIEFkZCBmdFNicyBTY3JvbGwgYmFyIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAwQzsgICAjIGZ0U2JzCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDE0OworICAgICRzdWJfZGF0YSAgICAgICA9IHBhY2sgJ0gqJywgJzAwMDAwMDAwMDAwMDAwMDA2NDAwMDEwMDBBMDAwMDAwMTAwMDAxMDAnOworICAgICRkYXRhICAgICAgICAgIC49IHBhY2sgJ3Z2JywgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aDsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKworICAgICMgQWRkIGZ0TGJzRGF0YSAoTGlzdCBib3ggZGF0YSkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDEzOyAgICMgZnRMYnNEYXRhCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgxRkVFOyAgICMgU3BlY2lhbCBjYXNlICh1bmRvY3VtZW50ZWQpLgorCisKKyAgICAjIElmIHRoZSBmaWx0ZXIgaXMgYWN0aXZlIHdlIHNldCBvbmUgb2YgdGhlIHVuZG9jdW1lbnRlZCBmbGFncy4KKyAgICBteSAkY29sICAgICAgICAgPSAkX1sxXTsKKworICAgIGlmICgkc2VsZi0+e19maWx0ZXJfY29sc30tPnskY29sfSkgeworICAgICAgICAkc3ViX2RhdGEgICAgICAgPSBwYWNrICdIKicsICcwMDAwMDAwMDAxMDAwMTAzMDAwMDBBMDAwODAwNTcwMCc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc3ViX2RhdGEgICAgICAgPSBwYWNrICdIKicsICcwMDAwMDAwMDAxMDAwMTAzMDAwMDAyMDAwODAwNTcwMCc7CisgICAgfQorCisgICAgJGRhdGEgICAgICAgICAgLj0gcGFjayAndnYnLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgIC49ICRzdWJfZGF0YTsKKworCisgICAgIyBBZGQgZnRFbmQgKGVuZCBvZiBvYmplY3QpIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAwMDsgICAjIGZ0TnRzCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDAwOworICAgICRkYXRhICAgICAgICAgIC49IHBhY2sgJ3Z2JywgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoOworCisgICAgIyBQYWNrIHRoZSByZWNvcmQuCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCd2dicsICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fZHJhd2luZ190ZXh0X2JveCgpCisjCisjIFdyaXRlIHRoZSBNU09EUkFXSU5HIENsaWVudFRleHRib3ggcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBjb21tZW50cy4KKyMKK3N1YiBfc3RvcmVfbXNvX2RyYXdpbmdfdGV4dF9ib3ggeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwRUM7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDA4OyAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworCisgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X3RleHRfYm94KCk7CisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fY2xpZW50X3RleHRfYm94KCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBDbGllbnRUZXh0Ym94IHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lORy4KKyMKK3N1YiBfc3RvcmVfbXNvX2NsaWVudF90ZXh0X2JveCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwRDsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAwOworICAgIG15ICRpbnN0YW5jZSAgICA9IDA7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gMDsKKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdHhvKCkKKyMKKyMgV3JpdGUgdGhlIHdvcmtzaGVldCBUWE8gcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBjZWxsIGNvbW1lbnRzLgorIworc3ViIF9zdG9yZV90eG8geworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAxQjY7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAxMjsgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHN0cmluZ19sZW4gID0gJF9bMF07ICAgICAgICAgICAgICAgICMgTGVuZ3RoIG9mIHRoZSBub3RlIHRleHQuCisgICAgbXkgJGZvcm1hdF9sZW4gID0gJF9bMV0gfHwgMTY7ICAgICAgICAgICMgTGVuZ3RoIG9mIHRoZSBmb3JtYXQgcnVucy4KKyAgICBteSAkcm90YXRpb24gICAgPSAkX1syXSB8fCAwOyAgICAgICAgICAgIyBPcHRpb25zCisgICAgbXkgJGdyYml0ICAgICAgID0gMHgwMjEyOyAgICAgICAgICAgICAgICMgT3B0aW9ucworICAgIG15ICRyZXNlcnZlZCAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAjIE9wdGlvbnMKKworICAgICMgUGFjayB0aGUgcmVjb3JkLgorICAgIG15ICRoZWFkZXIgID0gcGFjaygidnYiLCAgICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2dlZ2dnZWIiwgICAkZ3JiaXQsICRyb3RhdGlvbiwgJHJlc2VydmVkLCAkcmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RyaW5nX2xlbiwgJGZvcm1hdF9sZW4sICRyZXNlcnZlZCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV90eG9fY29udGludWVfMSgpCisjCisjIFdyaXRlIHRoZSBmaXJzdCBDT05USU5VRSByZWNvcmQgdG8gZm9sbG93IHRoZSBUWE8gcmVjb3JkLiBJdCBjb250YWlucyB0aGUKKyMgdGV4dCBkYXRhLgorIworc3ViIF9zdG9yZV90eG9fY29udGludWVfMSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAzQzsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJHN0cmluZyAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICMgQ29tbWVudCBzdHJpbmcuCisgICAgbXkgJGVuY29kaW5nICAgID0gJF9bMV0gfHwgMDsgICAgICAgICAgICMgRW5jb2Rpbmcgb2YgdGhlIHN0cmluZy4KKworCisgICAgIyBTcGxpdCBsb25nIGNvbW1lbnQgc3RyaW5ncyBpbnRvIHNtYWxsZXIgY29udGludWUgYmxvY2tzIGlmIG5lY2Vzc2FyeS4KKyAgICAjIFdlIGNhbid0IGxldCBCSUZGd3JpdGVyOjpfYWRkX2NvbnRpbnVlKCkgaGFuZGxlZCB0aGlzIHNpbmNlIGFuIGV4dHJhCisgICAgIyBlbmNvZGluZyBieXRlIGhhcyB0byBiZSBhZGRlZCBzaW1pbGFyIHRvIHRoZSBTU1QgYmxvY2suCisgICAgIworICAgICMgV2UgbWFrZSB0aGUgbGltaXQgc2l6ZSBzbWFsbGVyIHRoYW4gdGhlIF9hZGRfY29udGludWUoKSBzaXplIGFuZCBldmVuCisgICAgIyBzbyB0aGF0IFVURjE2IGNoYXJzIG9jY3VyIGluIHRoZSBzYW1lIGJsb2NrLgorICAgICMKKyAgICBteSAkbGltaXQgPSA4MjE4OworICAgIHdoaWxlIChsZW5ndGgoJHN0cmluZykgPiAkbGltaXQpIHsKKyAgICAgICAgbXkgJHRtcF9zdHIgPSBzdWJzdHIoJHN0cmluZywgMCwgJGxpbWl0LCAiIik7CisKKyAgICAgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJDIiwgJGVuY29kaW5nKSAuICR0bXBfc3RyOworICAgICAgICBteSAkbGVuZ3RoICA9IGxlbmd0aCAkZGF0YTsKKyAgICAgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworCisgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKyAgICB9CisKKyAgICAjIFBhY2sgdGhlIHJlY29yZC4KKyAgICBteSAkZGF0YSAgICA9IHBhY2soIkMiLCAkZW5jb2RpbmcpIC4gJHN0cmluZzsKKyAgICBteSAkbGVuZ3RoICA9IGxlbmd0aCAkZGF0YTsKKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV90eG9fY29udGludWVfMigpCisjCisjIFdyaXRlIHRoZSBzZWNvbmQgQ09OVElOVUUgcmVjb3JkIHRvIGZvbGxvdyB0aGUgVFhPIHJlY29yZC4gSXQgY29udGFpbnMgdGhlCisjIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBzdHJpbmcuCisjCitzdWIgX3N0b3JlX3R4b19jb250aW51ZV8yIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDNDOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKyAgICBteSAkZm9ybWF0cyAgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgIyBGb3JtYXR0aW5nIGluZm9ybWF0aW9uCisKKworICAgICMgUGFjayB0aGUgcmVjb3JkLgorICAgIG15ICRkYXRhID0gJyc7CisKKyAgICBmb3IgbXkgJGFfcmVmIChAJGZvcm1hdHMpIHsKKyAgICAgICAgJGRhdGEgLj0gcGFjayAidnZWIiwgJGFfcmVmLT5bMF0sICRhX3JlZi0+WzFdLCAweDA7CisgICAgfQorCisgICAgJGxlbmd0aCAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworCisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9ub3RlKCkKKyMKKyMgV3JpdGUgdGhlIHdvcmtzaGVldCBOT1RFIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgY2VsbCBjb21tZW50cy4KKyMKK3N1YiBfc3RvcmVfbm90ZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAxQzsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDBDOyAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93ICAgICAgICAgPSAkX1swXTsKKyAgICBteSAkY29sICAgICAgICAgPSAkX1sxXTsKKyAgICBteSAkb2JqX2lkICAgICAgPSAkX1syXTsKKyAgICBteSAkYXV0aG9yICAgICAgPSAkX1szXSB8fCAkc2VsZi0+e19jb21tZW50c19hdXRob3J9OworICAgIG15ICRhdXRob3JfZW5jICA9ICRfWzRdIHx8ICRzZWxmLT57X2NvbW1lbnRzX2F1dGhvcl9lbmN9OworICAgIG15ICR2aXNpYmxlICAgICA9ICRfWzVdOworCisKKyAgICAjIFVzZSB0aGUgdmlzaWJsZSBmbGFnIGlmIHNldCBieSB0aGUgdXNlciBvciBlbHNlIHVzZSB0aGUgd29ya3NoZWV0IHZhbHVlLgorICAgICMgVGhlIGZsYWcgaXMgYWxzbyBzZXQgaW4gX3N0b3JlX21zb19vcHRfY29tbWVudCgpIGJ1dCB3aXRoIHRoZSBvcHBvc2l0ZQorICAgICMgdmFsdWUuCisgICAgaWYgKGRlZmluZWQgJHZpc2libGUpIHsKKyAgICAgICAgJHZpc2libGUgPSAkdmlzaWJsZSAgICAgICAgICAgICAgICAgICA/IDB4MDAwMiA6IDB4MDAwMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICR2aXNpYmxlID0gJHNlbGYtPntfY29tbWVudHNfdmlzaWJsZX0gPyAweDAwMDIgOiAweDAwMDA7CisgICAgfQorCisKKyAgICAjIEdldCB0aGUgbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBhdXRob3Igc3RyaW5nIChub3QgYnl0ZXMpLgorICAgIG15ICRudW1fY2hhcnMgID0gbGVuZ3RoICRhdXRob3I7CisgICAgICAgJG51bV9jaGFycyAvPSAyIGlmICRhdXRob3JfZW5jOworCisKKyAgICAjIE51bGwgdGVybWluYXRlIHRoZSBhdXRob3Igc3RyaW5nLgorICAgICRhdXRob3IgLj0gIlwwIjsKKworCisgICAgIyBQYWNrIHRoZSByZWNvcmQuCisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2dnZ2dkMiLCAkcm93LCAkY29sLCAkdmlzaWJsZSwgJG9ial9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRudW1fY2hhcnMsICRhdXRob3JfZW5jKTsKKworICAgICRsZW5ndGggICAgID0gbGVuZ3RoKCRkYXRhKSArIGxlbmd0aCgkYXV0aG9yKTsKKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSwgJGF1dGhvcik7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY29tbWVudF9wYXJhbXMoKQorIworIyBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBhZGRpdGlvbmFsIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gd3JpdGVfY29tbWVudCgpIGFzCisjIHdlbGwgYXMgY2FsY3VsYXRpbmcgdGhlIGNvbW1lbnQgb2JqZWN0IHBvc2l0aW9uIGFuZCB2ZXJ0aWNlcy4KKyMKK3N1YiBfY29tbWVudF9wYXJhbXMgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJvdyAgICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRjb2wgICAgICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkc3RyaW5nICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkZGVmYXVsdF93aWR0aCAgID0gMTI4OworICAgIG15ICRkZWZhdWx0X2hlaWdodCAgPSA3NDsKKworICAgIG15ICVwYXJhbXMgID0gKAorICAgICAgICAgICAgICAgICAgICBhdXRob3IgICAgICAgICAgPT4gJycsCisgICAgICAgICAgICAgICAgICAgIGF1dGhvcl9lbmNvZGluZyA9PiAwLAorICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgY29sb3IgICAgICAgICAgID0+IHVuZGVmLAorICAgICAgICAgICAgICAgICAgICBzdGFydF9jZWxsICAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2NvbCAgICAgICA9PiB1bmRlZiwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfcm93ICAgICAgID0+IHVuZGVmLAorICAgICAgICAgICAgICAgICAgICB2aXNpYmxlICAgICAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICAgICAgICAgIHdpZHRoICAgICAgICAgICA9PiAkZGVmYXVsdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICAgICAgICAgID0+ICRkZWZhdWx0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgeF9vZmZzZXQgICAgICAgID0+IHVuZGVmLAorICAgICAgICAgICAgICAgICAgICB4X3NjYWxlICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgeV9vZmZzZXQgICAgICAgID0+IHVuZGVmLAorICAgICAgICAgICAgICAgICAgICB5X3NjYWxlICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICk7CisKKworICAgICMgT3ZlcndyaXRlIHRoZSBkZWZhdWx0cyB3aXRoIGFueSB1c2VyIHN1cHBsaWVkIHZhbHVlcy4gSW5jb3JyZWN0IG9yCisgICAgIyBtaXNzcGVsbGVkIHBhcmFtZXRlcnMgYXJlIHNpbGVudGx5IGlnbm9yZWQuCisgICAgJXBhcmFtcyAgICAgPSAoJXBhcmFtcywgQF8pOworCisKKyAgICAjIEVuc3VyZSB0aGF0IGEgd2lkdGggYW5kIGhlaWdodCBoYXZlIGJlZW4gc2V0LgorICAgICRwYXJhbXN7d2lkdGh9ICA9ICRkZWZhdWx0X3dpZHRoICBpZiBub3QgJHBhcmFtc3t3aWR0aH07CisgICAgJHBhcmFtc3toZWlnaHR9ID0gJGRlZmF1bHRfaGVpZ2h0IGlmIG5vdCAkcGFyYW1ze2hlaWdodH07CisKKworICAgICMgQ2hlY2sgdGhhdCB1dGYxNiBzdHJpbmdzIGhhdmUgYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAgaWYgKCRwYXJhbXN7ZW5jb2Rpbmd9KSB7CisgICAgICAgIGNyb2FrICJVbmV2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIGNvbW1lbnQgc3RyaW5nIgorICAgICAgICAgICAgICAgaWYgbGVuZ3RoKCRzdHJpbmcpICUgMjsKKworICAgICAgICAjIENoYW5nZSBmcm9tIFVURi0xNkJFIHRvIFVURi0xNkxFCisgICAgICAgICRzdHJpbmcgPSBwYWNrICd2KicsIHVucGFjayAnbionLCAkc3RyaW5nOworICAgIH0KKworICAgIGlmICgkcGFyYW1ze2F1dGhvcl9lbmNvZGluZ30pIHsKKyAgICAgICAgY3JvYWsgIlVuZXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gYXV0aG9yIHN0cmluZyIKKyAgICAgICAgICAgICAgICBpZiBsZW5ndGgoJHBhcmFtc3thdXRob3J9KSAlIDI7CisKKyAgICAgICAgIyBDaGFuZ2UgZnJvbSBVVEYtMTZCRSB0byBVVEYtMTZMRQorICAgICAgICAkcGFyYW1ze2F1dGhvcn0gPSBwYWNrICd2KicsIHVucGFjayAnbionLCAkcGFyYW1ze2F1dGhvcn07CisgICAgfQorCisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cmluZykpIHsKKyAgICAgICAgICAgICRzdHJpbmcgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkc3RyaW5nKTsKKyAgICAgICAgICAgICRwYXJhbXN7ZW5jb2Rpbmd9ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHBhcmFtc3thdXRob3J9KSkgeworICAgICAgICAgICAgJHBhcmFtc3thdXRob3J9ID0gRW5jb2RlOjplbmNvZGUoIlVURi0xNkxFIiwgJHBhcmFtc3thdXRob3J9KTsKKyAgICAgICAgICAgICRwYXJhbXN7YXV0aG9yX2VuY29kaW5nfSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgTGltaXQgdGhlIHN0cmluZyB0byB0aGUgbWF4IG51bWJlciBvZiBjaGFycyAobm90IGJ5dGVzKS4KKyAgICBteSAkbWF4X2xlbiAgPSAzMjc2NzsKKyAgICAgICAkbWF4X2xlbiAqPSAyIGlmICRwYXJhbXN7ZW5jb2Rpbmd9OworCisgICAgaWYgKGxlbmd0aCgkc3RyaW5nKSA+ICRtYXhfbGVuKSB7CisgICAgICAgICRzdHJpbmcgICAgICAgPSBzdWJzdHIoJHN0cmluZywgMCwgJG1heF9sZW4pOworICAgIH0KKworCisgICAgIyBTZXQgdGhlIGNvbW1lbnQgYmFja2dyb3VuZCBjb2xvdXIuCisgICAgbXkgJGNvbG9yICAgICAgID0gJHBhcmFtc3tjb2xvcn07CisgICAgICAgJGNvbG9yICAgICAgID0gJlNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQ6Ol9nZXRfY29sb3IoJGNvbG9yKTsKKyAgICAgICAkY29sb3IgICAgICAgPSAweDUwIGlmICRjb2xvciA9PSAweDdGRkY7ICMgRGVmYXVsdCBjb2xvci4KKyAgICAkcGFyYW1ze2NvbG9yfSAgPSAkY29sb3I7CisKKworICAgICMgQ29udmVydCBhIGNlbGwgcmVmZXJlbmNlIHRvIGEgcm93IGFuZCBjb2x1bW4uCisgICAgaWYgKGRlZmluZWQgJHBhcmFtc3tzdGFydF9jZWxsfSkgeworICAgICAgICBteSAoJHJvdywgJGNvbCkgICAgPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZigkcGFyYW1ze3N0YXJ0X2NlbGx9KTsKKyAgICAgICAgJHBhcmFtc3tzdGFydF9yb3d9ID0gJHJvdzsKKyAgICAgICAgJHBhcmFtc3tzdGFydF9jb2x9ID0gJGNvbDsKKyAgICB9CisKKworICAgICMgU2V0IHRoZSBkZWZhdWx0IHN0YXJ0IGNlbGwgYW5kIG9mZnNldHMgZm9yIHRoZSBjb21tZW50LiBUaGVzZSBhcmUKKyAgICAjIGdlbmVyYWxseSBmaXhlZCBpbiByZWxhdGlvbiB0byB0aGUgcGFyZW50IGNlbGwuIEhvd2V2ZXIgdGhlcmUgYXJlCisgICAgIyBzb21lIGVkZ2UgY2FzZXMgZm9yIGNlbGxzIGF0IHRoZSwgZXIsIGVkZ2VzLgorICAgICMKKyAgICBpZiAobm90IGRlZmluZWQgJHBhcmFtc3tzdGFydF9yb3d9KSB7CisKKyAgICAgICAgaWYgICAgKCRyb3cgPT0gMCAgICApIHskcGFyYW1ze3N0YXJ0X3Jvd30gPSAwICAgICAgfQorICAgICAgICBlbHNpZiAoJHJvdyA9PSA2NTUzMykgeyRwYXJhbXN7c3RhcnRfcm93fSA9IDY1NTI5ICB9CisgICAgICAgIGVsc2lmICgkcm93ID09IDY1NTM0KSB7JHBhcmFtc3tzdGFydF9yb3d9ID0gNjU1MzAgIH0KKyAgICAgICAgZWxzaWYgKCRyb3cgPT0gNjU1MzUpIHskcGFyYW1ze3N0YXJ0X3Jvd30gPSA2NTUzMSAgfQorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgeyRwYXJhbXN7c3RhcnRfcm93fSA9ICRyb3cgLTF9CisgICAgfQorCisgICAgaWYgKG5vdCBkZWZpbmVkICRwYXJhbXN7eV9vZmZzZXR9KSB7CisKKyAgICAgICAgaWYgICAgKCRyb3cgPT0gMCAgICApIHskcGFyYW1ze3lfb2Zmc2V0fSAgPSAyICAgICAgfQorICAgICAgICBlbHNpZiAoJHJvdyA9PSA2NTUzMykgeyRwYXJhbXN7eV9vZmZzZXR9ICA9IDQgICAgICB9CisgICAgICAgIGVsc2lmICgkcm93ID09IDY1NTM0KSB7JHBhcmFtc3t5X29mZnNldH0gID0gNCAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRyb3cgPT0gNjU1MzUpIHskcGFyYW1ze3lfb2Zmc2V0fSAgPSAyICAgICAgfQorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgeyRwYXJhbXN7eV9vZmZzZXR9ICA9IDcgICAgICB9CisgICAgfQorCisgICAgaWYgKG5vdCBkZWZpbmVkICRwYXJhbXN7c3RhcnRfY29sfSkgeworCisgICAgICAgIGlmICAgICgkY29sID09IDI1MyAgKSB7JHBhcmFtc3tzdGFydF9jb2x9ID0gMjUwICAgIH0KKyAgICAgICAgZWxzaWYgKCRjb2wgPT0gMjU0ICApIHskcGFyYW1ze3N0YXJ0X2NvbH0gPSAyNTEgICAgfQorICAgICAgICBlbHNpZiAoJGNvbCA9PSAyNTUgICkgeyRwYXJhbXN7c3RhcnRfY29sfSA9IDI1MiAgICB9CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICB7JHBhcmFtc3tzdGFydF9jb2x9ID0gJGNvbCArMX0KKyAgICB9CisKKyAgICBpZiAobm90IGRlZmluZWQgJHBhcmFtc3t4X29mZnNldH0pIHsKKworICAgICAgICBpZiAgICAoJGNvbCA9PSAyNTMgICkgeyRwYXJhbXN7eF9vZmZzZXR9ICA9IDQ5ICAgICB9CisgICAgICAgIGVsc2lmICgkY29sID09IDI1NCAgKSB7JHBhcmFtc3t4X29mZnNldH0gID0gNDkgICAgIH0KKyAgICAgICAgZWxzaWYgKCRjb2wgPT0gMjU1ICApIHskcGFyYW1ze3hfb2Zmc2V0fSAgPSA0OSAgICAgfQorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgeyRwYXJhbXN7eF9vZmZzZXR9ICA9IDE1ICAgICB9CisgICAgfQorCisKKyAgICAjIFNjYWxlIHRoZSBzaXplIG9mIHRoZSBjb21tZW50IGJveCBpZiByZXF1aXJlZC4KKyAgICBpZiAoJHBhcmFtc3t4X3NjYWxlfSkgeworICAgICAgICAkcGFyYW1ze3dpZHRofSAgPSAkcGFyYW1ze3dpZHRofSAgKiAkcGFyYW1ze3hfc2NhbGV9OworICAgIH0KKworICAgIGlmICgkcGFyYW1ze3lfc2NhbGV9KSB7CisgICAgICAgICRwYXJhbXN7aGVpZ2h0fSA9ICRwYXJhbXN7aGVpZ2h0fSAqICRwYXJhbXN7eV9zY2FsZX07CisgICAgfQorCisKKyAgICAjIENhbGN1bGF0ZSB0aGUgcG9zaXRpb25zIG9mIGNvbW1lbnQgb2JqZWN0LgorICAgIG15IEB2ZXJ0aWNlcyA9ICRzZWxmLT5fcG9zaXRpb25fb2JqZWN0KCAkcGFyYW1ze3N0YXJ0X2NvbH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXN7c3RhcnRfcm93fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtc3t4X29mZnNldH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXN7eV9vZmZzZXR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1ze3dpZHRofSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtc3toZWlnaHR9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgcmV0dXJuKAorICAgICAgICAgICAkcm93LAorICAgICAgICAgICAkY29sLAorICAgICAgICAgICAkc3RyaW5nLAorICAgICAgICAgICAkcGFyYW1ze2VuY29kaW5nfSwKKyAgICAgICAgICAgJHBhcmFtc3thdXRob3J9LAorICAgICAgICAgICAkcGFyYW1ze2F1dGhvcl9lbmNvZGluZ30sCisgICAgICAgICAgICRwYXJhbXN7dmlzaWJsZX0sCisgICAgICAgICAgICRwYXJhbXN7Y29sb3J9LAorICAgICAgICAgICBbQHZlcnRpY2VzXQorICAgICAgICAgICk7Cit9CisKKworCisjCisjIERBVEEgVkFMSURBVElPTgorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGRhdGFfdmFsaWRhdGlvbigkcm93LCAkY29sLCB7Li4ufSkKKyMKKyMgVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgaW50ZXJmYWNlIHRvIEV4Y2VsIGRhdGEgdmFsaWRhdGlvbi4KKyMgU29tZXdoYXQgaXJvbmljYWxseSB0aGUgdGhpcyByZXF1aXJlcyBhIGxvdCBvZiB2YWxpZGF0aW9uIGNvZGUgc2luY2UgdGhlCisjIGludGVyZmFjZSBpcyBmbGV4aWJsZSBhbmQgY292ZXJzIGEgc2V2ZXJhbCB0eXBlcyBvZiBkYXRhIHZhbGlkYXRpb24uCisjCisjIFdlIGFsbG93IGRhdGEgdmFsaWRhdGlvbiB0byBiZSBjYWxsZWQgb24gb25lIGNlbGwgb3IgYSByYW5nZSBvZiBjZWxscy4gVGhlCisjIGhhc2hyZWYgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gcGFyYW1ldGVycyBhbmQgbXVzdCBiZSB0aGUgbGFzdCBwYXJhbToKKyMgICAgZGF0YV92YWxpZGF0aW9uKCRyb3csICRjb2wsIHsuLi59KQorIyAgICBkYXRhX3ZhbGlkYXRpb24oJGZpcnN0X3JvdywgJGZpcnN0X2NvbCwgJGxhc3Rfcm93LCAkbGFzdF9jb2wsIHsuLi59KQorIworIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCisjICAgICAgICAgLTEgOiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cworIyAgICAgICAgIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKKyMgICAgICAgICAtMyA6IGluY29ycmVjdCBwYXJhbWV0ZXIuCisjCitzdWIgZGF0YV92YWxpZGF0aW9uIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgICMgQ2hlY2sgZm9yIGEgdmFsaWQgbnVtYmVyIG9mIGFyZ3MuCisgICAgaWYgKEBfICE9IDUgJiYgQF8gIT0gMykgeyByZXR1cm4gLTEgfQorCisgICAgIyBUaGUgZmluYWwgaGFzaHJlZiBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBwYXJhbWV0ZXJzLgorICAgIG15ICRwYXJhbSA9IHBvcDsKKworICAgICMgTWFrZSB0aGUgbGFzdCByb3cvY29sIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBpZiBub3QgZGVmaW5lZC4KKyAgICBteSAoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIpID0gQF87CisgICAgaWYgKCFkZWZpbmVkICRyb3cyKSB7CisgICAgICAgICRyb3cyID0gJHJvdzE7CisgICAgICAgICRjb2wyID0gJGNvbDE7CisgICAgfQorCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCB3aXRob3V0IHN0b3JpbmcgdGhlIHZhbHVlcy4KKyAgICByZXR1cm4gLTIgaWYgJHNlbGYtPl9jaGVja19kaW1lbnNpb25zKCRyb3cxLCAkY29sMSwgMSwgMSk7CisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93MiwgJGNvbDIsIDEsIDEpOworCisKKyAgICAjIENoZWNrIHRoYXQgdGhlIGxhc3QgcGFyYW1ldGVyIGlzIGEgaGFzaCBsaXN0LgorICAgIGlmIChyZWYgJHBhcmFtIG5lICdIQVNIJykgeworICAgICAgICBjYXJwICJMYXN0IHBhcmFtZXRlciAnJHBhcmFtJyBpbiBkYXRhX3ZhbGlkYXRpb24oKSBtdXN0IGJlIGEgaGFzaCByZWYiOworICAgICAgICByZXR1cm4gLTM7CisgICAgfQorCisgICAgIyBMaXN0IG9mIHZhbGlkIGlucHV0IHBhcmFtZXRlcnMuCisgICAgbXkgJXZhbGlkX3BhcmFtZXRlciA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtICAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSAgICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9ibGFuayAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93biAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19pbnB1dCAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3RpdGxlICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9tZXNzYWdlICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19lcnJvciAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3RpdGxlICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdHlwZSAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2NlbGxzICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAjIENoZWNrIGZvciB2YWxpZCBpbnB1dCBwYXJhbWV0ZXJzLgorICAgIGZvciBteSAkcGFyYW1fa2V5IChrZXlzICUkcGFyYW0pIHsKKyAgICAgICAgaWYgKG5vdCBleGlzdHMgJHZhbGlkX3BhcmFtZXRlcnskcGFyYW1fa2V5fSkgeworICAgICAgICAgICAgY2FycCAiVW5rbm93biBwYXJhbWV0ZXIgJyRwYXJhbV9rZXknIGluIGRhdGFfdmFsaWRhdGlvbigpIjsKKyAgICAgICAgICAgIHJldHVybiAtMzsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgTWFwIGFsdGVybmF0aXZlIHBhcmFtZXRlciBuYW1lcyAnc291cmNlJyBvciAnbWluaW11bScgdG8gJ3ZhbHVlJy4KKyAgICAkcGFyYW0tPnt2YWx1ZX0gPSAkcGFyYW0tPntzb3VyY2V9ICBpZiBkZWZpbmVkICRwYXJhbS0+e3NvdXJjZX07CisgICAgJHBhcmFtLT57dmFsdWV9ID0gJHBhcmFtLT57bWluaW11bX0gaWYgZGVmaW5lZCAkcGFyYW0tPnttaW5pbXVtfTsKKworICAgICMgJ3ZhbGlkYXRlJyBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlci4KKyAgICBpZiAobm90IGV4aXN0cyAkcGFyYW0tPnt2YWxpZGF0ZX0pIHsKKyAgICAgICAgY2FycCAiUGFyYW1ldGVyICd2YWxpZGF0ZScgaXMgcmVxdWlyZWQgaW4gZGF0YV92YWxpZGF0aW9uKCkiOworICAgICAgICByZXR1cm4gLTM7CisgICAgfQorCisKKyAgICAjIExpc3Qgb2YgIHZhbGlkIHZhbGlkYXRpb24gdHlwZXMuCisgICAgbXkgJXZhbGlkX3R5cGUgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW55JyAgICAgICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FueSB2YWx1ZScgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aG9sZSBudW1iZXInICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hvbGUnICAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ludGVnZXInICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWNpbWFsJyAgICAgICAgID0+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlzdCcgICAgICAgICAgICA9PiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGUnICAgICAgICAgICAgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lJyAgICAgICAgICAgID0+IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dCBsZW5ndGgnICAgICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlbmd0aCcgICAgICAgICAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXN0b20nICAgICAgICAgID0+IDcsCisgICAgICAgICAgICAgICAgICAgICAgKTsKKworCisgICAgIyBDaGVjayBmb3IgdmFsaWQgdmFsaWRhdGlvbiB0eXBlcy4KKyAgICBpZiAobm90IGV4aXN0cyAkdmFsaWRfdHlwZXtsYygkcGFyYW0tPnt2YWxpZGF0ZX0pfSkgeworICAgICAgICBjYXJwICJVbmtub3duIHZhbGlkYXRpb24gdHlwZSAnJHBhcmFtLT57dmFsaWRhdGV9JyBmb3IgcGFyYW1ldGVyICIgLgorICAgICAgICAgICAgICIndmFsaWRhdGUnIGluIGRhdGFfdmFsaWRhdGlvbigpIjsKKyAgICAgICAgcmV0dXJuIC0zOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHBhcmFtLT57dmFsaWRhdGV9ID0gJHZhbGlkX3R5cGV7bGMoJHBhcmFtLT57dmFsaWRhdGV9KX07CisgICAgfQorCisKKyAgICAjIE5vIGFjdGlvbiBpcyByZXF1aXJlZCBmb3IgdmFsaWRhdGlvbiB0eXBlICdhbnknLgorICAgICMgVE9ETzogd2Ugc2hvdWxkIHBlcmhhcHMgc3RvcmUgJ2FueScgZm9yIG1lc3NhZ2Ugb25seSB2YWxpZGF0aW9ucy4KKyAgICByZXR1cm4gMCBpZiAkcGFyYW0tPnt2YWxpZGF0ZX0gPT0gMDsKKworCisgICAgIyBUaGUgbGlzdCBhbmQgY3VzdG9tIHZhbGlkYXRpb25zIGRvbid0IGhhdmUgYSBjcml0ZXJpYSBzbyB3ZSB1c2UgYSBkZWZhdWx0CisgICAgIyBvZiAnYmV0d2VlbicuCisgICAgaWYgKCRwYXJhbS0+e3ZhbGlkYXRlfSA9PSAzIHx8ICRwYXJhbS0+e3ZhbGlkYXRlfSA9PSA3KSB7CisgICAgICAgICRwYXJhbS0+e2NyaXRlcmlhfSAgPSAnYmV0d2Vlbic7CisgICAgICAgICRwYXJhbS0+e21heGltdW19ICAgPSB1bmRlZjsKKyAgICB9CisKKyAgICAjICdjcml0ZXJpYScgaXMgYSByZXF1aXJlZCBwYXJhbWV0ZXIuCisgICAgaWYgKG5vdCBleGlzdHMgJHBhcmFtLT57Y3JpdGVyaWF9KSB7CisgICAgICAgIGNhcnAgIlBhcmFtZXRlciAnY3JpdGVyaWEnIGlzIHJlcXVpcmVkIGluIGRhdGFfdmFsaWRhdGlvbigpIjsKKyAgICAgICAgcmV0dXJuIC0zOworICAgIH0KKworCisgICAgIyBMaXN0IG9mIHZhbGlkIGNyaXRlcmlhIHR5cGVzLgorICAgIG15ICVjcml0ZXJpYV90eXBlID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JldHdlZW4nICAgICAgICAgICAgICAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3QgYmV0d2VlbicgICAgICAgICAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXF1YWwgdG8nICAgICAgICAgICAgICAgICAgICA9PiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9PScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm90IGVxdWFsIHRvJyAgICAgICAgICAgICAgICA9PiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyE9JyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8PicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3JlYXRlciB0aGFuJyAgICAgICAgICAgICAgICA9PiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsZXNzIHRoYW4nICAgICAgICAgICAgICAgICAgID0+IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bycgICAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc+PScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGVzcyB0aGFuIG9yIGVxdWFsIHRvJyAgICAgICA9PiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzw9JyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gNywKKyAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgIyBDaGVjayBmb3IgdmFsaWQgY3JpdGVyaWEgdHlwZXMuCisgICAgaWYgKG5vdCBleGlzdHMgJGNyaXRlcmlhX3R5cGV7bGMoJHBhcmFtLT57Y3JpdGVyaWF9KX0pIHsKKyAgICAgICAgY2FycCAiVW5rbm93biBjcml0ZXJpYSB0eXBlICckcGFyYW0tPntjcml0ZXJpYX0nIGZvciBwYXJhbWV0ZXIgIiAuCisgICAgICAgICAgICAgIidjcml0ZXJpYScgaW4gZGF0YV92YWxpZGF0aW9uKCkiOworICAgICAgICByZXR1cm4gLTM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkcGFyYW0tPntjcml0ZXJpYX0gPSAkY3JpdGVyaWFfdHlwZXtsYygkcGFyYW0tPntjcml0ZXJpYX0pfTsKKyAgICB9CisKKworICAgICMgJ0JldHdlZW4nIGFuZCAnTm90IGJldHdlZW4nIGNyaXRlcmlhIHJlcXVpcmUgMiB2YWx1ZXMuCisgICAgaWYgKCRwYXJhbS0+e2NyaXRlcmlhfSA9PSAwIHx8ICRwYXJhbS0+e2NyaXRlcmlhfSA9PSAxKSB7CisgICAgICAgIGlmIChub3QgZXhpc3RzICRwYXJhbS0+e21heGltdW19KSB7CisgICAgICAgICAgICBjYXJwICJQYXJhbWV0ZXIgJ21heGltdW0nIGlzIHJlcXVpcmVkIGluIGRhdGFfdmFsaWRhdGlvbigpICIgLgorICAgICAgICAgICAgICAgICAid2hlbiB1c2luZyAnYmV0d2Vlbicgb3IgJ25vdCBiZXR3ZWVuJyBjcml0ZXJpYSI7CisgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRwYXJhbS0+e21heGltdW19ID0gdW5kZWY7CisgICAgfQorCisKKworICAgICMgTGlzdCBvZiB2YWxpZCBlcnJvciBkaWFsb2cgdHlwZXMuCisgICAgbXkgJWVycm9yX3R5cGUgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RvcCcgICAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5mb3JtYXRpb24nID0+IDIsCisgICAgICAgICAgICAgICAgICAgICApOworCisgICAgIyBDaGVjayBmb3IgdmFsaWQgZXJyb3IgZGlhbG9nIHR5cGVzLgorICAgIGlmIChub3QgZXhpc3RzICRwYXJhbS0+e2Vycm9yX3R5cGV9KSB7CisgICAgICAgICRwYXJhbS0+e2Vycm9yX3R5cGV9ID0gMDsKKyAgICB9CisgICAgZWxzaWYgKG5vdCBleGlzdHMgJGVycm9yX3R5cGV7bGMoJHBhcmFtLT57ZXJyb3JfdHlwZX0pfSkgeworICAgICAgICBjYXJwICJVbmtub3duIGNyaXRlcmlhIHR5cGUgJyRwYXJhbS0+e2Vycm9yX3R5cGV9JyBmb3IgcGFyYW1ldGVyICIgLgorICAgICAgICAgICAgICInZXJyb3JfdHlwZScgaW4gZGF0YV92YWxpZGF0aW9uKCkiOworICAgICAgICByZXR1cm4gLTM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkcGFyYW0tPntlcnJvcl90eXBlfSA9ICRlcnJvcl90eXBle2xjKCRwYXJhbS0+e2Vycm9yX3R5cGV9KX07CisgICAgfQorCisKKyAgICAjIENvbnZlcnQgZGF0ZS90aW1lcyB2YWx1ZSBpZiByZXF1aXJlZC4KKyAgICBpZiAoJHBhcmFtLT57dmFsaWRhdGV9ID09IDQgfHwgJHBhcmFtLT57dmFsaWRhdGV9ID09IDUpIHsKKyAgICAgICAgaWYgKCRwYXJhbS0+e3ZhbHVlfSA9fiAvVC8pIHsKKyAgICAgICAgICAgIG15ICRkYXRlX3RpbWUgPSAkc2VsZi0+Y29udmVydF9kYXRlX3RpbWUoJHBhcmFtLT57dmFsdWV9KTsKKworICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRkYXRlX3RpbWUpIHsKKyAgICAgICAgICAgICAgICBjYXJwICJJbnZhbGlkIGRhdGUvdGltZSB2YWx1ZSAnJHBhcmFtLT57dmFsdWV9JyAiIC4KKyAgICAgICAgICAgICAgICAgICAgICJpbiBkYXRhX3ZhbGlkYXRpb24oKSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJHBhcmFtLT57dmFsdWV9ID0gJGRhdGVfdGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVmaW5lZCAkcGFyYW0tPnttYXhpbXVtfSAmJiAkcGFyYW0tPnttYXhpbXVtfSA9fiAvVC8pIHsKKyAgICAgICAgICAgIG15ICRkYXRlX3RpbWUgPSAkc2VsZi0+Y29udmVydF9kYXRlX3RpbWUoJHBhcmFtLT57bWF4aW11bX0pOworCisgICAgICAgICAgICBpZiAoIWRlZmluZWQgJGRhdGVfdGltZSkgeworICAgICAgICAgICAgICAgIGNhcnAgIkludmFsaWQgZGF0ZS90aW1lIHZhbHVlICckcGFyYW0tPnttYXhpbXVtfScgIiAuCisgICAgICAgICAgICAgICAgICAgICAiaW4gZGF0YV92YWxpZGF0aW9uKCkiOworICAgICAgICAgICAgICAgIHJldHVybiAtMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICRwYXJhbS0+e21heGltdW19ID0gJGRhdGVfdGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBkZWZpbmVkIGJ5IHRoZSB1c2VyLgorICAgICRwYXJhbS0+e2lnbm9yZV9ibGFua30gID0gMSBpZiAhZGVmaW5lZCAkcGFyYW0tPntpZ25vcmVfYmxhbmt9OworICAgICRwYXJhbS0+e2Ryb3Bkb3dufSAgICAgID0gMSBpZiAhZGVmaW5lZCAkcGFyYW0tPntkcm9wZG93bn07CisgICAgJHBhcmFtLT57c2hvd19pbnB1dH0gICAgPSAxIGlmICFkZWZpbmVkICRwYXJhbS0+e3Nob3dfaW5wdXR9OworICAgICRwYXJhbS0+e3Nob3dfZXJyb3J9ICAgID0gMSBpZiAhZGVmaW5lZCAkcGFyYW0tPntzaG93X2Vycm9yfTsKKworCisgICAgIyBUaGVzZSBhcmUgdGhlIGNlbGxzIHRvIHdoaWNoIHRoZSB2YWxpZGF0aW9uIGlzIGFwcGxpZWQuCisgICAgJHBhcmFtLT57Y2VsbHN9ID0gW1skcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMl1dOworCisgICAgIyBBIChmb3Igbm93KSB1bmRvY3VtZW50ZWQgcGFyYW1ldGVyIHRvIHBhc3MgYWRkaXRpb25hbCBjZWxsIHJhbmdlcy4KKyAgICBpZiAoZXhpc3RzICRwYXJhbS0+e290aGVyX2NlbGxzfSkgeworCisgICAgICAgIHB1c2ggQHskcGFyYW0tPntjZWxsc319LCBAeyRwYXJhbS0+e290aGVyX2NlbGxzfX07CisgICAgfQorCisgICAgIyBTdG9yZSB0aGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiB1bnRpbCB3ZSBjbG9zZSB0aGUgd29ya3NoZWV0LgorICAgIHB1c2ggQHskc2VsZi0+e192YWxpZGF0aW9uc319LCAkcGFyYW07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdmFsaWRhdGlvbl9jb3VudCgpCisjCisjIFN0b3JlIHRoZSBjb3VudCBvZiB0aGUgRFYgcmVjb3JkcyB0byBmb2xsb3cuCisjCisjIE5vdGUsIHRoaXMgY291bGQgYmUgd3JhcHBlZCBpbnRvIF9zdG9yZV9kdigpIGJ1dCB3ZSBtYXkgcmVxdWlyZSBzZXBhcmF0ZQorIyBoYW5kbGluZyBvZiB0aGUgb2JqZWN0IGlkIGF0IGEgbGF0ZXIgc3RhZ2UuCisjCitzdWIgX3N0b3JlX3ZhbGlkYXRpb25fY291bnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRkdl9jb3VudCA9IEB7JHNlbGYtPntfdmFsaWRhdGlvbnN9fTsKKyAgICBteSAkb2JqX2lkICAgPSAtMTsKKworICAgIHJldHVybiB1bmxlc3MgJGR2X2NvdW50OworCisgICAgJHNlbGYtPl9zdG9yZV9kdmFsKCRvYmpfaWQgLCAkZHZfY291bnQpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3ZhbGlkYXRpb25zKCkKKyMKKyMgU3RvcmUgdGhlIGRhdGFfdmFsaWRhdGlvbiByZWNvcmRzLgorIworc3ViIF9zdG9yZV92YWxpZGF0aW9ucyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIHVubGVzcyBzY2FsYXIgQHskc2VsZi0+e192YWxpZGF0aW9uc319OworCisgICAgZm9yIG15ICRwYXJhbSAoQHskc2VsZi0+e192YWxpZGF0aW9uc319KSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfZHYoICAgJHBhcmFtLT57Y2VsbHN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbS0+e3ZhbGlkYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntjcml0ZXJpYX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57dmFsdWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbS0+e21heGltdW19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbS0+e2lucHV0X3RpdGxlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntpbnB1dF9tZXNzYWdlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntlcnJvcl90aXRsZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57ZXJyb3JfbWVzc2FnZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57ZXJyb3JfdHlwZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57aWdub3JlX2JsYW5rfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntkcm9wZG93bn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57c2hvd19pbnB1dH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57c2hvd19lcnJvcn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZHZhbCgpCisjCisjIFN0b3JlIHRoZSBEViByZWNvcmQgd2hpY2ggY29udGFpbnMgdGhlIG51bWJlciBvZiBhbmQgaW5mb3JtYXRpb24gY29tbW9uIHRvCisjIGFsbCBEViBzdHJ1Y3R1cmVzLgorIworc3ViIF9zdG9yZV9kdmFsIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMUIyOyAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDEyOyAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG9ial9pZCAgICAgID0gJF9bMF07ICAgICAgICAjIE9iamVjdCBJRCBudW1iZXIuCisgICAgbXkgJGR2X2NvdW50ICAgID0gJF9bMV07ICAgICAgICAjIENvdW50IG9mIERWIHN0cnVjdHMgdG8gZm9sbG93LgorCisgICAgbXkgJGZsYWdzICAgICAgID0gMHgwMDA0OyAgICAgICAjIE9wdGlvbiBmbGFncy4KKyAgICBteSAkeF9jb29yZCAgICAgPSAweDAwMDAwMDAwOyAgICMgWCBjb29yZCBvZiBpbnB1dCBib3guCisgICAgbXkgJHlfY29vcmQgICAgID0gMHgwMDAwMDAwMDsgICAjIFkgY29vcmQgb2YgaW5wdXQgYm94LgorCisKKyAgICAjIFBhY2sgdGhlIHJlY29yZC4KKyAgICBteSAkaGVhZGVyID0gcGFjaygndnYnLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgID0gcGFjaygndlZWVlYnLCAkZmxhZ3MsICR4X2Nvb3JkLCAkeV9jb29yZCwgJG9ial9pZCwgJGR2X2NvdW50KTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9kdigpCisjCisjIFN0b3JlIHRoZSBEViByZWNvcmQgdGhhdCBzcGVjaWZpZXMgdGhlIGRhdGEgdmFsaWRhdGlvbiBjcml0ZXJpYSBhbmQgb3B0aW9ucworIyBmb3IgYSByYW5nZSBvZiBjZWxscy4uCisjCitzdWIgX3N0b3JlX2R2IHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAxQkU7ICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDAwOyAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGZsYWdzICAgICAgICAgICA9IDB4MDAwMDAwMDA7ICAgIyBEViBvcHRpb24gZmxhZ3MuCisKKyAgICBteSAkY2VsbHMgICAgICAgICAgID0gJF9bMF07ICAgICAgICAjIEFyZWYgb2YgY2VsbHMgdG8gd2hpY2ggRFYgYXBwbGllcy4KKyAgICBteSAkdmFsaWRhdGlvbl90eXBlID0gJF9bMV07ICAgICAgICAjIFR5cGUgb2YgZGF0YSB2YWxpZGF0aW9uLgorICAgIG15ICRjcml0ZXJpYV90eXBlICAgPSAkX1syXTsgICAgICAgICMgVmFsaWRhdGlvbiBjcml0ZXJpYS4KKyAgICBteSAkZm9ybXVsYV8xICAgICAgID0gJF9bM107ICAgICAgICAjIFZhbHVlL1NvdXJjZS9NaW5pbXVtIGZvcm11bGEuCisgICAgbXkgJGZvcm11bGFfMiAgICAgICA9ICRfWzRdOyAgICAgICAgIyBNYXhpbXVtIGZvcm11bGEuCisgICAgbXkgJGlucHV0X3RpdGxlICAgICA9ICRfWzVdOyAgICAgICAgIyBUaXRsZSBvZiBpbnB1dCBtZXNzYWdlLgorICAgIG15ICRpbnB1dF9tZXNzYWdlICAgPSAkX1s2XTsgICAgICAgICMgVGV4dCBvZiBpbnB1dCBtZXNzYWdlLgorICAgIG15ICRlcnJvcl90aXRsZSAgICAgPSAkX1s3XTsgICAgICAgICMgVGl0bGUgb2YgZXJyb3IgbWVzc2FnZS4KKyAgICBteSAkZXJyb3JfbWVzc2FnZSAgID0gJF9bOF07ICAgICAgICAjIFRleHQgb2YgaW5wdXQgbWVzc2FnZS4KKyAgICBteSAkZXJyb3JfdHlwZSAgICAgID0gJF9bOV07ICAgICAgICAjIEVycm9yIGRpYWxvZyB0eXBlLgorICAgIG15ICRpZ25vcmVfYmxhbmsgICAgPSAkX1sxMF07ICAgICAgICMgSWdub3JlIGJsYW5rIGNlbGxzLgorICAgIG15ICRkcm9wZG93biAgICAgICAgPSAkX1sxMV07ICAgICAgICMgRGlzcGxheSBkcm9wZG93biB3aXRoIGxpc3QuCisgICAgbXkgJGlucHV0X2JveCAgICAgICA9ICRfWzEyXTsgICAgICAgIyBEaXNwbGF5IGlucHV0IGJveC4KKyAgICBteSAkZXJyb3JfYm94ICAgICAgID0gJF9bMTNdOyAgICAgICAjIERpc3BsYXkgZXJyb3IgYm94LgorICAgIG15ICRpbWVfbW9kZSAgICAgICAgPSAwOyAgICAgICAgICAgICMgSU1FIGlucHV0IG1vZGUgZm9yIGZhciBlYXN0IGZvbnRzLgorICAgIG15ICRzdHJfbG9va3VwICAgICAgPSAwOyAgICAgICAgICAgICMgU2VlIGJlbG93LgorCisgICAgIyBTZXQgdGhlIHN0cmluZyBsb29rdXAgZmxhZyBmb3IgJ2xpc3QnIHZhbGlkYXRpb25zIHdpdGggYSBzdHJpbmcgYXJyYXkuCisgICAgaWYgKCR2YWxpZGF0aW9uX3R5cGUgPT0gMyAmJiByZWYgJGZvcm11bGFfMSBlcSAnQVJSQVknKSAgeworICAgICAgICAkc3RyX2xvb2t1cCA9IDE7CisgICAgfQorCisgICAgIyBUaGUgZHJvcGRvd24gZmxhZyBpcyBzdG9yZWQgYXMgYSBuZWdhdGVkIHZhbHVlLgorICAgIG15ICRub19kcm9wZG93biA9IG5vdCAkZHJvcGRvd247CisKKyAgICAjIFNldCB0aGUgcmVxdWlyZWQgZmxhZ3MuCisgICAgJGZsYWdzIHw9ICR2YWxpZGF0aW9uX3R5cGU7CisgICAgJGZsYWdzIHw9ICRlcnJvcl90eXBlICAgICAgIDw8IDQ7CisgICAgJGZsYWdzIHw9ICRzdHJfbG9va3VwICAgICAgIDw8IDc7CisgICAgJGZsYWdzIHw9ICRpZ25vcmVfYmxhbmsgICAgIDw8IDg7CisgICAgJGZsYWdzIHw9ICRub19kcm9wZG93biAgICAgIDw8IDk7CisgICAgJGZsYWdzIHw9ICRpbWVfbW9kZSAgICAgICAgIDw8IDEwOworICAgICRmbGFncyB8PSAkaW5wdXRfYm94ICAgICAgICA8PCAxODsKKyAgICAkZmxhZ3MgfD0gJGVycm9yX2JveCAgICAgICAgPDwgMTk7CisgICAgJGZsYWdzIHw9ICRjcml0ZXJpYV90eXBlICAgIDw8IDIwOworCisgICAgIyBQYWNrIHRoZSB2YWxpZGF0aW9uIGZvcm11bGFzLgorICAgICRmb3JtdWxhXzEgPSAkc2VsZi0+X3BhY2tfZHZfZm9ybXVsYSgkZm9ybXVsYV8xKTsKKyAgICAkZm9ybXVsYV8yID0gJHNlbGYtPl9wYWNrX2R2X2Zvcm11bGEoJGZvcm11bGFfMik7CisKKyAgICAjIFBhY2sgdGhlIGlucHV0IGFuZCBlcnJvciBkaWFsb2cgc3RyaW5ncy4KKyAgICAkaW5wdXRfdGl0bGUgICA9ICRzZWxmLT5fcGFja19kdl9zdHJpbmcoJGlucHV0X3RpdGxlLCAgIDMyICk7CisgICAgJGVycm9yX3RpdGxlICAgPSAkc2VsZi0+X3BhY2tfZHZfc3RyaW5nKCRlcnJvcl90aXRsZSwgICAzMiApOworICAgICRpbnB1dF9tZXNzYWdlID0gJHNlbGYtPl9wYWNrX2R2X3N0cmluZygkaW5wdXRfbWVzc2FnZSwgMjU1KTsKKyAgICAkZXJyb3JfbWVzc2FnZSA9ICRzZWxmLT5fcGFja19kdl9zdHJpbmcoJGVycm9yX21lc3NhZ2UsIDI1NSk7CisKKyAgICAjIFBhY2sgdGhlIERWIGNlbGwgZGF0YS4KKyAgICBteSAkZHZfY291bnQgPSBzY2FsYXIgQCRjZWxsczsKKyAgICBteSAkZHZfZGF0YSAgPSBwYWNrICd2JywgJGR2X2NvdW50OworICAgIGZvciBteSAkcmFuZ2UgKEAkY2VsbHMpIHsKKyAgICAgICAgJGR2X2RhdGEgLj0gcGFjayAndnZ2dicsICRyYW5nZS0+WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJhbmdlLT5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmFuZ2UtPlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyYW5nZS0+WzNdOworICAgIH0KKworICAgICMgUGFjayB0aGUgcmVjb3JkLgorICAgIG15ICRkYXRhICAgPSBwYWNrICdWJywgJGZsYWdzOworICAgICAgICRkYXRhICAuPSAkaW5wdXRfdGl0bGU7CisgICAgICAgJGRhdGEgIC49ICRlcnJvcl90aXRsZTsKKyAgICAgICAkZGF0YSAgLj0gJGlucHV0X21lc3NhZ2U7CisgICAgICAgJGRhdGEgIC49ICRlcnJvcl9tZXNzYWdlOworICAgICAgICRkYXRhICAuPSAkZm9ybXVsYV8xOworICAgICAgICRkYXRhICAuPSAkZm9ybXVsYV8yOworICAgICAgICRkYXRhICAuPSAkZHZfZGF0YTsKKworICAgIG15ICRoZWFkZXIgPSBwYWNrKCd2dicsICRyZWNvcmQsIGxlbmd0aCAkZGF0YSk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcGFja19kdl9zdHJpbmcoKQorIworIyBQYWNrIHRoZSBzdHJpbmdzIHVzZWQgaW4gdGhlIGlucHV0IGFuZCBlcnJvciBkaWFsb2cgY2FwdGlvbnMgYW5kIG1lc3NhZ2VzLgorIyBDYXB0aW9ucyBhcmUgbGltaXRlZCB0byAzMiBjaGFyYWN0ZXJzLiBNZXNzYWdlcyBhcmUgbGltaXRlZCB0byAyNTUgY2hhcnMuCisjCitzdWIgX3BhY2tfZHZfc3RyaW5nIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHN0cmluZyAgICAgID0gJF9bMF07CisgICAgbXkgJG1heF9sZW5ndGggID0gJF9bMV07CisKKyAgICBteSAkc3RyX2xlbmd0aCAgPSAwOworICAgIG15ICRlbmNvZGluZyAgICA9IDA7CisKKyAgICAjIFRoZSBkZWZhdWx0IGVtcHR5IHN0cmluZyBpcyAiXDAiLgorICAgIGlmICghZGVmaW5lZCAkc3RyaW5nIHx8ICRzdHJpbmcgZXEgJycpIHsKKyAgICAgICAgJHN0cmluZyA9ICJcMCI7CisgICAgfQorCisgICAgIyBFeGNlbCBsaW1pdHMgRFYgY2FwdGlvbnMgdG8gMzIgY2hhcnMgYW5kIG1lc3NhZ2VzIHRvIDI1NS4KKyAgICBpZiAobGVuZ3RoICRzdHJpbmcgPiAkbWF4X2xlbmd0aCkgeworICAgICAgICAkc3RyaW5nID0gc3Vic3RyKCRzdHJpbmcsIDAsICRtYXhfbGVuZ3RoKTsKKyAgICB9CisKKyAgICAkc3RyX2xlbmd0aCA9IGxlbmd0aCAkc3RyaW5nOworCisgICAgIyBIYW5kbGUgdXRmOCBzdHJpbmdzIGluIHBlcmwgNS44LgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICBpZiAoRW5jb2RlOjppc191dGY4KCRzdHJpbmcpKSB7CisgICAgICAgICAgICAkc3RyaW5nID0gRW5jb2RlOjplbmNvZGUoIlVURi0xNkxFIiwgJHN0cmluZyk7CisgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBhY2soJ3ZDJywgJHN0cl9sZW5ndGgsICRlbmNvZGluZykgLiAkc3RyaW5nOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhY2tfZHZfZm9ybXVsYSgpCisjCisjIFBhY2sgdGhlIGZvcm11bGEgdXNlZCBpbiB0aGUgRFYgcmVjb3JkLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGFuIGNlbGwgZm9ybXVsYQorIyB3aXRoIHNvbWUgYWRkaXRpb25hbCBoZWFkZXIgaW5mb3JtYXRpb24uIE5vdGUsIERWIGZvcm11bGFzIGluIEV4Y2VsIHVzZQorIyByZWxhdGl2ZSBhZGRyZXNzaW5nIChSMUMxIGFuZCBwdGdYeHhOKSBob3dldmVyIHdlIHVzZSB0aGUgRm9ybXVsYS5wbSdzCisjIGRlZmF1bHQgYWJzb2x1dGUgYWRkcmVzc2luZyAoQTEgYW5kIHB0Z1h4eCkuCisjCitzdWIgX3BhY2tfZHZfZm9ybXVsYSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRmb3JtdWxhICAgICA9ICRfWzBdOworICAgIG15ICRlbmNvZGluZyAgICA9IDA7CisgICAgbXkgJGxlbmd0aCAgICAgID0gMDsKKyAgICBteSAkdW51c2VkICAgICAgPSAweDAwMDA7CisgICAgbXkgQHRva2VuczsKKworICAgICMgUmV0dXJuIGEgZGVmYXVsdCBzdHJ1Y3R1cmUgZm9yIHVudXNlZCBmb3JtdWxhcy4KKyAgICBpZiAoIWRlZmluZWQgJGZvcm11bGEgfHwgJGZvcm11bGEgZXEgJycpIHsKKyAgICAgICAgcmV0dXJuIHBhY2soJ3Z2JywgMCwgJHVudXNlZCk7CisgICAgfQorCisgICAgIyBQYWNrIGEgbGlzdCBhcnJheSByZWYgYXMgYSBudWxsIHNlcGFyYXRlZCBzdHJpbmcuCisgICAgaWYgKHJlZiAkZm9ybXVsYSBlcSAnQVJSQVknKSB7CisgICAgICAgICRmb3JtdWxhICAgPSBqb2luICJcMCIsIEAkZm9ybXVsYTsKKyAgICAgICAgJGZvcm11bGEgICA9IHFxKCIkZm9ybXVsYSIpOworICAgIH0KKworICAgICMgU3RyaXAgdGhlID0gc2lnbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb3JtdWxhIHN0cmluZworICAgICRmb3JtdWxhICAgID1+IHMoXj0pKCk7CisKKyAgICAjIFBhcnNlIHRoZSBmb3JtdWxhIHVzaW5nIHRoZSBwYXJzZXIgaW4gRm9ybXVsYS5wbQorICAgIG15ICRwYXJzZXIgID0gJHNlbGYtPntfcGFyc2VyfTsKKworICAgICMgSW4gb3JkZXIgdG8gcmFpc2UgZm9ybXVsYSBlcnJvcnMgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgY2FsbGluZworICAgICMgcHJvZ3JhbSB3ZSB1c2UgYW4gZXZhbCBibG9jayBhbmQgcmUtcmFpc2UgdGhlIGVycm9yIGZyb20gaGVyZS4KKyAgICAjCisgICAgZXZhbCB7IEB0b2tlbnMgPSAkcGFyc2VyLT5wYXJzZV9mb3JtdWxhKCRmb3JtdWxhKSB9OworCisgICAgaWYgKCRAKSB7CisgICAgICAgICRAID1+IHMvXG4kLy87ICAjIFN0cmlwIHRoZSBcbiB1c2VkIGluIHRoZSBGb3JtdWxhLnBtIGRpZSgpCisgICAgICAgIGNyb2FrICRAOyAgICAgICAjIFJlLXJhaXNlIHRoZSBlcnJvcgorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBUT0RPIHRlc3QgZm9yIG5vbiB2YWxpZCBwdGdzIHN1Y2ggYXMgU2hlZXQyIUExCisgICAgfQorICAgICMgRm9yY2UgMmQgcmFuZ2VzIHRvIGJlIGEgcmVmZXJlbmNlIGNsYXNzLgorICAgIHMvX3JhbmdlMmQvX3JhbmdlMmRSLyBmb3IgQHRva2VuczsKKyAgICBzL19uYW1lL19uYW1lUi8gICAgICAgZm9yIEB0b2tlbnM7CisKKyAgICAjIFBhcnNlIHRoZSB0b2tlbnMgaW50byBhIGZvcm11bGEgc3RyaW5nLgorICAgICRmb3JtdWxhID0gJHBhcnNlci0+cGFyc2VfdG9rZW5zKEB0b2tlbnMpOworCisKKyAgICByZXR1cm4gcGFjaygndnYnLCBsZW5ndGggJGZvcm11bGEsICR1bnVzZWQpIC4gJGZvcm11bGE7Cit9CisKKworCisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworV29ya3NoZWV0IC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIFdvcmtzaGVldHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCiupIE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9UZXh0L0NTVi5wbSBiL21jdS90b29scy9wZXJsL1RleHQvQ1NWLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDcyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9UZXh0L0NTVi5wbQpAQCAtMCwwICsxLDI0NjcgQEAKK3BhY2thZ2UgVGV4dDo6Q1NWOworCisKK3VzZSBzdHJpY3Q7Cit1c2UgRXhwb3J0ZXI7Cit1c2UgQ2FycCAoKTsKK3VzZSB2YXJzIHF3KCAkVkVSU0lPTiAkREVCVUcgQElTQSBARVhQT1JUX09LICk7CitASVNBID0gcXcoIEV4cG9ydGVyICk7CitARVhQT1JUX09LID0gcXcoIGNzdiApOworCitCRUdJTiB7CisgICAgJFZFUlNJT04gPSAnMS45NSc7CisgICAgJERFQlVHICAgPSAwOworfQorCisjIGlmIHVzZSBDU1ZfWFMsIHJlcXVpcmVzIHZlcnNpb24KK215ICRNb2R1bGVfWFMgID0gJ1RleHQ6OkNTVl9YUyc7CitteSAkTW9kdWxlX1BQICA9ICdUZXh0OjpDU1ZfUFAnOworbXkgJFhTX1ZlcnNpb24gPSAnMS4wMic7CisKK215ICRJc19EeW5hbWljID0gMDsKKworbXkgQFB1YmxpY01ldGhvZHMgPSBxdy8KKyAgICB2ZXJzaW9uIG5ldyBlcnJvcl9kaWFnIGVycm9yX2lucHV0CisgICAga25vd25fYXR0cmlidXRlcyBjc3YKKyAgICBQViBJViBOVgorLzsKKyMKKworIyBDaGVjayB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZGVjaWRlIHdvcmtlciBtb2R1bGUuCisKK3VubGVzcyAoJFRleHQ6OkNTVjo6V29ya2VyKSB7CisgICAgJFRleHQ6OkNTVjo6REVCVUcgYW5kICBDYXJwOjpjYXJwKCJDaGVjayB1c2VkIHdvcmtlciBtb2R1bGUuLi4iKTsKKworICAgIGlmICggZXhpc3RzICRFTlZ7UEVSTF9URVhUX0NTVn0gKSB7CisgICAgICAgIGlmICgkRU5We1BFUkxfVEVYVF9DU1Z9IGVxICcwJyBvciAkRU5We1BFUkxfVEVYVF9DU1Z9IGVxICdUZXh0OjpDU1ZfUFAnKSB7CisgICAgICAgICAgICBfbG9hZF9wcCgpIG9yIENhcnA6OmNyb2FrICRAOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkRU5We1BFUkxfVEVYVF9DU1Z9IGVxICcxJyBvciAkRU5We1BFUkxfVEVYVF9DU1Z9ID1+IC9UZXh0OjpDU1ZfWFNccyosXHMqVGV4dDo6Q1NWX1BQLykgeworICAgICAgICAgICAgX2xvYWRfeHMoKSBvciBfbG9hZF9wcCgpIG9yIENhcnA6OmNyb2FrICRAOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkRU5We1BFUkxfVEVYVF9DU1Z9IGVxICcyJyBvciAkRU5We1BFUkxfVEVYVF9DU1Z9IGVxICdUZXh0OjpDU1ZfWFMnKSB7CisgICAgICAgICAgICBfbG9hZF94cygpIG9yIENhcnA6OmNyb2FrICRAOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQ2FycDo6Y3JvYWsgIlRoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudGFsIHZhcmlhYmxlICdQRVJMX1RFWFRfQ1NWJyBpcyBpbnZhbGlkLiI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9sb2FkX3hzKCkgb3IgX2xvYWRfcHAoKSBvciBDYXJwOjpjcm9hayAkQDsKKyAgICB9CisKK30KKworc3ViIG5ldyB7ICMgbm9ybWFsIG1vZGUKKyAgICBteSAkcHJvdG8gPSBzaGlmdDsKKyAgICBteSAkY2xhc3MgPSByZWYoJHByb3RvKSB8fCAkcHJvdG87CisKKyAgICB1bmxlc3MgKCAkcHJvdG8gKSB7ICMgZm9yIFRleHQ6OkNTVl9YUy9QUDo6bmV3KDApOworICAgICAgICByZXR1cm4gZXZhbCBxcXwgJFRleHQ6OkNTVjo6V29ya2VyXDo6bmV3KCBcJHByb3RvICkgfDsKKyAgICB9CisKKyAgICAjaWYgKHJlZiAkX1swXSBhbmQgJF9bMF0tPnttb2R1bGV9KSB7CisgICAgIyAgICBDYXJwOjpjcm9haygiQ2FuJ3Qgc2V0ICdtb2R1bGUnIGluIG5vbiBkeW5hbWljIG1vZGUuIik7CisgICAgI30KKworICAgIGlmICggbXkgJG9iaiA9ICRUZXh0OjpDU1Y6Oldvcmtlci0+bmV3KEBfKSApIHsKKyAgICAgICAgJG9iai0+e19NT0RVTEV9ID0gJFRleHQ6OkNTVjo6V29ya2VyOworICAgICAgICBibGVzcyAkb2JqLCAkY2xhc3M7CisgICAgICAgIHJldHVybiAkb2JqOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCit9CisKKworc3ViIHJlcXVpcmVfeHNfdmVyc2lvbiB7ICRYU19WZXJzaW9uOyB9CisKKworc3ViIG1vZHVsZSB7CisgICAgbXkgJHByb3RvID0gc2hpZnQ7CisgICAgcmV0dXJuICAgIXJlZigkcHJvdG8pICAgICAgICAgICAgPyAkVGV4dDo6Q1NWOjpXb3JrZXIKKyAgICAgICAgICAgOiAgcmVmKCRwcm90by0+e19NT0RVTEV9KSA/IHJlZigkcHJvdG8tPntfTU9EVUxFfSkgOiAkcHJvdG8tPntfTU9EVUxFfTsKK30KKworKmJhY2tlbmQgPSAqbW9kdWxlOworCisKK3N1YiBpc194cyB7CisgICAgcmV0dXJuICRfWzBdLT5tb2R1bGUgZXEgJE1vZHVsZV9YUzsKK30KKworCitzdWIgaXNfcHAgeworICAgIHJldHVybiAkX1swXS0+bW9kdWxlIGVxICRNb2R1bGVfUFA7Cit9CisKKworc3ViIGlzX2R5bmFtaWMgeyAkSXNfRHluYW1pYzsgfQorCitzdWIgX2xvYWRfeHMgeyBfbG9hZCgkTW9kdWxlX1hTLCAkWFNfVmVyc2lvbikgfQorCitzdWIgX2xvYWRfcHAgeyBfbG9hZCgkTW9kdWxlX1BQKSB9CisKK3N1YiBfbG9hZCB7CisgICAgbXkgKCRtb2R1bGUsICR2ZXJzaW9uKSA9IEBfOworICAgICR2ZXJzaW9uIHx8PSAnJzsKKworICAgICRUZXh0OjpDU1Y6OkRFQlVHIGFuZCBDYXJwOjpjYXJwICJMb2FkICRtb2R1bGUuIjsKKworICAgIGV2YWwgcXF8IHVzZSAkbW9kdWxlICR2ZXJzaW9uIHw7CisKKyAgICByZXR1cm4gaWYgJEA7CisKKyAgICBwdXNoIEBUZXh0OjpDU1Y6OklTQSwgJG1vZHVsZTsKKyAgICAkVGV4dDo6Q1NWOjpXb3JrZXIgPSAkbW9kdWxlOworCisgICAgbG9jYWwgJF5XOworICAgIG5vIHN0cmljdCBxdyhyZWZzKTsKKworICAgIGZvciBteSAkbWV0aG9kIChAUHVibGljTWV0aG9kcykgeworICAgICAgICAqeyJUZXh0OjpDU1Y6OiRtZXRob2QifSA9IFwmeyIkbW9kdWxlXDo6JG1ldGhvZCJ9OworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworCisKKzE7CitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworVGV4dDo6Q1NWIC0gY29tbWEtc2VwYXJhdGVkIHZhbHVlcyBtYW5pcHVsYXRvciAodXNpbmcgWFMgb3IgUHVyZVBlcmwpCisKKworPWhlYWQxIFNZTk9QU0lTCisKKyB1c2UgVGV4dDo6Q1NWOworCisgbXkgQHJvd3M7CisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICggeyBiaW5hcnkgPT4gMSB9ICkgICMgc2hvdWxkIHNldCBiaW5hcnkgYXR0cmlidXRlLgorICAgICAgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCB1c2UgQ1NWOiAiLlRleHQ6OkNTVi0+ZXJyb3JfZGlhZyAoKTsKKworIG9wZW4gbXkgJGZoLCAiPDplbmNvZGluZyh1dGY4KSIsICJ0ZXN0LmNzdiIgb3IgZGllICJ0ZXN0LmNzdjogJCEiOworIHdoaWxlICggbXkgJHJvdyA9ICRjc3YtPmdldGxpbmUoICRmaCApICkgeworICAgICAkcm93LT5bMl0gPX4gbS9wYXR0ZXJuLyBvciBuZXh0OyAjIDNyZCBmaWVsZCBzaG91bGQgbWF0Y2gKKyAgICAgcHVzaCBAcm93cywgJHJvdzsKKyB9CisgJGNzdi0+ZW9mIG9yICRjc3YtPmVycm9yX2RpYWcoKTsKKyBjbG9zZSAkZmg7CisKKyAkY3N2LT5lb2wgKCJcclxuIik7CisKKyBvcGVuICRmaCwgIj46ZW5jb2RpbmcodXRmOCkiLCAibmV3LmNzdiIgb3IgZGllICJuZXcuY3N2OiAkISI7CisgJGNzdi0+cHJpbnQgKCRmaCwgJF8pIGZvciBAcm93czsKKyBjbG9zZSAkZmggb3IgZGllICJuZXcuY3N2OiAkISI7CisKKyAjCisgIyBwYXJzZSBhbmQgY29tYmluZSBzdHlsZQorICMKKworICRzdGF0dXMgPSAkY3N2LT5jb21iaW5lKEBjb2x1bW5zKTsgICAgIyBjb21iaW5lIGNvbHVtbnMgaW50byBhIHN0cmluZworICRsaW5lICAgPSAkY3N2LT5zdHJpbmcoKTsgICAgICAgICAgICAgIyBnZXQgdGhlIGNvbWJpbmVkIHN0cmluZworCisgJHN0YXR1cyAgPSAkY3N2LT5wYXJzZSgkbGluZSk7ICAgICAgICAjIHBhcnNlIGEgQ1NWIHN0cmluZyBpbnRvIGZpZWxkcworIEBjb2x1bW5zID0gJGNzdi0+ZmllbGRzKCk7ICAgICAgICAgICAgIyBnZXQgdGhlIHBhcnNlZCBmaWVsZHMKKworICRzdGF0dXMgICAgICAgPSAkY3N2LT5zdGF0dXMgKCk7ICAgICAgIyBnZXQgdGhlIG1vc3QgcmVjZW50IHN0YXR1cworICRiYWRfYXJndW1lbnQgPSAkY3N2LT5lcnJvcl9pbnB1dCAoKTsgIyBnZXQgdGhlIG1vc3QgcmVjZW50IGJhZCBhcmd1bWVudAorICRkaWFnICAgICAgICAgPSAkY3N2LT5lcnJvcl9kaWFnICgpOyAgIyBpZiBhbiBlcnJvciBvY2N1cnJlZCwgZXhwbGFpbnMgV0hZCisKKyAkc3RhdHVzID0gJGNzdi0+cHJpbnQgKCRpbywgJGNvbHJlZik7ICMgV3JpdGUgYW4gYXJyYXkgb2YgZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGltbWVkaWF0ZWx5IHRvIGEgZmlsZSAkaW8KKyAkY29scmVmID0gJGNzdi0+Z2V0bGluZSAoJGlvKTsgICAgICAgICMgUmVhZCBhIGxpbmUgZnJvbSBmaWxlICRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGFyc2UgaXQgYW5kIHJldHVybiBhbiBhcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZWYgb2YgZmllbGRzCisgJGNzdi0+Y29sdW1uX25hbWVzIChAbmFtZXMpOyAgICAgICAgICAjIFNldCBjb2x1bW4gbmFtZXMgZm9yIGdldGxpbmVfaHIgKCkKKyAkcmVmID0gJGNzdi0+Z2V0bGluZV9ociAoJGlvKTsgICAgICAgICMgZ2V0bGluZSAoKSwgYnV0IHJldHVybnMgYSBoYXNocmVmCisgJGVvZiA9ICRjc3YtPmVvZiAoKTsgICAgICAgICAgICAgICAgICAjIEluZGljYXRlIGlmIGxhc3QgcGFyc2Ugb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0bGluZSAoKSBoaXQgRW5kIE9mIEZpbGUKKworICRjc3YtPnR5cGVzKFxAdF9hcnJheSk7ICAgICAgICAgICAgICAgIyBTZXQgY29sdW1uIHR5cGVzCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUZXh0OjpDU1YgaXMgYSB0aGluIHdyYXBwZXIgZm9yIEw8VGV4dDo6Q1NWX1hTPi1jb21wYXRpYmxlIG1vZHVsZXMgbm93LgorQWxsIHRoZSBiYWNrZW5kIG1vZHVsZXMgcHJvdmlkZSBmYWNpbGl0aWVzIGZvciB0aGUgY29tcG9zaXRpb24gYW5kCitkZWNvbXBvc2l0aW9uIG9mIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMuIFRleHQ6OkNTViB1c2VzIFRleHQ6OkNTVl9YUworYnkgZGVmYXVsdCwgYW5kIHdoZW4gVGV4dDo6Q1NWX1hTIGlzIG5vdCBhdmFpbGFibGUsIGZhbGxzIGJhY2sgb24KK0w8VGV4dDo6Q1NWX1BQPiwgd2hpY2ggaXMgYnVuZGxlZCBpbiB0aGUgc2FtZSBkaXN0cmlidXRpb24gYXMgdGhpcyBtb2R1bGUuCisKKz1oZWFkMSBDSE9PU0lORyBCQUNLRU5ECisKK1RoaXMgbW9kdWxlIHJlc3BlY3RzIGFuIGVudmlyb25tZW50YWwgdmFyaWFibGUgY2FsbGVkIEM8UEVSTF9URVhUX0NTVj4KK3doZW4gaXQgZGVjaWRlcyBhIGJhY2tlbmQgbW9kdWxlIHRvIHVzZS4gSWYgdGhpcyBlbnZpcm9ubWVudGFsIHZhcmlhYmxlCitpcyBub3Qgc2V0LCBpdCB0cmllcyB0byBsb2FkIFRleHQ6OkNTVl9YUywgYW5kIGlmIFRleHQ6OkNTVl9YUyBpcyBub3QKK2F2YWlsYWJsZSwgZmFsbHMgYmFjayBvbiBUZXh0OjpDU1ZfUFA7CisKK0lmIHlvdSBhbHdheXMgZG9uJ3Qgd2FudCBpdCB0byBmYWxsIGJhY2sgb24gVGV4dDo6Q1NWX1BQLCBzZXQgdGhlIHZhcmlhYmxlCitsaWtlIHRoaXMgKEM8ZXhwb3J0PiBtYXkgYmUgQzxzZXRlbnY+LCBDPHNldD4gYW5kIHRoZSBsaWtlcywgZGVwZW5kaW5nCitvbiB5b3VyIGVudmlyb25tZW50KToKKworICA+IGV4cG9ydCBQRVJMX1RFWFRfQ1NWPVRleHQ6OkNTVl9YUworCitJZiB5b3UgcHJlZmVyIFRleHQ6OkNTVl9YUyB0byBUZXh0OjpDU1ZfUFAgKGRlZmF1bHQpLCB0aGVuOgorCisgID4gZXhwb3J0IFBFUkxfVEVYVF9DU1Y9VGV4dDo6Q1NWX1hTLFRleHQ6OkNTVl9QUAorCitZb3UgbWF5IGFsc28gd2FudCB0byBzZXQgdGhpcyB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHlvdXIgdGVzdCBmaWxlcywgaW4gb3JkZXIKK25vdCB0byBiZSBib3RoZXJlZCB3aXRoIGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gYmFja2VuZHMgKHlvdSBuZWVkIHRvIHdyYXAKK3RoaXMgaW4gQzxCRUdJTj4sIGFuZCBzZXQgYmVmb3JlIGFjdHVhbGx5IEM8dXNlPi1pbmcgVGV4dDo6Q1NWIG1vZHVsZSwgYXMgaXQKK2RlY2lkZXMgaXRzIGJhY2tlbmQgYXMgc29vbiBhcyBpdCdzIGxvYWRlZCk6CisKKyAgQkVHSU4geyAkRU5We1BFUkxfVEVYVF9DU1Z9PSdUZXh0OjpDU1ZfUFAnOyB9CisgIHVzZSBUZXh0OjpDU1Y7CisKKz1oZWFkMSBOT1RFUworCitUaGlzIHNlY3Rpb24gaXMgdGFrZW4gZnJvbSBUZXh0OjpDU1ZfWFMuCisKKz1oZWFkMiBFbWJlZGRlZCBuZXdsaW5lcworCitCPEltcG9ydGFudCBOb3RlPjogIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGFjY2VwdCBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMKK2luIHRoZSByYW5nZSBmcm9tIEM8MHgyMD4gKHNwYWNlKSB0byBDPDB4N0U+ICh0aWxkZSkuICAgVGhpcyBtZWFucyB0aGF0IHRoZQorZmllbGRzIGNhbiBub3QgY29udGFpbiBuZXdsaW5lcy4gSWYgeW91ciBkYXRhIGNvbnRhaW5zIG5ld2xpbmVzIGVtYmVkZGVkIGluCitmaWVsZHMsIG9yIGNoYXJhY3RlcnMgYWJvdmUgQzwweDdFPiAodGlsZGUpLCBvciBiaW5hcnkgZGF0YSwgeW91IEI8STxtdXN0Pj4KK3NldCBDPDwgYmluYXJ5ID0+IDEgPj4gaW4gdGhlIGNhbGwgdG8gTDwvbmV3Pi4gVG8gY292ZXIgdGhlIHdpZGVzdCByYW5nZSBvZgorcGFyc2luZyBvcHRpb25zLCB5b3Ugd2lsbCBhbHdheXMgd2FudCB0byBzZXQgYmluYXJ5LgorCitCdXQgeW91IHN0aWxsIGhhdmUgdGhlIHByb2JsZW0gIHRoYXQgeW91IGhhdmUgdG8gcGFzcyBhIGNvcnJlY3QgbGluZSB0byB0aGUKK0w8L3BhcnNlPiBtZXRob2QsIHdoaWNoIGlzIG1vcmUgY29tcGxpY2F0ZWQgZnJvbSB0aGUgdXN1YWwgcG9pbnQgb2YgdXNhZ2U6CisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsgYmluYXJ5ID0+IDEsIGVvbCA9PiAkLyB9KTsKKyB3aGlsZSAoPD4pIHsJCSMgIFdST05HIQorICAgICAkY3N2LT5wYXJzZSAoJF8pOworICAgICBteSBAZmllbGRzID0gJGNzdi0+ZmllbGRzICgpOworICAgICB9CisKK3RoaXMgd2lsbCBicmVhaywgYXMgdGhlIEM8d2hpbGU+IG1pZ2h0IHJlYWQgYnJva2VuIGxpbmVzOiAgaXQgZG9lcyBub3QgY2FyZQorYWJvdXQgdGhlIHF1b3RpbmcuIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgZW1iZWRkZWQgbmV3bGluZXMsICB0aGUgd2F5IHRvIGdvCitpcyB0byAgQjxub3Q+ICBwYXNzIEw8Qzxlb2w+fC9lb2w+IGluIHRoZSBwYXJzZXIgIChpdCBhY2NlcHRzIEM8XG4+LCBDPFxyPiwKK0I8YW5kPiBDPFxyXG4+IGJ5IGRlZmF1bHQpIGFuZCB0aGVuCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsgYmluYXJ5ID0+IDEgfSk7Cisgb3BlbiBteSAkaW8sICI8IiwgJGZpbGUgb3IgZGllICIkZmlsZTogJCEiOworIHdoaWxlIChteSAkcm93ID0gJGNzdi0+Z2V0bGluZSAoJGlvKSkgeworICAgICBteSBAZmllbGRzID0gQCRyb3c7CisgICAgIH0KKworVGhlIG9sZChlcikgd2F5IG9mIHVzaW5nIGdsb2JhbCBmaWxlIGhhbmRsZXMgaXMgc3RpbGwgc3VwcG9ydGVkCisKKyB3aGlsZSAobXkgJHJvdyA9ICRjc3YtPmdldGxpbmUgKCpBUkdWKSkgeyAuLi4gfQorCis9aGVhZDIgVW5pY29kZQorCitVbmljb2RlIGlzIG9ubHkgdGVzdGVkIHRvIHdvcmsgd2l0aCBwZXJsLTUuOC4yIGFuZCB1cC4KKworVGhlIHNpbXBsZXN0IHdheSB0byBlbnN1cmUgdGhlIGNvcnJlY3QgZW5jb2RpbmcgaXMgdXNlZCBmb3IgIGluLSBhbmQgb3V0cHV0CitpcyBieSBlaXRoZXIgc2V0dGluZyBsYXllcnMgb24gdGhlIGZpbGVoYW5kbGVzLCBvciBzZXR0aW5nIHRoZSBMPC9lbmNvZGluZz4KK2FyZ3VtZW50IGZvciBMPC9jc3Y+LgorCisgb3BlbiBteSAkZmgsICI8OmVuY29kaW5nKFVURi04KSIsICJpbi5jc3YiICBvciBkaWUgImluLmNzdjogJCEiOworb3IKKyBteSAkYW9hID0gY3N2IChpbiA9PiAiaW4uY3N2IiwgICAgIGVuY29kaW5nID0+ICJVVEYtOCIpOworCisgb3BlbiBteSAkZmgsICI+OmVuY29kaW5nKFVURi04KSIsICJvdXQuY3N2IiBvciBkaWUgIm91dC5jc3Y6ICQhIjsKK29yCisgY3N2IChpbiA9PiAkYW9hLCBvdXQgPT4gIm91dC5jc3YiLCBlbmNvZGluZyA9PiAiVVRGLTgiKTsKKworT24gcGFyc2luZyAoYm90aCBmb3IgIEw8L2dldGxpbmU+IGFuZCAgTDwvcGFyc2U+KSwgIGlmIHRoZSBzb3VyY2UgaXMgbWFya2VkCitiZWluZyBVVEY4LCB0aGVuIGFsbCBmaWVsZHMgdGhhdCBhcmUgbWFya2VkIGJpbmFyeSB3aWxsIGFsc28gYmUgbWFya2VkIFVURjguCisKK09uIGNvbWJpbmluZyAoTDwvcHJpbnQ+ICBhbmQgIEw8L2NvbWJpbmU+KTogIGlmIGFueSBvZiB0aGUgY29tYmluaW5nIGZpZWxkcword2FzIG1hcmtlZCBVVEY4LCB0aGUgcmVzdWx0aW5nIHN0cmluZyB3aWxsIGJlIG1hcmtlZCBhcyBVVEY4LiAgTm90ZSBob3dldmVyCit0aGF0IGFsbCBmaWVsZHMgIEk8YmVmb3JlPiAgdGhlIGZpcnN0IGZpZWxkIG1hcmtlZCBVVEY4IGFuZCBjb250YWluZWQgOC1iaXQKK2NoYXJhY3RlcnMgdGhhdCB3ZXJlIG5vdCB1cGdyYWRlZCB0byBVVEY4LCAgdGhlc2Ugd2lsbCBiZSAgQzxieXRlcz4gIGluIHRoZQorcmVzdWx0aW5nIHN0cmluZyB0b28sIHBvc3NpYmx5IGNhdXNpbmcgdW5leHBlY3RlZCBlcnJvcnMuICBJZiB5b3UgcGFzcyBkYXRhCitvZiBkaWZmZXJlbnQgZW5jb2RpbmcsICBvciB5b3UgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyAgZGlmZmVyZW50ICBlbmNvZGluZywKK2ZvcmNlIGl0IHRvIGJlIHVwZ3JhZGVkIGJlZm9yZSB5b3UgcGFzcyB0aGVtIG9uOgorCisgJGNzdi0+cHJpbnQgKCRmaCwgWyBtYXAgeyB1dGY4Ojp1cGdyYWRlIChteSAkeCA9ICRfKTsgJHggfSBAZGF0YSBdKTsKKworRm9yIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciBlbmNvZGluZywgcGxlYXNlIHVzZSBMPFRleHQ6OkNTVjo6RW5jb2RlZD46CisKKyB1c2UgVGV4dDo6Q1NWOjpFbmNvZGVkOworIG15ICRjc3YgPSBUZXh0OjpDU1Y6OkVuY29kZWQtPm5ldyAoeworICAgICBlbmNvZGluZ19pbiAgPT4gImlzby04ODU5LTEiLCAjIHRoZSBlbmNvZGluZyBjb21lcyBpbnRvICAgUGVybAorICAgICBlbmNvZGluZ19vdXQgPT4gImNwMTI1MiIsICAgICAjIHRoZSBlbmNvZGluZyBjb21lcyBvdXQgb2YgUGVybAorICAgICB9KTsKKworICRjc3YgPSBUZXh0OjpDU1Y6OkVuY29kZWQtPm5ldyAoeyBlbmNvZGluZyAgPT4gInV0ZjgiIH0pOworICMgY29tYmluZSAoKSBhbmQgcHJpbnQgKCkgYWNjZXB0ICpsaXRlcmFsbHkqIHV0ZjggZW5jb2RlZCBkYXRhCisgIyBwYXJzZSAoKSBhbmQgZ2V0bGluZSAoKSByZXR1cm4gKmxpdGVyYWxseSogdXRmOCBlbmNvZGVkIGRhdGEKKworICRjc3YgPSBUZXh0OjpDU1Y6OkVuY29kZWQtPm5ldyAoeyBlbmNvZGluZyAgPT4gdW5kZWYgfSk7ICMgZGVmYXVsdAorICMgY29tYmluZSAoKSBhbmQgcHJpbnQgKCkgYWNjZXB0IFVURjggbWFya2VkIGRhdGEKKyAjIHBhcnNlICgpIGFuZCBnZXRsaW5lICgpIHJldHVybiBVVEY4IG1hcmtlZCBkYXRhCisKKz1oZWFkMSBNRVRIT0RTCisKK1RoaXMgd2hvbGUgc2VjdGlvbiBpcyBhbHNvIHRha2VuIGZyb20gVGV4dDo6Q1NWX1hTLgorCis9aGVhZDIgdmVyc2lvbiAoKQorCisoQ2xhc3MgbWV0aG9kKSBSZXR1cm5zIHRoZSBjdXJyZW50IGJhY2tlbmQgbW9kdWxlIHZlcnNpb24uCisKKz1oZWFkMiBuZXcgKFwlYXR0cikKKworKENsYXNzIG1ldGhvZCkgUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBUZXh0OjpDU1YgYmFja2VuZC4gVGhlIGF0dHJpYnV0ZXMKK2FyZSBkZXNjcmliZWQgYnkgdGhlIChvcHRpb25hbCkgaGFzaCByZWYgQzxcJWF0dHI+LgorCisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IGF0dHJpYnV0ZXMgLi4uIH0pOworCitUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZToKKworPWhlYWQzIGVvbAorCisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IGVvbCA9PiAkLyB9KTsKKyAgICAgICAgICAgJGNzdi0+ZW9sICh1bmRlZik7CisgbXkgJGVvbCA9ICRjc3YtPmVvbDsKKworVGhlIGVuZC1vZi1saW5lIHN0cmluZyB0byBhZGQgdG8gcm93cyBmb3IgTDwvcHJpbnQ+IG9yIHRoZSByZWNvcmQgc2VwYXJhdG9yCitmb3IgTDwvZ2V0bGluZT4uCisKK1doZW4gbm90IHBhc3NlZCBpbiBhIEI8cGFyc2VyPiBpbnN0YW5jZSwgIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGFjY2VwdAorQzxcbj4sIEM8XHI+LCBhbmQgQzxcclxuPiwgc28gaXQgaXMgcHJvYmFibHkgc2FmZXIgdG8gbm90IHNwZWNpZnkgQzxlb2w+IGF0CithbGwuIFBhc3NpbmcgQzx1bmRlZj4gb3IgdGhlIGVtcHR5IHN0cmluZyBiZWhhdmUgdGhlIHNhbWUuCisKK1doZW4gbm90IHBhc3NlZCBpbiBhIEI8Z2VuZXJhdGluZz4gaW5zdGFuY2UsICByZWNvcmRzIGFyZSBub3QgdGVybWluYXRlZCBhdAorYWxsLCBzbyBpdCBpcyBwcm9iYWJseSB3aXNlIHRvIHBhc3Mgc29tZXRoaW5nIHlvdSBleHBlY3QuIEEgc2FmZSBjaG9pY2UgZm9yCitDPGVvbD4gb24gb3V0cHV0IGlzIGVpdGhlciBDPCQvPiBvciBDPFxyXG4+LgorCitDb21tb24gdmFsdWVzIGZvciBDPGVvbD4gYXJlIEM8IlwwMTIiPiAoQzxcbj4gb3IgTGluZSBGZWVkKSwgIEM8IlwwMTVcMDEyIj4KKyhDPFxyXG4+IG9yIENhcnJpYWdlIFJldHVybiwgTGluZSBGZWVkKSwgIGFuZCBDPCJcMDE1Ij4gIChDPFxyPiBvciBDYXJyaWFnZQorUmV0dXJuKS4gVGhlIEw8Qzxlb2w+fC9lb2w+IGF0dHJpYnV0ZSBjYW5ub3QgZXhjZWVkIDcgKEFTQ0lJKSBjaGFyYWN0ZXJzLgorCitJZiBib3RoIEM8JC8+IGFuZCBMPEM8ZW9sPnwvZW9sPiBlcXVhbCBDPCJcMDE1Ij4sIHBhcnNpbmcgbGluZXMgdGhhdCBlbmQgb24KK29ubHkgYSBDYXJyaWFnZSBSZXR1cm4gd2l0aG91dCBMaW5lIEZlZWQsIHdpbGwgYmUgTDwvcGFyc2U+ZCBjb3JyZWN0LgorCis9aGVhZDMgc2VwX2NoYXIKKworIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBzZXBfY2hhciA9PiAiOyIgfSk7CisgICAgICAgICAkY3N2LT5zZXBfY2hhciAoIjsiKTsKKyBteSAkYyA9ICRjc3YtPnNlcF9jaGFyOworCitUaGUgY2hhciB1c2VkIHRvIHNlcGFyYXRlIGZpZWxkcywgYnkgZGVmYXVsdCBhIGNvbW1hLiAoQzwsPikuICBMaW1pdGVkIHRvIGEKK3NpbmdsZS1ieXRlIGNoYXJhY3RlciwgdXN1YWxseSBpbiB0aGUgcmFuZ2UgZnJvbSBDPDB4MjA+IChzcGFjZSkgdG8gQzwweDdFPgorKHRpbGRlKS4gV2hlbiBsb25nZXIgc2VxdWVuY2VzIGFyZSByZXF1aXJlZCwgdXNlIEw8QzxzZXA+fC9zZXA+LgorCitUaGUgc2VwYXJhdGlvbiBjaGFyYWN0ZXIgY2FuIG5vdCBiZSBlcXVhbCB0byB0aGUgcXVvdGUgY2hhcmFjdGVyICBvciB0byB0aGUKK2VzY2FwZSBjaGFyYWN0ZXIuCisKKz1oZWFkMyBzZXAKKworIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBzZXAgPT4gIlxOe0ZVTExXSURUSCBDT01NQX0iIH0pOworICAgICAgICAgICAkY3N2LT5zZXAgKCI7Iik7CisgbXkgJHNlcCA9ICRjc3YtPnNlcDsKKworVGhlIGNoYXJzIHVzZWQgdG8gc2VwYXJhdGUgZmllbGRzLCBieSBkZWZhdWx0IHVuZGVmaW5lZC4gTGltaXRlZCB0byA4IGJ5dGVzLgorCitXaGVuIHNldCwgb3ZlcnJ1bGVzIEw8QzxzZXBfY2hhcj58L3NlcF9jaGFyPi4gIElmIGl0cyBsZW5ndGggaXMgb25lIGJ5dGUgaXQKK2FjdHMgYXMgYW4gYWxpYXMgdG8gTDxDPHNlcF9jaGFyPnwvc2VwX2NoYXI+LgorCis9aGVhZDMgcXVvdGVfY2hhcgorCisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IHF1b3RlX2NoYXIgPT4gIiciIH0pOworICAgICAgICAgJGNzdi0+cXVvdGVfY2hhciAodW5kZWYpOworIG15ICRjID0gJGNzdi0+cXVvdGVfY2hhcjsKKworVGhlIGNoYXJhY3RlciB0byBxdW90ZSBmaWVsZHMgY29udGFpbmluZyBibGFua3Mgb3IgYmluYXJ5IGRhdGEsICBieSBkZWZhdWx0Cit0aGUgZG91YmxlIHF1b3RlIGNoYXJhY3RlciAoQzwiPikuICBBIHZhbHVlIG9mIHVuZGVmIHN1cHByZXNzZXMgcXVvdGUgY2hhcnMKKyhmb3Igc2ltcGxlIGNhc2VzIG9ubHkpLiBMaW1pdGVkIHRvIGEgc2luZ2xlLWJ5dGUgY2hhcmFjdGVyLCB1c3VhbGx5IGluIHRoZQorcmFuZ2UgZnJvbSAgQzwweDIwPiAoc3BhY2UpIHRvICBDPDB4N0U+ICh0aWxkZSkuICBXaGVuIGxvbmdlciBzZXF1ZW5jZXMgYXJlCityZXF1aXJlZCwgdXNlIEw8QzxxdW90ZT58L3F1b3RlPi4KKworQzxxdW90ZV9jaGFyPiBjYW4gbm90IGJlIGVxdWFsIHRvIEw8QzxzZXBfY2hhcj58L3NlcF9jaGFyPi4KKworPWhlYWQzIHF1b3RlCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsgcXVvdGUgPT4gIlxOe0ZVTExXSURUSCBRVU9UQVRJT04gTUFSS30iIH0pOworICAgICAgICAgICAgICRjc3YtPnF1b3RlICgiJyIpOworIG15ICRxdW90ZSA9ICRjc3YtPnF1b3RlOworCitUaGUgY2hhcnMgdXNlZCB0byBxdW90ZSBmaWVsZHMsIGJ5IGRlZmF1bHQgdW5kZWZpbmVkLiBMaW1pdGVkIHRvIDggYnl0ZXMuCisKK1doZW4gc2V0LCBvdmVycnVsZXMgTDxDPHF1b3RlX2NoYXI+fC9xdW90ZV9jaGFyPi4gSWYgaXRzIGxlbmd0aCBpcyBvbmUgYnl0ZQoraXQgYWN0cyBhcyBhbiBhbGlhcyB0byBMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+LgorCis9aGVhZDMgZXNjYXBlX2NoYXIKKworIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBlc2NhcGVfY2hhciA9PiAiXFwiIH0pOworICAgICAgICAgJGNzdi0+ZXNjYXBlX2NoYXIgKHVuZGVmKTsKKyBteSAkYyA9ICRjc3YtPmVzY2FwZV9jaGFyOworCitUaGUgY2hhcmFjdGVyIHRvICBlc2NhcGUgIGNlcnRhaW4gY2hhcmFjdGVycyBpbnNpZGUgcXVvdGVkIGZpZWxkcy4gIFRoaXMgaXMKK2xpbWl0ZWQgdG8gYSAgc2luZ2xlLWJ5dGUgIGNoYXJhY3RlciwgIHVzdWFsbHkgIGluIHRoZSAgcmFuZ2UgZnJvbSAgQzwweDIwPgorKHNwYWNlKSB0byBDPDB4N0U+ICh0aWxkZSkuCisKK1RoZSBDPGVzY2FwZV9jaGFyPiBkZWZhdWx0cyB0byBiZWluZyB0aGUgZG91YmxlLXF1b3RlIG1hcmsgKEM8Ij4pLiBJbiBvdGhlcgord29yZHMgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQgTDxDPHF1b3RlX2NoYXI+fC9xdW90ZV9jaGFyPi4gVGhpcyBtZWFucyB0aGF0Citkb3VibGluZyB0aGUgcXVvdGUgbWFyayBpbiBhIGZpZWxkIGVzY2FwZXMgaXQ6CisKKyAiZm9vIiwiYmFyIiwiRXNjYXBlICIicXVvdGUgbWFyayIiIHdpdGggdHdvICIicXVvdGUgbWFya3MiIiIsImJheiIKKworSWYgIHlvdSAgY2hhbmdlICB0aGUgICBMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+ICB3aXRob3V0ICBjaGFuZ2luZyAgdGhlCitDPGVzY2FwZV9jaGFyPiwgIHRoZSAgQzxlc2NhcGVfY2hhcj4gd2lsbCBzdGlsbCBiZSB0aGUgZG91YmxlLXF1b3RlIChDPCI+KS4KK0lmIGluc3RlYWQgeW91IHdhbnQgdG8gZXNjYXBlIHRoZSAgTDxDPHF1b3RlX2NoYXI+fC9xdW90ZV9jaGFyPiBieSBkb3VibGluZworaXQgeW91IHdpbGwgbmVlZCB0byBhbHNvIGNoYW5nZSB0aGUgIEM8ZXNjYXBlX2NoYXI+ICB0byBiZSB0aGUgc2FtZSBhcyB3aGF0Cit5b3UgaGF2ZSBjaGFuZ2VkIHRoZSBMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+IHRvLgorCitUaGUgZXNjYXBlIGNoYXJhY3RlciBjYW4gbm90IGJlIGVxdWFsIHRvIHRoZSBzZXBhcmF0aW9uIGNoYXJhY3Rlci4KKworPWhlYWQzIGJpbmFyeQorCisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IGJpbmFyeSA9PiAxIH0pOworICAgICAgICAgJGNzdi0+YmluYXJ5ICgwKTsKKyBteSAkZiA9ICRjc3YtPmJpbmFyeTsKKworSWYgdGhpcyBhdHRyaWJ1dGUgaXMgQzwxPiwgIHlvdSBtYXkgdXNlIGJpbmFyeSBjaGFyYWN0ZXJzIGluIHF1b3RlZCBmaWVsZHMsCitpbmNsdWRpbmcgbGluZSBmZWVkcywgY2FycmlhZ2UgcmV0dXJucyBhbmQgQzxOVUxMPiBieXRlcy4gKFRoZSBsYXR0ZXIgY291bGQKK2JlIGVzY2FwZWQgYXMgQzwiMD4uKSBCeSBkZWZhdWx0IHRoaXMgZmVhdHVyZSBpcyBvZmYuCisKK0lmIGEgc3RyaW5nIGlzIG1hcmtlZCBVVEY4LCAgQzxiaW5hcnk+IHdpbGwgYmUgdHVybmVkIG9uIGF1dG9tYXRpY2FsbHkgd2hlbgorYmluYXJ5IGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBDPENSPiBhbmQgQzxOTD4gYXJlIGVuY291bnRlcmVkLiAgIE5vdGUgdGhhdCBhCitzaW1wbGUgc3RyaW5nIGxpa2UgQzwiXHh7MDBhMH0iPiBtaWdodCBzdGlsbCBiZSBiaW5hcnksIGJ1dCBub3QgbWFya2VkIFVURjgsCitzbyBzZXR0aW5nIEM8PCB7IGJpbmFyeSA9PiAxIH0gPj4gaXMgc3RpbGwgYSB3aXNlIG9wdGlvbi4KKworPWhlYWQzIGRlY29kZV91dGY4CisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsgZGVjb2RlX3V0ZjggPT4gMSB9KTsKKyAgICAgICAgICRjc3YtPmRlY29kZV91dGY4ICgwKTsKKyBteSAkZiA9ICRjc3YtPmRlY29kZV91dGY4OworCitUaGlzIGF0dHJpYnV0ZXMgZGVmYXVsdHMgdG8gVFJVRS4KKworV2hpbGUgSTxwYXJzaW5nPiwgIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCBVVEYtOCwgYXJlIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGJlCitVVEYtOCwgc28gdGhhdAorCisgICRjc3YtPnBhcnNlICgiXHhDNFx4QThcbiIpOworCityZXN1bHRzIGluCisKKyAgUFYoIlwzMDRcMjUwIlwwKSBbVVRGOCAiXHh7MTI4fSJdCisKK1NvbWV0aW1lcyBpdCBtaWdodCBub3QgYmUgYSBkZXNpcmVkIGFjdGlvbi4gIFRvIHByZXZlbnQgdGhvc2UgdXBncmFkZXMsIHNldAordGhpcyBhdHRyaWJ1dGUgdG8gZmFsc2UsIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUKKworICBQVigiXDMwNFwyNTAiXDApCisKKz1oZWFkMyBhdXRvX2RpYWcKKworIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBhdXRvX2RpYWcgPT4gMSB9KTsKKyAgICAgICAgICRjc3YtPmF1dG9fZGlhZyAoMik7CisgbXkgJGwgPSAkY3N2LT5hdXRvX2RpYWc7CisKK1NldCB0aGlzIGF0dHJpYnV0ZSB0byBhIG51bWJlciBiZXR3ZWVuIEM8MT4gYW5kIEM8OT4gY2F1c2VzICBMPC9lcnJvcl9kaWFnPgordG8gYmUgYXV0b21hdGljYWxseSBjYWxsZWQgaW4gdm9pZCBjb250ZXh0IHVwb24gZXJyb3JzLgorCitJbiBjYXNlIG9mIGVycm9yIEM8MjAxMiAtIEVPRj4sIHRoaXMgY2FsbCB3aWxsIGJlIHZvaWQuCisKK0lmIEM8YXV0b19kaWFnPiBpcyBzZXQgdG8gYSBudW1lcmljIHZhbHVlIGdyZWF0ZXIgdGhhbiBDPDE+LCBpdCB3aWxsIEM8ZGllPgorb24gZXJyb3JzIGluc3RlYWQgb2YgQzx3YXJuPi4gIElmIHNldCB0byBhbnl0aGluZyB1bnJlY29nbml6ZWQsICBpdCB3aWxsIGJlCitzaWxlbnRseSBpZ25vcmVkLgorCitGdXR1cmUgZXh0ZW5zaW9ucyB0byB0aGlzIGZlYXR1cmUgd2lsbCBpbmNsdWRlIG1vcmUgcmVsaWFibGUgYXV0by1kZXRlY3Rpb24KK29mICBDPGF1dG9kaWU+ICBiZWluZyBhY3RpdmUgaW4gdGhlIHNjb3BlIG9mIHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZCB3aGljaAord2lsbCBpbmNyZW1lbnQgdGhlIHZhbHVlIG9mIEM8YXV0b19kaWFnPiB3aXRoICBDPDE+IHRoZSBtb21lbnQgdGhlIGVycm9yIGlzCitkZXRlY3RlZC4KKworPWhlYWQzIGRpYWdfdmVyYm9zZQorCisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IGRpYWdfdmVyYm9zZSA9PiAxIH0pOworICAgICAgICAgJGNzdi0+ZGlhZ192ZXJib3NlICgyKTsKKyBteSAkbCA9ICRjc3YtPmRpYWdfdmVyYm9zZTsKKworU2V0IHRoZSB2ZXJib3NpdHkgb2YgdGhlIG91dHB1dCB0cmlnZ2VyZWQgYnkgQzxhdXRvX2RpYWc+LiAgIEN1cnJlbnRseSBvbmx5CithZGRzIHRoZSBjdXJyZW50ICBpbnB1dC1yZWNvcmQtbnVtYmVyICAoaWYga25vd24pICB0byB0aGUgZGlhZ25vc3RpYyBvdXRwdXQKK3dpdGggYW4gaW5kaWNhdGlvbiBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGVycm9yLgorCis9aGVhZDMgYmxhbmtfaXNfdW5kZWYKKworIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBibGFua19pc191bmRlZiA9PiAxIH0pOworICAgICAgICAgJGNzdi0+YmxhbmtfaXNfdW5kZWYgKDApOworIG15ICRmID0gJGNzdi0+YmxhbmtfaXNfdW5kZWY7CisKK1VuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCBDPENTVj4gZGF0YSBtYWtlcyBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHF1b3RlZC0KK2FuZCB1bnF1b3RlZCBlbXB0eSBmaWVsZHMuICBUaGVzZSBib3RoIGVuZCB1cCBpbiBhbiBlbXB0eSBzdHJpbmcgZmllbGQgb25jZQorcmVhZCwgdGh1cworCisgMSwiIiwsIiAiLDIKKworaXMgcmVhZCBhcworCisgKCIxIiwgIiIsICIiLCAiICIsICIyIikKKworV2hlbiBJPHdyaXRpbmc+ICBDPENTVj4gZmlsZXMgd2l0aCBlaXRoZXIgIEw8QzxhbHdheXNfcXVvdGU+fC9hbHdheXNfcXVvdGU+CitvciAgTDxDPHF1b3RlX2VtcHR5PnwvcXVvdGVfZW1wdHk+IHNldCwgdGhlIHVucXVvdGVkICBJPGVtcHR5PiBmaWVsZCBpcyB0aGUKK3Jlc3VsdCBvZiBhbiB1bmRlZmluZWQgdmFsdWUuICAgVG8gZW5hYmxlIHRoaXMgZGlzdGluY3Rpb24gd2hlbiAgSTxyZWFkaW5nPgorQzxDU1Y+ICBkYXRhLCAgdGhlICBDPGJsYW5rX2lzX3VuZGVmPiAgYXR0cmlidXRlIHdpbGwgY2F1c2UgIHVucXVvdGVkIGVtcHR5CitmaWVsZHMgdG8gYmUgc2V0IHRvIEM8dW5kZWY+LCBjYXVzaW5nIHRoZSBhYm92ZSB0byBiZSBwYXJzZWQgYXMKKworICgiMSIsICIiLCB1bmRlZiwgIiAiLCAiMiIpCisKK25vdGUgdGhhdCB0aGlzIGlzIHNwZWNpZmljYWxseSBpbXBvcnRhbnQgd2hlbiBsb2FkaW5nICBDPENTVj4gZmllbGRzIGludG8gYQorZGF0YWJhc2UgdGhhdCBhbGxvd3MgQzxOVUxMPiB2YWx1ZXMsICBhcyB0aGUgcGVybCBlcXVpdmFsZW50IGZvciBDPE5VTEw+IGlzCitDPHVuZGVmPiBpbiBMPERCST4gbGFuZC4KKworPWhlYWQzIGVtcHR5X2lzX3VuZGVmCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsgZW1wdHlfaXNfdW5kZWYgPT4gMSB9KTsKKyAgICAgICAgICRjc3YtPmVtcHR5X2lzX3VuZGVmICgwKTsKKyBteSAkZiA9ICRjc3YtPmVtcHR5X2lzX3VuZGVmOworCitHb2luZyBvbmUgIHN0ZXAgIGZ1cnRoZXIgIHRoYW4gIEw8QzxibGFua19pc191bmRlZj58L2JsYW5rX2lzX3VuZGVmPiwgIHRoaXMKK2F0dHJpYnV0ZSBjb252ZXJ0cyBhbGwgZW1wdHkgZmllbGRzIHRvIEM8dW5kZWY+LCBzbworCisgMSwiIiwsIiAiLDIKKworaXMgcmVhZCBhcworCisgKDEsIHVuZGVmLCB1bmRlZiwgIiAiLCAyKQorCitOb3RlIHRoYXQgdGhpcyBlZmZlY3RzIG9ubHkgZmllbGRzIHRoYXQgYXJlICBvcmlnaW5hbGx5ICBlbXB0eSwgIG5vdCBmaWVsZHMKK3RoYXQgYXJlIGVtcHR5IGFmdGVyIHN0cmlwcGluZyBhbGxvd2VkIHdoaXRlc3BhY2UuIFlNTVYuCisKKz1oZWFkMyBhbGxvd193aGl0ZXNwYWNlCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsgYWxsb3dfd2hpdGVzcGFjZSA9PiAxIH0pOworICAgICAgICAgJGNzdi0+YWxsb3dfd2hpdGVzcGFjZSAoMCk7CisgbXkgJGYgPSAkY3N2LT5hbGxvd193aGl0ZXNwYWNlOworCitXaGVuIHRoaXMgb3B0aW9uIGlzIHNldCB0byB0cnVlLCAgdGhlIHdoaXRlc3BhY2UgIChDPFRBQj4ncyBhbmQgQzxTUEFDRT4ncykKK3N1cnJvdW5kaW5nICB0aGUgIHNlcGFyYXRpb24gY2hhcmFjdGVyICBpcyByZW1vdmVkIHdoZW4gcGFyc2luZy4gIElmIGVpdGhlcgorQzxUQUI+IG9yIEM8U1BBQ0U+IGlzIG9uZSBvZiB0aGUgdGhyZWUgY2hhcmFjdGVycyBMPEM8c2VwX2NoYXI+fC9zZXBfY2hhcj4sCitMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+LCBvciBMPEM8ZXNjYXBlX2NoYXI+fC9lc2NhcGVfY2hhcj4gaXQgd2lsbCBub3QKK2JlIGNvbnNpZGVyZWQgd2hpdGVzcGFjZS4KKworTm93IGxpbmVzIGxpa2U6CisKKyAxICwgImZvbyIgLCBiYXIgLCAzICwgemFwcAorCithcmUgcGFyc2VkIGFzIHZhbGlkIEM8Q1NWPiwgZXZlbiB0aG91Z2ggaXQgdmlvbGF0ZXMgdGhlIEM8Q1NWPiBzcGVjcy4KKworTm90ZSB0aGF0ICBCPGFsbD4gIHdoaXRlc3BhY2UgaXMgc3RyaXBwZWQgZnJvbSBib3RoICBzdGFydCBhbmQgIGVuZCBvZiBlYWNoCitmaWVsZC4gIFRoYXQgd291bGQgbWFrZSBpdCAgSTxtb3JlPiB0aGFuIGEgSTxmZWF0dXJlPiB0byBlbmFibGUgcGFyc2luZyBiYWQKK0M8Q1NWPiBsaW5lcywgYXMKKworIDEsICAgMi4wLCAgMywgICBhcGUgICwgbW9ua2V5CisKK3dpbGwgbm93IGJlIHBhcnNlZCBhcworCisgKCIxIiwgIjIuMCIsICIzIiwgImFwZSIsICJtb25rZXkiKQorCitldmVuIGlmIHRoZSBvcmlnaW5hbCBsaW5lIHdhcyBwZXJmZWN0bHkgYWNjZXB0YWJsZSBDPENTVj4uCisKKz1oZWFkMyBhbGxvd19sb29zZV9xdW90ZXMKKworIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBhbGxvd19sb29zZV9xdW90ZXMgPT4gMSB9KTsKKyAgICAgICAgICRjc3YtPmFsbG93X2xvb3NlX3F1b3RlcyAoMCk7CisgbXkgJGYgPSAkY3N2LT5hbGxvd19sb29zZV9xdW90ZXM7CisKK0J5IGRlZmF1bHQsIHBhcnNpbmcgdW5xdW90ZWQgZmllbGRzIGNvbnRhaW5pbmcgTDxDPHF1b3RlX2NoYXI+fC9xdW90ZV9jaGFyPgorY2hhcmFjdGVycyBsaWtlCisKKyAxLGZvbyAiYmFyIiBiYXosNDIKKword291bGQgcmVzdWx0IGluIHBhcnNlIGVycm9yIDIwMzQuICBUaG91Z2ggaXQgaXMgc3RpbGwgYmFkIHByYWN0aWNlIHRvIGFsbG93Cit0aGlzIGZvcm1hdCwgIHdlICBjYW5ub3QgIGhlbHAgIHRoZSAgZmFjdCAgdGhhdCAgc29tZSAgdmVuZG9ycyAgbWFrZSAgdGhlaXIKK2FwcGxpY2F0aW9ucyBzcGl0IG91dCBsaW5lcyBzdHlsZWQgdGhpcyB3YXkuCisKK0lmIHRoZXJlIGlzIEI8cmVhbGx5PiBiYWQgQzxDU1Y+IGRhdGEsIGxpa2UKKworIDEsImZvbyAiYmFyIiBiYXoiLDQyCisKK29yCisKKyAxLCIiZm9vIGJhciBiYXoiIiw0MgorCit0aGVyZSBpcyBhIHdheSB0byBnZXQgdGhpcyBkYXRhLWxpbmUgcGFyc2VkIGFuZCBsZWF2ZSB0aGUgcXVvdGVzIGluc2lkZSB0aGUKK3F1b3RlZCBmaWVsZCBhcy1pcy4gIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHNldHRpbmcgIEM8YWxsb3dfbG9vc2VfcXVvdGVzPgorQjxBTkQ+IG1ha2luZyBzdXJlIHRoYXQgdGhlIEw8Qzxlc2NhcGVfY2hhcj58L2VzY2FwZV9jaGFyPiBpcyAgSTxub3Q+IGVxdWFsCit0byBMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+LgorCis9aGVhZDMgYWxsb3dfbG9vc2VfZXNjYXBlcworCisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IGFsbG93X2xvb3NlX2VzY2FwZXMgPT4gMSB9KTsKKyAgICAgICAgICRjc3YtPmFsbG93X2xvb3NlX2VzY2FwZXMgKDApOworIG15ICRmID0gJGNzdi0+YWxsb3dfbG9vc2VfZXNjYXBlczsKKworUGFyc2luZyBmaWVsZHMgIHRoYXQgIGhhdmUgIEw8Qzxlc2NhcGVfY2hhcj58L2VzY2FwZV9jaGFyPiAgY2hhcmFjdGVycyB0aGF0Citlc2NhcGUgY2hhcmFjdGVycyB0aGF0IGRvIG5vdCBuZWVkIHRvIGJlIGVzY2FwZWQsIGxpa2U6CisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsgZXNjYXBlX2NoYXIgPT4gIlxcIiB9KTsKKyAkY3N2LT5wYXJzZSAocXF7MSwibXkgYmFyXCdzIixiYXosNDJ9KTsKKword291bGQgcmVzdWx0IGluIHBhcnNlIGVycm9yIDIwMjUuICAgVGhvdWdoIGl0IGlzIGJhZCBwcmFjdGljZSB0byBhbGxvdyB0aGlzCitmb3JtYXQsICB0aGlzIGF0dHJpYnV0ZSBlbmFibGVzIHlvdSB0byB0cmVhdCBhbGwgZXNjYXBlIGNoYXJhY3RlciBzZXF1ZW5jZXMKK2VxdWFsLgorCis9aGVhZDMgYWxsb3dfdW5xdW90ZWRfZXNjYXBlCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsgYWxsb3dfdW5xdW90ZWRfZXNjYXBlID0+IDEgfSk7CisgICAgICAgICAkY3N2LT5hbGxvd191bnF1b3RlZF9lc2NhcGUgKDApOworIG15ICRmID0gJGNzdi0+YWxsb3dfdW5xdW90ZWRfZXNjYXBlOworCitBIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWUgd2hlcmUgTDxDPGVzY2FwZV9jaGFyPnwvZXNjYXBlX2NoYXI+IGRpZmZlcnMKK2Zyb20gTDxDPHF1b3RlX2NoYXI+fC9xdW90ZV9jaGFyPiAgcHJldmVudHMgIEw8Qzxlc2NhcGVfY2hhcj58L2VzY2FwZV9jaGFyPgordG8gYmUgaW4gdGhlIGZpcnN0IHBvc2l0aW9uIG9mIGEgZmllbGQuICBJZiBMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+IGlzCitlcXVhbCB0byB0aGUgZGVmYXVsdCBDPCI+IGFuZCBMPEM8ZXNjYXBlX2NoYXI+fC9lc2NhcGVfY2hhcj4gaXMgc2V0IHRvIEM8XD4sCit0aGlzIHdvdWxkIGJlIGlsbGVnYWw6CisKKyAxLFwwLDIKKworU2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB0byBDPDE+ICBtaWdodCBoZWxwIHRvIG92ZXJjb21lIGlzc3VlcyB3aXRoIGJhY2t3YXJkCitjb21wYXRpYmlsaXR5IGFuZCBhbGxvdyB0aGlzIHN0eWxlLgorCis9aGVhZDMgYWx3YXlzX3F1b3RlCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsgYWx3YXlzX3F1b3RlID0+IDEgfSk7CisgICAgICAgICAkY3N2LT5hbHdheXNfcXVvdGUgKDApOworIG15ICRmID0gJGNzdi0+YWx3YXlzX3F1b3RlOworCitCeSBkZWZhdWx0IHRoZSBnZW5lcmF0ZWQgZmllbGRzIGFyZSBxdW90ZWQgb25seSBpZiB0aGV5IEk8bmVlZD4gdG8gYmUuICBGb3IKK2V4YW1wbGUsIGlmIHRoZXkgY29udGFpbiB0aGUgc2VwYXJhdG9yIGNoYXJhY3Rlci4gSWYgeW91IHNldCB0aGlzIGF0dHJpYnV0ZQordG8gQzwxPiB0aGVuIEk8YWxsPiBkZWZpbmVkIGZpZWxkcyB3aWxsIGJlIHF1b3RlZC4gKEM8dW5kZWY+IGZpZWxkcyBhcmUgbm90CitxdW90ZWQsIHNlZSBMPC9ibGFua19pc191bmRlZj4pLiBUaGlzIG1ha2VzIGl0IHF1aXRlIG9mdGVuIGVhc2llciB0byBoYW5kbGUKK2V4cG9ydGVkIGRhdGEgaW4gZXh0ZXJuYWwgYXBwbGljYXRpb25zLgorCis9aGVhZDMgcXVvdGVfc3BhY2UKKworIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBxdW90ZV9zcGFjZSA9PiAxIH0pOworICAgICAgICAgJGNzdi0+cXVvdGVfc3BhY2UgKDApOworIG15ICRmID0gJGNzdi0+cXVvdGVfc3BhY2U7CisKK0J5IGRlZmF1bHQsICBhIHNwYWNlIGluIGEgZmllbGQgd291bGQgdHJpZ2dlciBxdW90YXRpb24uICBBcyBubyBydWxlIGV4aXN0cwordGhpcyB0byBiZSBmb3JjZWQgaW4gQzxDU1Y+LCAgbm9yIGFueSBmb3IgdGhlIG9wcG9zaXRlLCB0aGUgZGVmYXVsdCBpcyB0cnVlCitmb3Igc2FmZXR5LiAgIFlvdSBjYW4gZXhjbHVkZSB0aGUgc3BhY2UgIGZyb20gdGhpcyB0cmlnZ2VyICBieSBzZXR0aW5nIHRoaXMKK2F0dHJpYnV0ZSB0byAwLgorCis9aGVhZDMgcXVvdGVfZW1wdHkKKworIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBxdW90ZV9lbXB0eSA9PiAxIH0pOworICAgICAgICAgJGNzdi0+cXVvdGVfZW1wdHkgKDApOworIG15ICRmID0gJGNzdi0+cXVvdGVfZW1wdHk7CisKK0J5IGRlZmF1bHQgdGhlIGdlbmVyYXRlZCBmaWVsZHMgYXJlIHF1b3RlZCBvbmx5IGlmIHRoZXkgSTxuZWVkPiB0byBiZS4gICBBbgorZW1wdHkgKGRlZmluZWQpIGZpZWxkIGRvZXMgbm90IG5lZWQgcXVvdGF0aW9uLiBJZiB5b3Ugc2V0IHRoaXMgYXR0cmlidXRlIHRvCitDPDE+IHRoZW4gSTxlbXB0eT4gZGVmaW5lZCBmaWVsZHMgd2lsbCBiZSBxdW90ZWQuICAoQzx1bmRlZj4gZmllbGRzIGFyZSBub3QKK3F1b3RlZCwgc2VlIEw8L2JsYW5rX2lzX3VuZGVmPikuIFNlZSBhbHNvIEw8QzxhbHdheXNfcXVvdGU+fC9hbHdheXNfcXVvdGU+LgorCis9aGVhZDMgcXVvdGVfYmluYXJ5CisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsgcXVvdGVfYmluYXJ5ID0+IDEgfSk7CisgICAgICAgICAkY3N2LT5xdW90ZV9iaW5hcnkgKDApOworIG15ICRmID0gJGNzdi0+cXVvdGVfYmluYXJ5OworCitCeSBkZWZhdWx0LCAgYWxsICJ1bnNhZmUiIGJ5dGVzIGluc2lkZSBhIHN0cmluZyBjYXVzZSB0aGUgY29tYmluZWQgZmllbGQgdG8KK2JlIHF1b3RlZC4gIEJ5IHNldHRpbmcgdGhpcyBhdHRyaWJ1dGUgdG8gQzwwPiwgeW91IGNhbiBkaXNhYmxlIHRoYXQgdHJpZ2dlcgorZm9yIGJ5dGVzID49IEM8MHg3Rj4uCisKKz1oZWFkMyBlc2NhcGVfbnVsbCBvciBxdW90ZV9udWxsIChkZXByZWNhdGVkKQorCisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IGVzY2FwZV9udWxsID0+IDEgfSk7CisgICAgICAgICAkY3N2LT5lc2NhcGVfbnVsbCAoMCk7CisgbXkgJGYgPSAkY3N2LT5lc2NhcGVfbnVsbDsKKworQnkgZGVmYXVsdCwgYSBDPE5VTEw+IGJ5dGUgaW4gYSBmaWVsZCB3b3VsZCBiZSBlc2NhcGVkLiBUaGlzIG9wdGlvbiBlbmFibGVzCit5b3UgdG8gdHJlYXQgdGhlICBDPE5VTEw+ICBieXRlIGFzIGEgc2ltcGxlIGJpbmFyeSBjaGFyYWN0ZXIgaW4gYmluYXJ5IG1vZGUKKyh0aGUgQzw8IHsgYmluYXJ5ID0+IDEgfSA+PiBpcyBzZXQpLiAgVGhlIGRlZmF1bHQgaXMgdHJ1ZS4gIFlvdSBjYW4gcHJldmVudAorQzxOVUxMPiBlc2NhcGVzIGJ5IHNldHRpbmcgdGhpcyBhdHRyaWJ1dGUgdG8gQzwwPi4KKworVGhlIGRlZmF1bHQgd2hlbiB1c2luZyB0aGUgQzxjc3Y+IGZ1bmN0aW9uIGlzIEM8ZmFsc2U+LgorCis9aGVhZDMga2VlcF9tZXRhX2luZm8KKworIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBrZWVwX21ldGFfaW5mbyA9PiAxIH0pOworICAgICAgICAgJGNzdi0+a2VlcF9tZXRhX2luZm8gKDApOworIG15ICRmID0gJGNzdi0+a2VlcF9tZXRhX2luZm87CisKK0J5IGRlZmF1bHQsIHRoZSBwYXJzaW5nIG9mIGlucHV0IHJlY29yZHMgaXMgYXMgc2ltcGxlIGFuZCBmYXN0IGFzIHBvc3NpYmxlLgorSG93ZXZlciwgIHNvbWUgcGFyc2luZyBpbmZvcm1hdGlvbiAtIGxpa2UgcXVvdGF0aW9uIG9mIHRoZSBvcmlnaW5hbCBmaWVsZCAtCitpcyBsb3N0IGluIHRoYXQgcHJvY2Vzcy4gIFNldHRpbmcgdGhpcyBmbGFnIHRvIHRydWUgZW5hYmxlcyByZXRyaWV2aW5nIHRoYXQKK2luZm9ybWF0aW9uIGFmdGVyIHBhcnNpbmcgd2l0aCAgdGhlIG1ldGhvZHMgIEw8L21ldGFfaW5mbz4sICBMPC9pc19xdW90ZWQ+LAorYW5kIEw8L2lzX2JpbmFyeT4gZGVzY3JpYmVkIGJlbG93LiAgRGVmYXVsdCBpcyBmYWxzZSBmb3IgcGVyZm9ybWFuY2UuCisKK0lmIHlvdSBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gOSwgICB0aGFuIHlvdSBjYW4gY29udHJvbAorb3V0cHV0IHF1b3RhdGlvbiBzdHlsZSBsaWtlIGl0IHdhcyB1c2VkIGluIHRoZSBpbnB1dCBvZiB0aGUgdGhlIGxhc3QgcGFyc2VkCityZWNvcmQgKHVubGVzcyBxdW90YXRpb24gd2FzIGFkZGVkIGJlY2F1c2Ugb2Ygb3RoZXIgcmVhc29ucykuCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKHsKKyAgICBiaW5hcnkgICAgICAgICA9PiAxLAorICAgIGtlZXBfbWV0YV9pbmZvID0+IDEsCisgICAgcXVvdGVfc3BhY2UgICAgPT4gMCwKKyAgICB9KTsKKworIG15ICRyb3cgPSAkY3N2LT5wYXJzZSAocXsxLCwiIiwgLCIgIixmLCJnIiwiaCIiaCIsaGVscCwiaGVscCJ9KTsKKworICRjc3YtPnByaW50ICgqU1RET1VULCBcQHJvdyk7CisgIyAxLCwsICwgLGYsZywiaCIiaCIsaGVscCxoZWxwCisgJGNzdi0+a2VlcF9tZXRhX2luZm8gKDExKTsKKyAkY3N2LT5wcmludCAoKlNURE9VVCwgXEByb3cpOworICMgMSwsIiIsICwiICIsZiwiZyIsImgiImgiLGhlbHAsImhlbHAiCisKKz1oZWFkMyB2ZXJiYXRpbQorCisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IHZlcmJhdGltID0+IDEgfSk7CisgICAgICAgICAkY3N2LT52ZXJiYXRpbSAoMCk7CisgbXkgJGYgPSAkY3N2LT52ZXJiYXRpbTsKKworVGhpcyBpcyBhIHF1aXRlIGNvbnRyb3ZlcnNpYWwgYXR0cmlidXRlIHRvIHNldCwgIGJ1dCBtYWtlcyBzb21lIGhhcmQgdGhpbmdzCitwb3NzaWJsZS4KKworVGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcyBhdHRyaWJ1dGUgaXMgdG8gdGVsbCB0aGUgcGFyc2VyIHRoYXQgdGhlIG5vcm1hbGx5CitzcGVjaWFsIGNoYXJhY3RlcnMgbmV3bGluZSAoQzxOTD4pIGFuZCBDYXJyaWFnZSBSZXR1cm4gKEM8Q1I+KSAgd2lsbCBub3QgYmUKK3NwZWNpYWwgd2hlbiB0aGlzIGZsYWcgaXMgc2V0LCAgYW5kIGJlIGRlYWx0IHdpdGggIGFzIGJlaW5nIG9yZGluYXJ5IGJpbmFyeQorY2hhcmFjdGVycy4gVGhpcyB3aWxsIGVhc2Ugd29ya2luZyB3aXRoIGRhdGEgd2l0aCBlbWJlZGRlZCBuZXdsaW5lcy4KKworV2hlbiAgQzx2ZXJiYXRpbT4gIGlzIHVzZWQgd2l0aCAgTDwvZ2V0bGluZT4sICBMPC9nZXRsaW5lPiAgYXV0by1DPGNob21wPidzCitldmVyeSBsaW5lLgorCitJbWFnaW5lIGEgZmlsZSBmb3JtYXQgbGlrZQorCisgTV5eSGFuc15KYW5zc2VuXktsYXMgMlxuMkFeSmFeMTEtMDYtMjAwNyNcclxuCisKK3doZXJlLCB0aGUgbGluZSBlbmRpbmcgaXMgYSB2ZXJ5IHNwZWNpZmljIEM8IiNcclxuIj4sIGFuZCB0aGUgc2VwX2NoYXIgaXMgYQorQzxePiAoY2FyZXQpLiAgIE5vbmUgb2YgdGhlIGZpZWxkcyBpcyBxdW90ZWQsICAgYnV0IGVtYmVkZGVkIGJpbmFyeSBkYXRhIGlzCitsaWtlbHkgdG8gYmUgcHJlc2VudC4gV2l0aCB0aGUgc3BlY2lmaWMgbGluZSBlbmRpbmcsIHRoaXMgc2hvdWxkIG5vdCBiZSB0b28KK2hhcmQgdG8gZGV0ZWN0LgorCitCeSBkZWZhdWx0LCAgVGV4dDo6Q1NWJyAgcGFyc2UgZnVuY3Rpb24gaXMgaW5zdHJ1Y3RlZCB0byBvbmx5IGtub3cgYWJvdXQKK0M8IlxuIj4gYW5kIEM8IlxyIj4gIHRvIGJlIGxlZ2FsIGxpbmUgZW5kaW5ncywgIGFuZCBzbyBoYXMgdG8gZGVhbCB3aXRoIHRoZQorZW1iZWRkZWQgbmV3bGluZSBhcyBhIHJlYWwgQzxlbmQtb2YtbGluZT4sICBzbyBpdCBjYW4gc2NhbiB0aGUgbmV4dCBsaW5lIGlmCitiaW5hcnkgaXMgdHJ1ZSwgYW5kIHRoZSBuZXdsaW5lIGlzIGluc2lkZSBhIHF1b3RlZCBmaWVsZC4gV2l0aCB0aGlzIG9wdGlvbiwKK3dlIHRlbGwgTDwvcGFyc2U+IHRvIHBhcnNlIHRoZSBsaW5lIGFzIGlmIEM8IlxuIj4gaXMganVzdCBub3RoaW5nIG1vcmUgdGhhbgorYSBiaW5hcnkgY2hhcmFjdGVyLgorCitGb3IgTDwvcGFyc2U+IHRoaXMgbWVhbnMgdGhhdCB0aGUgcGFyc2VyIGhhcyBubyBtb3JlIGlkZWEgYWJvdXQgbGluZSBlbmRpbmcKK2FuZCBMPC9nZXRsaW5lPiBDPGNob21wPnMgbGluZSBlbmRpbmdzIG9uIHJlYWRpbmcuCisKKz1oZWFkMyB0eXBlcworCitBIHNldCBvZiBjb2x1bW4gdHlwZXM7IHRoZSBhdHRyaWJ1dGUgaXMgaW1tZWRpYXRlbHkgcGFzc2VkIHRvIHRoZSBMPC90eXBlcz4KK21ldGhvZC4KKworPWhlYWQzIGNhbGxiYWNrcworCitTZWUgdGhlIEw8L0NhbGxiYWNrcz4gc2VjdGlvbiBiZWxvdy4KKworPWhlYWQzIGFjY2Vzc29ycworCitUbyBzdW0gaXQgdXAsCisKKyAkY3N2ID0gVGV4dDo6Q1NWLT5uZXcgKCk7CisKK2lzIGVxdWl2YWxlbnQgdG8KKworICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeworICAgICBlb2wgICAgICAgICAgICAgICAgICAgPT4gdW5kZWYsICMgXHIsIFxuLCBvciBcclxuCisgICAgIHNlcF9jaGFyICAgICAgICAgICAgICA9PiAnLCcsCisgICAgIHNlcCAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKKyAgICAgcXVvdGVfY2hhciAgICAgICAgICAgID0+ICciJywKKyAgICAgcXVvdGUgICAgICAgICAgICAgICAgID0+IHVuZGVmLAorICAgICBlc2NhcGVfY2hhciAgICAgICAgICAgPT4gJyInLAorICAgICBiaW5hcnkgICAgICAgICAgICAgICAgPT4gMCwKKyAgICAgZGVjb2RlX3V0ZjggICAgICAgICAgID0+IDEsCisgICAgIGF1dG9fZGlhZyAgICAgICAgICAgICA9PiAwLAorICAgICBkaWFnX3ZlcmJvc2UgICAgICAgICAgPT4gMCwKKyAgICAgYmxhbmtfaXNfdW5kZWYgICAgICAgID0+IDAsCisgICAgIGVtcHR5X2lzX3VuZGVmICAgICAgICA9PiAwLAorICAgICBhbGxvd193aGl0ZXNwYWNlICAgICAgPT4gMCwKKyAgICAgYWxsb3dfbG9vc2VfcXVvdGVzICAgID0+IDAsCisgICAgIGFsbG93X2xvb3NlX2VzY2FwZXMgICA9PiAwLAorICAgICBhbGxvd191bnF1b3RlZF9lc2NhcGUgPT4gMCwKKyAgICAgYWx3YXlzX3F1b3RlICAgICAgICAgID0+IDAsCisgICAgIHF1b3RlX2VtcHR5ICAgICAgICAgICA9PiAwLAorICAgICBxdW90ZV9zcGFjZSAgICAgICAgICAgPT4gMSwKKyAgICAgZXNjYXBlX251bGwgICAgICAgICAgID0+IDEsCisgICAgIHF1b3RlX2JpbmFyeSAgICAgICAgICA9PiAxLAorICAgICBrZWVwX21ldGFfaW5mbyAgICAgICAgPT4gMCwKKyAgICAgdmVyYmF0aW0gICAgICAgICAgICAgID0+IDAsCisgICAgIHR5cGVzICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKKyAgICAgY2FsbGJhY2tzICAgICAgICAgICAgID0+IHVuZGVmLAorICAgICB9KTsKKworRm9yIGFsbCBvZiB0aGUgYWJvdmUgbWVudGlvbmVkIGZsYWdzLCBhbiBhY2Nlc3NvciBtZXRob2QgaXMgYXZhaWxhYmxlIHdoZXJlCit5b3UgY2FuIGlucXVpcmUgdGhlIGN1cnJlbnQgdmFsdWUsIG9yIGNoYW5nZSB0aGUgdmFsdWUKKworIG15ICRxdW90ZSA9ICRjc3YtPnF1b3RlX2NoYXI7CisgJGNzdi0+YmluYXJ5ICgxKTsKKworSXQgaXMgbm90IHdpc2UgdG8gY2hhbmdlIHRoZXNlIHNldHRpbmdzIGhhbGZ3YXkgdGhyb3VnaCB3cml0aW5nIEM8Q1NWPiBkYXRhCit0byBhIHN0cmVhbS4gSWYgaG93ZXZlciB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgc3RyZWFtIHVzaW5nIHRoZSBhdmFpbGFibGUKK0M8Q1NWPiBvYmplY3QsIHRoZXJlIGlzIG5vIGhhcm0gaW4gY2hhbmdpbmcgdGhlbS4KKworSWYgdGhlIEw8L25ldz4gY29uc3RydWN0b3IgY2FsbCBmYWlscywgIGl0IHJldHVybnMgQzx1bmRlZj4sICBhbmQgbWFrZXMgdGhlCitmYWlsIHJlYXNvbiBhdmFpbGFibGUgdGhyb3VnaCB0aGUgTDwvZXJyb3JfZGlhZz4gbWV0aG9kLgorCisgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IGVjc19jaGFyID0+IDEgfSkgb3IKKyAgICAgZGllICIiLlRleHQ6OkNTVi0+ZXJyb3JfZGlhZyAoKTsKKworTDwvZXJyb3JfZGlhZz4gd2lsbCByZXR1cm4gYSBzdHJpbmcgbGlrZQorCisgIklOSSAtIFVua25vd24gYXR0cmlidXRlICdlY3NfY2hhciciCisKKz1oZWFkMiBrbm93bl9hdHRyaWJ1dGVzCisKKyBAYXR0ciA9IFRleHQ6OkNTVi0+a25vd25fYXR0cmlidXRlczsKKyBAYXR0ciA9IFRleHQ6OkNTVjo6a25vd25fYXR0cmlidXRlczsKKyBAYXR0ciA9ICRjc3YtPmtub3duX2F0dHJpYnV0ZXM7CisKK1RoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIG9yZGVyZWQgbGlzdCBvZiBhbGwgdGhlIHN1cHBvcnRlZCAgYXR0cmlidXRlcyBhcworZGVzY3JpYmVkIGFib3ZlLiAgIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3Iga25vd2luZyB3aGF0IGF0dHJpYnV0ZXMgYXJlIHZhbGlkCitpbiBjbGFzc2VzIHRoYXQgdXNlIG9yIGV4dGVuZCBUZXh0OjpDU1YuCisKKz1oZWFkMiBwcmludAorCisgJHN0YXR1cyA9ICRjc3YtPnByaW50ICgkaW8sICRjb2xyZWYpOworCitTaW1pbGFyIHRvICBMPC9jb21iaW5lPiArIEw8L3N0cmluZz4gKyBMPC9wcmludD4sICBidXQgbXVjaCBtb3JlIGVmZmljaWVudC4KK0l0IGV4cGVjdHMgYW4gYXJyYXkgcmVmIGFzIGlucHV0ICAobm90IGFuIGFycmF5ISkgIGFuZCB0aGUgcmVzdWx0aW5nIHN0cmluZworaXMgbm90IHJlYWxseSAgY3JlYXRlZCwgIGJ1dCAgaW1tZWRpYXRlbHkgIHdyaXR0ZW4gIHRvIHRoZSAgQzwkaW8+ICBvYmplY3QsCit0eXBpY2FsbHkgYW4gSU8gaGFuZGxlIG9yIGFueSBvdGhlciBvYmplY3QgdGhhdCBvZmZlcnMgYSBMPC9wcmludD4gbWV0aG9kLgorCitGb3IgcGVyZm9ybWFuY2UgcmVhc29ucyAgQzxwcmludD4gIGRvZXMgbm90IGNyZWF0ZSBhIHJlc3VsdCBzdHJpbmcsICBzbyBhbGwKK0w8L3N0cmluZz4sIEw8L3N0YXR1cz4sIEw8L2ZpZWxkcz4sIGFuZCBMPC9lcnJvcl9pbnB1dD4gbWV0aG9kcyB3aWxsIHJldHVybgordW5kZWZpbmVkIGluZm9ybWF0aW9uIGFmdGVyIGV4ZWN1dGluZyB0aGlzIG1ldGhvZC4KKworSWYgQzwkY29scmVmPiBpcyBDPHVuZGVmPiAgKGV4cGxpY2l0LCAgbm90IHRocm91Z2ggYSB2YXJpYWJsZSBhcmd1bWVudCkgYW5kCitMPC9iaW5kX2NvbHVtbnM+ICB3YXMgdXNlZCB0byBzcGVjaWZ5IGZpZWxkcyB0byBiZSBwcmludGVkLCAgaXQgaXMgcG9zc2libGUKK3RvIG1ha2UgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLCBhcyBvdGhlcndpc2UgZGF0YSB3b3VsZCBoYXZlIHRvIGJlIGNvcGllZAorYXMgYXJndW1lbnRzIHRvIHRoZSBtZXRob2QgY2FsbDoKKworICRjc3YtPmJpbmRfY29sdW1ucyAoXCgkZm9vLCAkYmFyKSk7CisgJHN0YXR1cyA9ICRjc3YtPnByaW50ICgkZmgsIHVuZGVmKTsKKworPWhlYWQyIHNheQorCisgJHN0YXR1cyA9ICRjc3YtPnNheSAoJGlvLCAkY29scmVmKTsKKworTGlrZSBMPEM8cHJpbnQ+fC9wcmludD4sIGJ1dCBMPEM8ZW9sPnwvZW9sPiBkZWZhdWx0cyB0byBDPCRcPi4KKworPWhlYWQyIHByaW50X2hyCisKKyAkY3N2LT5wcmludF9ociAoJGlvLCAkcmVmKTsKKworUHJvdmlkZXMgYW4gZWFzeSB3YXkgIHRvIHByaW50IGEgIEM8JHJlZj4gIChhcyBmZXRjaGVkIHdpdGggTDwvZ2V0bGluZV9ocj4pCitwcm92aWRlZCB0aGUgY29sdW1uIG5hbWVzIGFyZSBzZXQgd2l0aCBMPC9jb2x1bW5fbmFtZXM+LgorCitJdCBpcyBqdXN0IGEgd3JhcHBlciBtZXRob2Qgd2l0aCBiYXNpYyBwYXJhbWV0ZXIgY2hlY2tzIG92ZXIKKworICRjc3YtPnByaW50ICgkaW8sIFsgbWFwIHsgJHJlZi0+eyRffSB9ICRjc3YtPmNvbHVtbl9uYW1lcyBdKTsKKworPWhlYWQyIGNvbWJpbmUKKworICRzdGF0dXMgPSAkY3N2LT5jb21iaW5lIChAZmllbGRzKTsKKworVGhpcyBtZXRob2QgY29uc3RydWN0cyBhIEM8Q1NWPiByZWNvcmQgZnJvbSAgQzxAZmllbGRzPiwgIHJldHVybmluZyBzdWNjZXNzCitvciBmYWlsdXJlLiAgIEZhaWx1cmUgY2FuIHJlc3VsdCBmcm9tIGxhY2sgb2YgYXJndW1lbnRzIG9yIGFuIGFyZ3VtZW50IHRoYXQKK2NvbnRhaW5zIGFuIGludmFsaWQgY2hhcmFjdGVyLiAgIFVwb24gc3VjY2VzcywgIEw8L3N0cmluZz4gY2FuIGJlIGNhbGxlZCB0bworcmV0cmlldmUgdGhlIHJlc3VsdGFudCBDPENTVj4gc3RyaW5nLiAgVXBvbiBmYWlsdXJlLCAgdGhlIHZhbHVlIHJldHVybmVkIGJ5CitMPC9zdHJpbmc+IGlzIHVuZGVmaW5lZCBhbmQgTDwvZXJyb3JfaW5wdXQ+IGNvdWxkIGJlIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUKK2ludmFsaWQgYXJndW1lbnQuCisKKz1oZWFkMiBzdHJpbmcKKworICRsaW5lID0gJGNzdi0+c3RyaW5nICgpOworCitUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbnB1dCB0byAgTDwvcGFyc2U+ICBvciB0aGUgcmVzdWx0YW50IEM8Q1NWPiBzdHJpbmcKK29mIEw8L2NvbWJpbmU+LCB3aGljaGV2ZXIgd2FzIGNhbGxlZCBtb3JlIHJlY2VudGx5LgorCis9aGVhZDIgZ2V0bGluZQorCisgJGNvbHJlZiA9ICRjc3YtPmdldGxpbmUgKCRpbyk7CisKK1RoaXMgaXMgdGhlIGNvdW50ZXJwYXJ0IHRvICBMPC9wcmludD4sICBhcyBMPC9wYXJzZT4gIGlzIHRoZSBjb3VudGVycGFydCB0bworTDwvY29tYmluZT46ICBpdCBwYXJzZXMgYSByb3cgZnJvbSB0aGUgQzwkaW8+ICBoYW5kbGUgdXNpbmcgdGhlIEw8L2dldGxpbmU+CittZXRob2QgYXNzb2NpYXRlZCB3aXRoIEM8JGlvPiAgYW5kIHBhcnNlcyB0aGlzIHJvdyBpbnRvIGFuIGFycmF5IHJlZi4gIFRoaXMKK2FycmF5IHJlZiBpcyByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24gb3IgQzx1bmRlZj4gZm9yIGZhaWx1cmUuICBXaGVuIEM8JGlvPgorZG9lcyBub3Qgc3VwcG9ydCBDPGdldGxpbmU+LCB5b3UgYXJlIGxpa2VseSB0byBoaXQgZXJyb3JzLgorCitXaGVuIGZpZWxkcyBhcmUgYm91bmQgd2l0aCBMPC9iaW5kX2NvbHVtbnM+IHRoZSByZXR1cm4gdmFsdWUgaXMgYSByZWZlcmVuY2UKK3RvIGFuIGVtcHR5IGxpc3QuCisKK1RoZSBMPC9zdHJpbmc+LCBMPC9maWVsZHM+LCBhbmQgTDwvc3RhdHVzPiBtZXRob2RzIGFyZSBtZWFuaW5nbGVzcyBhZ2Fpbi4KKworPWhlYWQyIGdldGxpbmVfYWxsCisKKyAkYXJyYXlyZWYgPSAkY3N2LT5nZXRsaW5lX2FsbCAoJGlvKTsKKyAkYXJyYXlyZWYgPSAkY3N2LT5nZXRsaW5lX2FsbCAoJGlvLCAkb2Zmc2V0KTsKKyAkYXJyYXlyZWYgPSAkY3N2LT5nZXRsaW5lX2FsbCAoJGlvLCAkb2Zmc2V0LCAkbGVuZ3RoKTsKKworVGhpcyB3aWxsIHJldHVybiBhIHJlZmVyZW5jZSB0byBhIGxpc3Qgb2YgTDxnZXRsaW5lICgkaW8pfC9nZXRsaW5lPiByZXN1bHRzLgorSW4gdGhpcyBjYWxsLCBDPGtlZXBfbWV0YV9pbmZvPiBpcyBkaXNhYmxlZC4gIElmIEM8JG9mZnNldD4gaXMgbmVnYXRpdmUsIGFzCit3aXRoIEM8c3BsaWNlPiwgb25seSB0aGUgbGFzdCAgQzxhYnMgKCRvZmZzZXQpPiByZWNvcmRzIG9mIEM8JGlvPiBhcmUgdGFrZW4KK2ludG8gY29uc2lkZXJhdGlvbi4KKworR2l2ZW4gYSBDU1YgZmlsZSB3aXRoIDEwIGxpbmVzOgorCisgbGluZXMgY2FsbAorIC0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDAuLjkgICRjc3YtPmdldGxpbmVfYWxsICgkaW8pICAgICAgICAgIyBhbGwKKyAwLi45ICAkY3N2LT5nZXRsaW5lX2FsbCAoJGlvLCAgMCkgICAgICMgYWxsCisgOC4uOSAgJGNzdi0+Z2V0bGluZV9hbGwgKCRpbywgIDgpICAgICAjIHN0YXJ0IGF0IDgKKyAtICAgICAkY3N2LT5nZXRsaW5lX2FsbCAoJGlvLCAgMCwgIDApICMgc3RhcnQgYXQgMCBmaXJzdCAwIHJvd3MKKyAwLi40ICAkY3N2LT5nZXRsaW5lX2FsbCAoJGlvLCAgMCwgIDUpICMgc3RhcnQgYXQgMCBmaXJzdCA1IHJvd3MKKyA0Li41ICAkY3N2LT5nZXRsaW5lX2FsbCAoJGlvLCAgNCwgIDIpICMgc3RhcnQgYXQgNCBmaXJzdCAyIHJvd3MKKyA4Li45ICAkY3N2LT5nZXRsaW5lX2FsbCAoJGlvLCAtMikgICAgICMgbGFzdCAyIHJvd3MKKyA2Li43ICAkY3N2LT5nZXRsaW5lX2FsbCAoJGlvLCAtNCwgIDIpICMgZmlyc3QgMiBvZiBsYXN0ICA0IHJvd3MKKworPWhlYWQyIGdldGxpbmVfaHIKKworVGhlIEw8L2dldGxpbmVfaHI+IGFuZCBMPC9jb2x1bW5fbmFtZXM+IG1ldGhvZHMgd29yayB0b2dldGhlciAgdG8gYWxsb3cgeW91Cit0byBoYXZlIHJvd3MgcmV0dXJuZWQgYXMgaGFzaHJlZnMuICBZb3UgbXVzdCBjYWxsIEw8L2NvbHVtbl9uYW1lcz4gZmlyc3QgdG8KK2RlY2xhcmUgeW91ciBjb2x1bW4gbmFtZXMuCisKKyAkY3N2LT5jb2x1bW5fbmFtZXMgKHF3KCBjb2RlIG5hbWUgcHJpY2UgZGVzY3JpcHRpb24gKSk7CisgJGhyID0gJGNzdi0+Z2V0bGluZV9ociAoJGlvKTsKKyBwcmludCAiUHJpY2UgZm9yICRoci0+e25hbWV9IGlzICRoci0+e3ByaWNlfSBFVVJcbiI7CisKK0w8L2dldGxpbmVfaHI+IHdpbGwgY3JvYWsgaWYgY2FsbGVkIGJlZm9yZSBMPC9jb2x1bW5fbmFtZXM+LgorCitOb3RlIHRoYXQgIEw8L2dldGxpbmVfaHI+ICBjcmVhdGVzIGEgaGFzaHJlZiBmb3IgZXZlcnkgcm93IGFuZCB3aWxsIGJlIG11Y2gKK3Nsb3dlciB0aGFuIHRoZSBjb21iaW5lZCB1c2Ugb2YgTDwvYmluZF9jb2x1bW5zPiAgYW5kIEw8L2dldGxpbmU+IGJ1dCBzdGlsbAorb2ZmZXJpbmcgdGhlIHNhbWUgZWFzZSBvZiB1c2UgaGFzaHJlZiBpbnNpZGUgdGhlIGxvb3A6CisKKyBteSBAY29scyA9IEB7JGNzdi0+Z2V0bGluZSAoJGlvKX07CisgJGNzdi0+Y29sdW1uX25hbWVzIChAY29scyk7Cisgd2hpbGUgKG15ICRyb3cgPSAkY3N2LT5nZXRsaW5lX2hyICgkaW8pKSB7CisgICAgIHByaW50ICRyb3ctPntwcmljZX07CisgICAgIH0KKworQ291bGQgZWFzaWx5IGJlIHJld3JpdHRlbiB0byB0aGUgbXVjaCBmYXN0ZXI6CisKKyBteSBAY29scyA9IEB7JGNzdi0+Z2V0bGluZSAoJGlvKX07CisgbXkgJHJvdyA9IHt9OworICRjc3YtPmJpbmRfY29sdW1ucyAoXEB7JHJvd317QGNvbHN9KTsKKyB3aGlsZSAoJGNzdi0+Z2V0bGluZSAoJGlvKSkgeworICAgICBwcmludCAkcm93LT57cHJpY2V9OworICAgICB9CisKK1lvdXIgbWlsZWFnZSBtYXkgdmFyeSBmb3IgdGhlIHNpemUgb2YgdGhlIGRhdGEgYW5kIHRoZSBudW1iZXIgb2Ygcm93cy4KKworPWhlYWQyIGdldGxpbmVfaHJfYWxsCisKKyAkYXJyYXlyZWYgPSAkY3N2LT5nZXRsaW5lX2hyX2FsbCAoJGlvKTsKKyAkYXJyYXlyZWYgPSAkY3N2LT5nZXRsaW5lX2hyX2FsbCAoJGlvLCAkb2Zmc2V0KTsKKyAkYXJyYXlyZWYgPSAkY3N2LT5nZXRsaW5lX2hyX2FsbCAoJGlvLCAkb2Zmc2V0LCAkbGVuZ3RoKTsKKworVGhpcyB3aWxsIHJldHVybiBhIHJlZmVyZW5jZSB0byBhIGxpc3Qgb2YgICBMPGdldGxpbmVfaHIgKCRpbyl8L2dldGxpbmVfaHI+CityZXN1bHRzLiAgSW4gdGhpcyBjYWxsLCBMPEM8a2VlcF9tZXRhX2luZm8+fC9rZWVwX21ldGFfaW5mbz4gaXMgZGlzYWJsZWQuCisKKz1oZWFkMiBwYXJzZQorCisgJHN0YXR1cyA9ICRjc3YtPnBhcnNlICgkbGluZSk7CisKK1RoaXMgbWV0aG9kIGRlY29tcG9zZXMgYSAgQzxDU1Y+ICBzdHJpbmcgaW50byBmaWVsZHMsICByZXR1cm5pbmcgc3VjY2VzcyBvcgorZmFpbHVyZS4gICBGYWlsdXJlIGNhbiByZXN1bHQgZnJvbSBhIGxhY2sgb2YgYXJndW1lbnQgIG9yIHRoZSBnaXZlbiAgQzxDU1Y+CitzdHJpbmcgaXMgaW1wcm9wZXJseSBmb3JtYXR0ZWQuICAgVXBvbiBzdWNjZXNzLCBMPC9maWVsZHM+IGNhbiBiZSBjYWxsZWQgdG8KK3JldHJpZXZlIHRoZSBkZWNvbXBvc2VkIGZpZWxkcy4gVXBvbiBmYWlsdXJlIGNhbGxpbmcgTDwvZmllbGRzPiB3aWxsIHJldHVybgordW5kZWZpbmVkIGRhdGEgYW5kICBMPC9lcnJvcl9pbnB1dD4gIGNhbiBiZSBjYWxsZWQgdG8gcmV0cmlldmUgIHRoZSBpbnZhbGlkCithcmd1bWVudC4KKworWW91IG1heSB1c2UgdGhlIEw8L3R5cGVzPiAgbWV0aG9kIGZvciBzZXR0aW5nIGNvbHVtbiB0eXBlcy4gIFNlZSBMPC90eXBlcz4nCitkZXNjcmlwdGlvbiBiZWxvdy4KKworVGhlIEM8JGxpbmU+IGFyZ3VtZW50IGlzIHN1cHBvc2VkIHRvIGJlIGEgc2ltcGxlIHNjYWxhci4gRXZlcnl0aGluZyBlbHNlIGlzCitzdXBwb3NlZCB0byBjcm9hayBhbmQgc2V0IGVycm9yIDE1MDAuCisKKz1oZWFkMiBmcmFnbWVudAorCitUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGltcGxlbWVudCBSRkM3MTExICAoVVJJIEZyYWdtZW50IElkZW50aWZpZXJzIGZvciB0aGUKK3RleHQvY3N2IE1lZGlhIFR5cGUpIC0gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzExMQorCisgbXkgJEFvQSA9ICRjc3YtPmZyYWdtZW50ICgkaW8sICRzcGVjKTsKKworSW4gc3BlY2lmaWNhdGlvbnMsICBDPCo+IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgSTxsYXN0PiBpdGVtLCBhIGRhc2ggKEM8LT4pCit0byBpbmRpY2F0ZSBhIHJhbmdlLiAgIEFsbCBpbmRpY2VzIGFyZSBDPDE+LWJhc2VkOiAgdGhlIGZpcnN0IHJvdyBvciBjb2x1bW4KK2hhcyBpbmRleCBDPDE+LiBTZWxlY3Rpb25zIGNhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSBzZW1pLWNvbG9uIChDPDs+KS4KKworV2hlbiB1c2luZyB0aGlzIG1ldGhvZCBpbiBjb21iaW5hdGlvbiB3aXRoICBMPC9jb2x1bW5fbmFtZXM+LCAgdGhlIHJldHVybmVkCityZWZlcmVuY2UgIHdpbGwgcG9pbnQgdG8gYSAgbGlzdCBvZiBoYXNoZXMgIGluc3RlYWQgb2YgYSAgbGlzdCBvZiBsaXN0cy4gIEEKK2Rpc2pvaW50ZWQgIGNlbGwtYmFzZWQgY29tYmluZWQgc2VsZWN0aW9uICBtaWdodCByZXR1cm4gcm93cyB3aXRoIGRpZmZlcmVudAorbnVtYmVyIG9mIGNvbHVtbnMgbWFraW5nIHRoZSB1c2Ugb2YgaGFzaGVzIHVucHJlZGljdGFibGUuCisKKyAkY3N2LT5jb2x1bW5fbmFtZXMgKCJOYW1lIiwgIkFnZSIpOworIG15ICRBb0ggPSAkY3N2LT5mcmFnbWVudCAoJGlvLCAiY29sPTM7OCIpOworCitJZiB0aGUgTDwvYWZ0ZXJfcGFyc2U+IGNhbGxiYWNrIGlzIGFjdGl2ZSwgIGl0IGlzIGFsc28gY2FsbGVkIG9uIGV2ZXJ5IGxpbmUKK3BhcnNlZCBhbmQgc2tpcHBlZCBiZWZvcmUgdGhlIGZyYWdtZW50LgorCis9b3ZlciAyCisKKz1pdGVtIHJvdworCisgcm93PTQKKyByb3c9NS03Cisgcm93PTYtKgorIHJvdz0xLTI7NDs2LSoKKworPWl0ZW0gY29sCisKKyBjb2w9MgorIGNvbD0xLTMKKyBjb2w9NC0qCisgY29sPTEtMjs0OzctKgorCis9aXRlbSBjZWxsCisKK0luIGNlbGwtYmFzZWQgc2VsZWN0aW9uLCB0aGUgY29tbWEgKEM8LD4pIGlzIHVzZWQgdG8gcGFpciByb3cgYW5kIGNvbHVtbgorCisgY2VsbD00LDEKKworVGhlIHJhbmdlIG9wZXJhdG9yIChDPC0+KSB1c2luZyBDPGNlbGw+cyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgdG9wLWxlZnQgYW5kCitib3R0b20tcmlnaHQgQzxjZWxsPiBsb2NhdGlvbgorCisgY2VsbD0zLDEtNCw2CisKK1RoZSBDPCo+IGlzIG9ubHkgYWxsb3dlZCBpbiB0aGUgc2Vjb25kIHBhcnQgb2YgYSBwYWlyCisKKyBjZWxsPTMsMi0qLDIgICAgIyByb3cgMyB0aWxsIGVuZCwgb25seSBjb2x1bW4gMgorIGNlbGw9MywyLTMsKiAgICAjIGNvbHVtbiAyIHRpbGwgZW5kLCBvbmx5IHJvdyAzCisgY2VsbD0zLDItKiwqICAgICMgc3RyaXAgcm93IDEgYW5kIDIsIGFuZCBjb2x1bW4gMQorCitDZWxscyBhbmQgY2VsbCByYW5nZXMgbWF5IGJlIGNvbWJpbmVkIHdpdGggQzw7PiwgcG9zc2libHkgcmVzdWx0aW5nIGluIHJvd3MKK3dpdGggZGlmZmVyZW50IG51bWJlciBvZiBjb2x1bW5zCisKKyBjZWxsPTEsMS0yLDI7MywzLTQsNDsxLDQ7NCwxCisKK0Rpc2pvaW50ZWQgc2VsZWN0aW9ucyB3aWxsIG9ubHkgcmV0dXJuIHNlbGVjdGVkIGNlbGxzLiAgIFRoZSBjZWxscyB0aGF0IGFyZQorbm90ICBzcGVjaWZpZWQgIHdpbGwgIG5vdCAgYmUgIGluY2x1ZGVkICBpbiB0aGUgIHJldHVybmVkIHNldCwgIG5vdCBldmVuIGFzCitDPHVuZGVmPi4gIEFzIGFuIGV4YW1wbGUgZ2l2ZW4gYSBDPENTVj4gbGlrZQorCisgMTEsMTIsMTMsLi4uMTkKKyAyMSwyMiwuLi4yOCwyOQorIDogICAgICAgICAgICA6CisgOTEsLi4uOTcsOTgsOTkKKword2l0aCBDPGNlbGw9MSwxLTIsMjszLDMtNCw0OzEsNDs0LDE+IHdpbGwgcmV0dXJuOgorCisgMTEsMTIsMTQKKyAyMSwyMgorIDMzLDM0CisgNDEsNDMsNDQKKworT3ZlcmxhcHBpbmcgY2VsbC1zcGVjcyB3aWxsIHJldHVybiB0aG9zZSBjZWxscyBvbmx5IG9uY2UsIFNvCitDPGNlbGw9MSwxLTMsMzsyLDItNCw0OzIsMzs0LDI+IHdpbGwgcmV0dXJuOgorCisgMTEsMTIsMTMKKyAyMSwyMiwyMywyNAorIDMxLDMyLDMzLDM0CisgNDIsNDMsNDQKKworPWJhY2sKKworTDxSRkM3MTExfGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcxMTE+IGRvZXMgIEI8bm90PiAgYWxsb3cgZGlmZmVyZW50Cit0eXBlcyBvZiBzcGVjcyB0byBiZSBjb21iaW5lZCAgIChlaXRoZXIgQzxyb3c+IEk8b3I+IEM8Y29sPiBJPG9yPiBDPGNlbGw+KS4KK1Bhc3NpbmcgYW4gaW52YWxpZCBmcmFnbWVudCBzcGVjaWZpY2F0aW9uIHdpbGwgY3JvYWsgYW5kIHNldCBlcnJvciAyMDEzLgorCis9aGVhZDIgY29sdW1uX25hbWVzCisKK1NldCB0aGUgImtleXMiIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSAgTDwvZ2V0bGluZV9ocj4gIGNhbGxzLiAgSWYgbm8ga2V5cworKGNvbHVtbiBuYW1lcykgYXJlIHBhc3NlZCwgaXQgd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgc2V0dGluZyBhcyBhIGxpc3QuCisKK0w8L2NvbHVtbl9uYW1lcz4gYWNjZXB0cyBhIGxpc3Qgb2Ygc2NhbGFycyAgKHRoZSBjb2x1bW4gbmFtZXMpICBvciBhIHNpbmdsZQorYXJyYXlfcmVmLCBzbyB5b3UgY2FuIHBhc3MgdGhlIHJldHVybiB2YWx1ZSBmcm9tIEw8L2dldGxpbmU+IHRvbzoKKworICRjc3YtPmNvbHVtbl9uYW1lcyAoJGNzdi0+Z2V0bGluZSAoJGlvKSk7CisKK0w8L2NvbHVtbl9uYW1lcz4gZG9lcyBCPG5vPiBjaGVja2luZyBvbiBkdXBsaWNhdGVzIGF0IGFsbCwgd2hpY2ggbWlnaHQgbGVhZAordG8gdW5leHBlY3RlZCByZXN1bHRzLiAgIFVuZGVmaW5lZCBlbnRyaWVzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nCitDPCJcY0FVTkRFRlxjQSI+LCBzbworCisgJGNzdi0+Y29sdW1uX25hbWVzICh1bmRlZiwgIiIsICJuYW1lIiwgIm5hbWUiKTsKKyAkaHIgPSAkY3N2LT5nZXRsaW5lX2hyICgkaW8pOworCitXaWxsIHNldCBDPDwgJGhyLT57IlxjQVVOREVGXGNBIn0gPj4gdG8gdGhlIDFzdCBmaWVsZCwgIEM8PCAkaHItPnsiIn0gPj4gdG8KK3RoZSAybmQgZmllbGQsIGFuZCBDPDwgJGhyLT57bmFtZX0gPj4gdG8gdGhlIDR0aCBmaWVsZCwgIGRpc2NhcmRpbmcgdGhlIDNyZAorZmllbGQuCisKK0w8L2NvbHVtbl9uYW1lcz4gY3JvYWtzIG9uIGludmFsaWQgYXJndW1lbnRzLgorCis9aGVhZDIgaGVhZGVyCisKK1RoaXMgbWV0aG9kIGRvZXMgTk9UIHdvcmsgaW4gcGVybC01LjYueAorCitQYXJzZSB0aGUgQ1NWIGhlYWRlciBhbmQgc2V0IEw8QzxzZXA+fC9zZXA+LCBjb2x1bW5fbmFtZXMgYW5kIGVuY29kaW5nLgorCisgbXkgQGhkciA9ICRjc3YtPmhlYWRlciAoJGZoKTsKKyAkY3N2LT5oZWFkZXIgKCRmaCwgeyBzZXBfc2V0ID0+IFsgIjsiLCAiLCIsICJ8IiwgIlx0IiBdIH0pOworICRjc3YtPmhlYWRlciAoJGZoLCB7IGRldGVjdF9ib20gPT4gMSwgbXVuZ2VfY29sdW1uX25hbWVzID0+ICJsYyIgfSk7CisKK1RoZSBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYSBmaWxlIGhhbmRsZS4KKworQXNzdW1pbmcgdGhhdCB0aGUgZmlsZSBvcGVuZWQgZm9yIHBhcnNpbmcgaGFzIGEgaGVhZGVyLCBhbmQgdGhlIGhlYWRlciBkb2VzCitub3QgY29udGFpbiBwcm9ibGVtYXRpYyBjaGFyYWN0ZXJzIGxpa2UgZW1iZWRkZWQgbmV3bGluZXMsICAgcmVhZCB0aGUgZmlyc3QKK2xpbmUgZnJvbSB0aGUgb3BlbiBoYW5kbGUgdGhlbiBhdXRvLWRldGVjdCB3aGV0aGVyIHRoZSBoZWFkZXIgc2VwYXJhdGVzIHRoZQorY29sdW1uIG5hbWVzIHdpdGggYSBjaGFyYWN0ZXIgZnJvbSB0aGUgYWxsb3dlZCBzZXBhcmF0b3IgbGlzdC4KKworSWYgYW55IG9mIHRoZSBhbGxvd2VkIHNlcGFyYXRvcnMgbWF0Y2hlcywgIGFuZCBub25lIG9mIHRoZSBJPG90aGVyPiBhbGxvd2VkCitzZXBhcmF0b3JzIG1hdGNoLCAgc2V0ICBMPEM8c2VwPnwvc2VwPiAgdG8gdGhhdCAgc2VwYXJhdG9yICBmb3IgdGhlIGN1cnJlbnQKK0NTVl9QUCBpbnN0YW5jZSBhbmQgdXNlIGl0IHRvIHBhcnNlIHRoZSBmaXJzdCBsaW5lLCBtYXAgdGhvc2UgdG8gbG93ZXJjYXNlLAorYW5kIHVzZSB0aGF0IHRvIHNldCB0aGUgaW5zdGFuY2UgTDwvY29sdW1uX25hbWVzPjoKKworIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBiaW5hcnkgPT4gMSwgYXV0b19kaWFnID0+IDEgfSk7Cisgb3BlbiBteSAkZmgsICI8IiwgImZpbGUuY3N2IjsKKyBiaW5tb2RlICRmaDsgIyBmb3IgV2luZG93cworICRjc3YtPmhlYWRlciAoJGZoKTsKKyB3aGlsZSAobXkgJHJvdyA9ICRjc3YtPmdldGxpbmVfaHIgKCRmaCkpIHsKKyAgICAgLi4uCisgICAgIH0KKworSWYgdGhlIGhlYWRlciBpcyBlbXB0eSwgIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgdW5pcXVlIHNlcGFyYXRvciBvdXQgb2YgdGhlCithbGxvd2VkIHNldCwgIGNvbnRhaW5zIGVtcHR5IGZpZWxkcywgICBvciBjb250YWlucyBpZGVudGljYWwgZmllbGRzICAoYWZ0ZXIKK2ZvbGRpbmcpLCBpdCB3aWxsIGNyb2FrIHdpdGggZXJyb3IgMTAxMCwgMTAxMSwgMTAxMiwgb3IgMTAxMyByZXNwZWN0aXZlbHkuCisKK0lmIHRoZSBoZWFkZXIgY29udGFpbnMgZW1iZWRkZWQgbmV3bGluZXMgb3IgaXMgbm90IHZhbGlkICBDU1YgIGluIGFueSBvdGhlcgord2F5LCB0aGlzIG1ldGhvZCB3aWxsIGNyb2FrIGFuZCBsZWF2ZSB0aGUgcGFyc2UgZXJyb3IgdW50b3VjaGVkLgorCitBIHN1Y2Nlc3NmdWwgY2FsbCB0byBDPGhlYWRlcj4gIHdpbGwgYWx3YXlzIHNldCB0aGUgIEw8QzxzZXA+fC9zZXA+ICBvZiB0aGUKK0M8JGNzdj4gb2JqZWN0LiBUaGlzIGJlaGF2aW9yIGNhbiBub3QgYmUgZGlzYWJsZWQuCisKKz1oZWFkMyByZXR1cm4gdmFsdWUKKworT24gZXJyb3IgdGhpcyBtZXRob2Qgd2lsbCBjcm9hay4KKworSW4gbGlzdCBjb250ZXh0LCAgdGhlIGhlYWRlcnMgd2lsbCBiZSByZXR1cm5lZCB3aGV0aGVyIHRoZXkgYXJlIHVzZWQgdG8gc2V0CitMPC9jb2x1bW5fbmFtZXM+IG9yIG5vdC4KKworSW4gc2NhbGFyIGNvbnRleHQsIHRoZSBpbnN0YW5jZSBpdHNlbGYgaXMgcmV0dXJuZWQuICBCPE5vdGU+OiB0aGUgdmFsdWVzIGFzCitmb3VuZCBpbiB0aGUgaGVhZGVyIHdpbGwgZWZmZWN0aXZlbHkgYmUgIEI8bG9zdD4gaWYgIEM8c2V0X2NvbHVtbl9uYW1lcz4gaXMKK2ZhbHNlLgorCis9aGVhZDMgT3B0aW9ucworCis9b3ZlciAyCisKKz1pdGVtIHNlcF9zZXQKKworICRjc3YtPmhlYWRlciAoJGZoLCB7IHNlcF9zZXQgPT4gWyAiOyIsICIsIiwgInwiLCAiXHQiIF0gfSk7CisKK1RoZSBsaXN0IG9mIGxlZ2FsIHNlcGFyYXRvcnMgZGVmYXVsdHMgdG8gQzxbICI7IiwgIiwiIF0+IGFuZCBjYW4gYmUgY2hhbmdlZAorYnkgdGhpcyBvcHRpb24uICBBcyB0aGlzIGlzIHByb2JhYmx5IHRoZSBtb3N0IG9mdGVuIHVzZWQgb3B0aW9uLCAgaXQgY2FuIGJlCitwYXNzZWQgb24gaXRzIG93biBhcyBhbiB1bm5hbWVkIGFyZ3VtZW50OgorCisgJGNzdi0+aGVhZGVyICgkZmgsIFsgIjsiLCAiLCIsICJ8IiwgIlx0IiwgIjo6IiwgIlx4ezIwNjN9IiBdKTsKKworTXVsdGktYnl0ZSAgc2VxdWVuY2VzIGFyZSBhbGxvd2VkLCAgYm90aCBtdWx0aS1jaGFyYWN0ZXIgYW5kICBVbmljb2RlLiAgU2VlCitMPEM8c2VwPnwvc2VwPi4KKworPWl0ZW0gZGV0ZWN0X2JvbQorCisgJGNzdi0+aGVhZGVyICgkZmgsIHsgZGV0ZWN0X2JvbSA9PiAxIH0pOworCitUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZXRlY3QgaWYgdGhlIGhlYWRlciBsaW5lIHN0YXJ0cyB3aXRoIGEgQk9NLiAgSWYKK3RoZSBoZWFkZXIgaGFzIGEgQk9NLCB1c2UgdGhhdCB0byBzZXQgdGhlIGVuY29kaW5nIG9mIEM8JGZoPi4gIFRoaXMgZGVmYXVsdAorYmVoYXZpb3IgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgYSBmYWxzZSB2YWx1ZSB0byBDPGRldGVjdF9ib20+LgorCitTdXBwb3J0ZWQgZW5jb2RpbmdzIGZyb20gQk9NIGFyZTogVVRGLTgsIFVURi0xNkJFLCBVVEYtMTZMRSwgVVRGLTMyQkUsICBhbmQKK1VURi0zMkxFLiBCT00ncyBhbHNvIHN1cHBvcnQgVVRGLTEsIFVURi1FQkNESUMsIFNDU1UsIEJPQ1UtMSwgIGFuZCBHQi0xODAzMAorYnV0IEw8RW5jb2RlPiBkb2VzIG5vdCAoeWV0KS4gVVRGLTcgaXMgbm90IHN1cHBvcnRlZC4KKworVGhlIGVuY29kaW5nIGlzIHNldCB1c2luZyBDPGJpbm1vZGU+IG9uIEM8JGZoPi4KKworSWYgdGhlIGhhbmRsZSB3YXMgb3BlbmVkIGluIGEgKGNvcnJlY3QpIGVuY29kaW5nLCAgdGhpcyBtZXRob2Qgd2lsbCAgQjxub3Q+CithbHRlciB0aGUgZW5jb2RpbmcsIGFzIGl0IGNoZWNrcyB0aGUgbGVhZGluZyBCPGJ5dGVzPiBvZiB0aGUgZmlyc3QgbGluZS4KKworPWl0ZW0gbXVuZ2VfY29sdW1uX25hbWVzCisKK1RoaXMgb3B0aW9uIG9mZmVycyB0aGUgbWVhbnMgdG8gbW9kaWZ5IHRoZSBjb2x1bW4gbmFtZXMgaW50byBzb21ldGhpbmcgdGhhdAoraXMgbW9zdCB1c2VmdWwgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIFRoZSBkZWZhdWx0IGlzIHRvIG1hcCBhbGwgY29sdW1uIG5hbWVzCit0byBsb3dlciBjYXNlLgorCisgJGNzdi0+aGVhZGVyICgkZmgsIHsgbXVuZ2VfY29sdW1uX25hbWVzID0+ICJsYyIgfSk7CisKK1RoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBhdmFpbGFibGU6CisKKyAgbGMgICAtIGxvd2VyIGNhc2UKKyAgdWMgICAtIHVwcGVyIGNhc2UKKyAgbm9uZSAtIGRvIG5vdCBjaGFuZ2UKKyAgXCZjYiAtIHN1cHBseSBhIGNhbGxiYWNrCisKKyAkY3N2LT5oZWFkZXIgKCRmaCwgeyBtdW5nZV9jb2x1bW5fbmFtZXMgPT4gc3ViIHsgZmMgfSB9KTsKKyAkY3N2LT5oZWFkZXIgKCRmaCwgeyBtdW5nZV9jb2x1bW5fbmFtZXMgPT4gc3ViIHsgImNvbHVtbl8iLiRjb2wrKyB9IH0pOworICRjc3YtPmhlYWRlciAoJGZoLCB7IG11bmdlX2NvbHVtbl9uYW1lcyA9PiBzdWIgeyBsYyAocy9cVysvXy9ncikgfSB9KTsKKworQXMgdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgaW4gYSBDPG1hcD4sIHlvdSBjYW4gdXNlIEM8JF8+IGRpcmVjdGx5LgorCis9aXRlbSBzZXRfY29sdW1uX25hbWVzCisKKyAkY3N2LT5oZWFkZXIgKCRmaCwgeyBzZXRfY29sdW1uX25hbWVzID0+IDEgfSk7CisKK1RoZSBkZWZhdWx0IGlzIHRvIHNldCB0aGUgaW5zdGFuY2VzIGNvbHVtbiBuYW1lcyB1c2luZyAgTDwvY29sdW1uX25hbWVzPiBpZgordGhlIG1ldGhvZCBpcyBzdWNjZXNzZnVsLCAgc28gc3Vic2VxdWVudCBjYWxscyB0byBMPC9nZXRsaW5lX2hyPiBjYW4gcmV0dXJuCithIGhhc2guIERpc2FibGUgc2V0dGluZyB0aGUgaGVhZGVyIGNhbiBiZSBmb3JjZWQgYnkgdXNpbmcgYSBmYWxzZSB2YWx1ZSBmb3IKK3RoaXMgb3B0aW9uLgorCis9YmFjaworCis9aGVhZDMgVmFsaWRhdGlvbgorCitXaGVuIHJlY2VpdmluZyBDU1YgZmlsZXMgZnJvbSBleHRlcm5hbCBzb3VyY2VzLCAgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8KK3Byb3RlY3QgYWdhaW5zdCBjaGFuZ2VzIGluIHRoZSBsYXlvdXQgYnkgcmVzdHJpY3RpbmcgdG8ga25vd24gaGVhZGVycyAgKGFuZAordHlwb3MgaW4gdGhlIGhlYWRlciBmaWVsZHMpLgorCisgbXkgJWtub3duID0gKAorICAgICAicmVjb3JkIGtleSIgPT4gImNfcmVjIiwKKyAgICAgInJlYyBpZCIgICAgID0+ICJjX3JlYyIsCisgICAgICJpZF9yZWMiICAgICA9PiAiY19yZWMiLAorICAgICAia29kZSIgICAgICAgPT4gImNvZGUiLAorICAgICAiY29kZSIgICAgICAgPT4gImNvZGUiLAorICAgICAidmF1bGUiICAgICAgPT4gInZhbHVlIiwKKyAgICAgInZhbHVlIiAgICAgID0+ICJ2YWx1ZSIsCisgICAgICk7CisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IGJpbmFyeSA9PiAxLCBhdXRvX2RpYWcgPT4gMSB9KTsKKyBvcGVuIG15ICRmaCwgIjwiLCAkc291cmNlIG9yIGRpZSAiJHNvdXJjZTogJCEiOworICRjc3YtPmhlYWRlciAoJGZoLCB7IG11bmdlX2NvbHVtbl9uYW1lcyA9PiBzdWIgeworICAgICBzL1xzKyQvLzsKKyAgICAgcy9eXHMrLy87CisgICAgICRrbm93bntsYyAkX30gb3IgZGllICJVbmtub3duIGNvbHVtbiAnJF8nIGluICRzb3VyY2UiOworICAgICB9fSk7Cisgd2hpbGUgKG15ICRyb3cgPSAkY3N2LT5nZXRsaW5lX2hyICgkZmgpKSB7CisgICAgIHNheSBqb2luICJcdCIsICRyb3ctPntjX3JlY30sICRyb3ctPntjb2RlfSwgJHJvdy0+e3ZhbHVlfTsKKyAgICAgfQorCis9aGVhZDIgYmluZF9jb2x1bW5zCisKK1Rha2VzIGEgbGlzdCBvZiBzY2FsYXIgcmVmZXJlbmNlcyB0byBiZSB1c2VkIGZvciBvdXRwdXQgd2l0aCAgTDwvcHJpbnQ+ICBvcgordG8gc3RvcmUgaW4gdGhlIGZpZWxkcyBmZXRjaGVkIGJ5IEw8L2dldGxpbmU+LiAgV2hlbiB5b3UgZG8gbm90IHBhc3MgZW5vdWdoCityZWZlcmVuY2VzIHRvIHN0b3JlIHRoZSBmZXRjaGVkIGZpZWxkcyBpbiwgTDwvZ2V0bGluZT4gd2lsbCBmYWlsIHdpdGggZXJyb3IKK0M8MzAwNj4uICBJZiB5b3UgcGFzcyBtb3JlIHRoYW4gdGhlcmUgYXJlIGZpZWxkcyB0byByZXR1cm4sICB0aGUgY29udGVudCBvZgordGhlIHJlbWFpbmluZyByZWZlcmVuY2VzIGlzIGxlZnQgdW50b3VjaGVkLgorCisgJGNzdi0+YmluZF9jb2x1bW5zIChcJGNvZGUsIFwkbmFtZSwgXCRwcmljZSwgXCRkZXNjcmlwdGlvbik7Cisgd2hpbGUgKCRjc3YtPmdldGxpbmUgKCRpbykpIHsKKyAgICAgcHJpbnQgIlRoZSBwcmljZSBvZiBhICRuYW1lIGlzIFx4ezIwYWN9ICRwcmljZVxuIjsKKyAgICAgfQorCitUbyByZXNldCBvciBjbGVhciBhbGwgY29sdW1uIGJpbmRpbmcsIGNhbGwgTDwvYmluZF9jb2x1bW5zPiB3aXRoIHRoZSBzaW5nbGUKK2FyZ3VtZW50IEM8dW5kZWY+LiBUaGlzIHdpbGwgYWxzbyBjbGVhciBjb2x1bW4gbmFtZXMuCisKKyAkY3N2LT5iaW5kX2NvbHVtbnMgKHVuZGVmKTsKKworSWYgbm8gYXJndW1lbnRzIGFyZSBwYXNzZWQgYXQgYWxsLCBMPC9iaW5kX2NvbHVtbnM+IHdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mCitjdXJyZW50IGJpbmRpbmdzIG9yIEM8dW5kZWY+IGlmIG5vIGJpbmRzIGFyZSBhY3RpdmUuCisKK05vdGUgdGhhdCBpbiBwYXJzaW5nIHdpdGggIEM8YmluZF9jb2x1bW5zPiwgIHRoZSBmaWVsZHMgYXJlIHNldCBvbiB0aGUgZmx5LgorVGhhdCBpbXBsaWVzIHRoYXQgaWYgdGhlIHRoaXJkIGZpZWxkICBvZiBhIHJvdyAgY2F1c2VzIGFuIGVycm9yLCAgdGhlIGZpcnN0Cit0d28gZmllbGRzIGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkIHRoZSB2YWx1ZXMgb2YgdGhlIGN1cnJlbnQgcm93LCAgd2hpbGUKK3RoZSByZXN0IHdpbGwgc3RpbGwgaG9sZCB0aGUgdmFsdWVzIG9mIHRoZSBwcmV2aW91cyByb3cuCisKKz1oZWFkMiBlb2YKKworICRlb2YgPSAkY3N2LT5lb2YgKCk7CisKK0lmIEw8L3BhcnNlPiBvciAgTDwvZ2V0bGluZT4gIHdhcyB1c2VkIHdpdGggYW4gSU8gc3RyZWFtLCAgdGhpcyBtZXRob2Qgd2lsbAorcmV0dXJuIHRydWUgKDEpIGlmIHRoZSBsYXN0IGNhbGwgaGl0IGVuZCBvZiBmaWxlLCAgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuCitmYWxzZSAoJycpLiAgVGhpcyBpcyB1c2VmdWwgdG8gc2VlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBmYWlsdXJlIGFuZCBlbmQKK29mIGZpbGUuCisKK05vdGUgdGhhdCBpZiB0aGUgcGFyc2luZyBvZiB0aGUgbGFzdCBsaW5lIGNhdXNlZCBhbiBlcnJvciwgIEM8ZW9mPiBpcyBzdGlsbAordHJ1ZS4gIFRoYXQgbWVhbnMgdGhhdCBpZiB5b3UgYXJlIEk8bm90PiB1c2luZyBMPC9hdXRvX2RpYWc+LCBhbiBpZGlvbSBsaWtlCisKKyB3aGlsZSAobXkgJHJvdyA9ICRjc3YtPmdldGxpbmUgKCRmaCkpIHsKKyAgICAgIyAuLi4KKyAgICAgfQorICRjc3YtPmVvZiBvciAkY3N2LT5lcnJvcl9kaWFnOworCit3aWxsIEk8bm90PiByZXBvcnQgdGhlIGVycm9yLiBZb3Ugd291bGQgaGF2ZSB0byBjaGFuZ2UgdGhhdCB0bworCisgd2hpbGUgKG15ICRyb3cgPSAkY3N2LT5nZXRsaW5lICgkZmgpKSB7CisgICAgICMgLi4uCisgICAgIH0KKyArJGNzdi0+ZXJyb3JfZGlhZyBhbmQgJGNzdi0+ZXJyb3JfZGlhZzsKKworPWhlYWQyIHR5cGVzCisKKyAkY3N2LT50eXBlcyAoXEB0cmVmKTsKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBmb3JjZSB0aGF0ICAoYWxsKSAgY29sdW1ucyBhcmUgb2YgYSBnaXZlbiB0eXBlLiAgRm9yCitleGFtcGxlLCBpZiB5b3UgaGF2ZSBhbiBpbnRlZ2VyIGNvbHVtbiwgIHR3byAgY29sdW1ucyAgd2l0aCAgZG91YmxlcyAgYW5kIGEKK3N0cmluZyBjb2x1bW4sIHRoZW4geW91IG1pZ2h0IGRvIGEKKworICRjc3YtPnR5cGVzIChbVGV4dDo6Q1NWOjpJViAoKSwKKyAgICAgICAgICAgICAgIFRleHQ6OkNTVjo6TlYgKCksCisgICAgICAgICAgICAgICBUZXh0OjpDU1Y6Ok5WICgpLAorICAgICAgICAgICAgICAgVGV4dDo6Q1NWOjpQViAoKV0pOworCitDb2x1bW4gdHlwZXMgYXJlIHVzZWQgb25seSBmb3IgSTxkZWNvZGluZz4gY29sdW1ucyB3aGlsZSBwYXJzaW5nLCAgaW4gb3RoZXIKK3dvcmRzIGJ5IHRoZSBMPC9wYXJzZT4gYW5kIEw8L2dldGxpbmU+IG1ldGhvZHMuCisKK1lvdSBjYW4gdW5zZXQgY29sdW1uIHR5cGVzIGJ5IGRvaW5nIGEKKworICRjc3YtPnR5cGVzICh1bmRlZik7CisKK29yIGZldGNoIHRoZSBjdXJyZW50IHR5cGUgc2V0dGluZ3Mgd2l0aAorCisgJHR5cGVzID0gJGNzdi0+dHlwZXMgKCk7CisKKz1vdmVyIDQKKworPWl0ZW0gSVYKKworU2V0IGZpZWxkIHR5cGUgdG8gaW50ZWdlci4KKworPWl0ZW0gTlYKKworU2V0IGZpZWxkIHR5cGUgdG8gbnVtZXJpYy9mbG9hdC4KKworPWl0ZW0gUFYKKworU2V0IGZpZWxkIHR5cGUgdG8gc3RyaW5nLgorCis9YmFjaworCis9aGVhZDIgZmllbGRzCisKKyBAY29sdW1ucyA9ICRjc3YtPmZpZWxkcyAoKTsKKworVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5wdXQgdG8gICBMPC9jb21iaW5lPiAgb3IgdGhlIHJlc3VsdGFudCBkZWNvbXBvc2VkCitmaWVsZHMgb2YgYSBzdWNjZXNzZnVsIEw8L3BhcnNlPiwgd2hpY2hldmVyIHdhcyBjYWxsZWQgbW9yZSByZWNlbnRseS4KKworTm90ZSB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkIGFmdGVyIHVzaW5nIEw8L2dldGxpbmU+LCB3aGljaCBkb2VzCitub3QgZmlsbCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHJldHVybmVkIGJ5IEw8L3BhcnNlPi4KKworPWhlYWQyIG1ldGFfaW5mbworCisgQGZsYWdzID0gJGNzdi0+bWV0YV9pbmZvICgpOworCitUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSAiZmxhZ3MiIG9mIHRoZSBpbnB1dCB0byBMPC9jb21iaW5lPiBvciB0aGUgZmxhZ3Mgb2YKK3RoZSByZXN1bHRhbnQgIGRlY29tcG9zZWQgZmllbGRzIG9mICBMPC9wYXJzZT4sICAgd2hpY2hldmVyIHdhcyBjYWxsZWQgbW9yZQorcmVjZW50bHkuCisKK0ZvciBlYWNoIGZpZWxkLCAgYSBtZXRhX2luZm8gZmllbGQgd2lsbCBob2xkICBmbGFncyB0aGF0ICBpbmZvcm0gIHNvbWV0aGluZworYWJvdXQgIHRoZSAgZmllbGQgIHJldHVybmVkICBieSAgdGhlICBMPC9maWVsZHM+ICBtZXRob2Qgb3IgIHBhc3NlZCB0byAgdGhlCitMPC9jb21iaW5lPiBtZXRob2QuIFRoZSBmbGFncyBhcmUgYml0LXdpc2UtQzxvcj4nZCBsaWtlOgorCis9b3ZlciAyCisKKz1pdGVtIEM8ID4weDAwMDEKKworVGhlIGZpZWxkIHdhcyBxdW90ZWQuCisKKz1pdGVtIEM8ID4weDAwMDIKKworVGhlIGZpZWxkIHdhcyBiaW5hcnkuCisKKz1iYWNrCisKK1NlZSB0aGUgQzxpc18qKio+IG1ldGhvZHMgYmVsb3cuCisKKz1oZWFkMiBpc19xdW90ZWQKKworIG15ICRxdW90ZWQgPSAkY3N2LT5pc19xdW90ZWQgKCRjb2x1bW5faWR4KTsKKworV2hlcmUgIEM8JGNvbHVtbl9pZHg+IGlzIHRoZSAgKHplcm8tYmFzZWQpICBpbmRleCBvZiB0aGUgY29sdW1uIGluIHRoZSBsYXN0CityZXN1bHQgb2YgTDwvcGFyc2U+LgorCitUaGlzIHJldHVybnMgYSB0cnVlIHZhbHVlICBpZiB0aGUgZGF0YSBpbiB0aGUgaW5kaWNhdGVkIGNvbHVtbiB3YXMgZW5jbG9zZWQKK2luIEw8QzxxdW90ZV9jaGFyPnwvcXVvdGVfY2hhcj4gcXVvdGVzLiAgVGhpcyBtaWdodCBiZSBpbXBvcnRhbnQgZm9yIGZpZWxkcword2hlcmUgY29udGVudCBDPCwyMDA3MDEwOCw+IGlzIHRvIGJlIHRyZWF0ZWQgYXMgYSBudW1lcmljIHZhbHVlLCAgYW5kIHdoZXJlCitDPCwiMjAwNzAxMDgiLD4gaXMgZXhwbGljaXRseSBtYXJrZWQgYXMgY2hhcmFjdGVyIHN0cmluZyBkYXRhLgorCitUaGlzIG1ldGhvZCBpcyBvbmx5IHZhbGlkIHdoZW4gTDwva2VlcF9tZXRhX2luZm8+IGlzIHNldCB0byBhIHRydWUgdmFsdWUuCisKKz1oZWFkMiBpc19iaW5hcnkKKworIG15ICRiaW5hcnkgPSAkY3N2LT5pc19iaW5hcnkgKCRjb2x1bW5faWR4KTsKKworV2hlcmUgIEM8JGNvbHVtbl9pZHg+IGlzIHRoZSAgKHplcm8tYmFzZWQpICBpbmRleCBvZiB0aGUgY29sdW1uIGluIHRoZSBsYXN0CityZXN1bHQgb2YgTDwvcGFyc2U+LgorCitUaGlzIHJldHVybnMgYSB0cnVlIHZhbHVlIGlmIHRoZSBkYXRhIGluIHRoZSBpbmRpY2F0ZWQgY29sdW1uIGNvbnRhaW5lZCBhbnkKK2J5dGUgaW4gdGhlIHJhbmdlIEM8W1x4MDAtXHgwOCxceDEwLVx4MUYsXHg3Ri1ceEZGXT4uCisKK1RoaXMgbWV0aG9kIGlzIG9ubHkgdmFsaWQgd2hlbiBMPC9rZWVwX21ldGFfaW5mbz4gaXMgc2V0IHRvIGEgdHJ1ZSB2YWx1ZS4KKworPWhlYWQyIGlzX21pc3NpbmcKKworIG15ICRtaXNzaW5nID0gJGNzdi0+aXNfbWlzc2luZyAoJGNvbHVtbl9pZHgpOworCitXaGVyZSAgQzwkY29sdW1uX2lkeD4gaXMgdGhlICAoemVyby1iYXNlZCkgIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gdGhlIGxhc3QKK3Jlc3VsdCBvZiBMPC9nZXRsaW5lX2hyPi4KKworICRjc3YtPmtlZXBfbWV0YV9pbmZvICgxKTsKKyB3aGlsZSAobXkgJGhyID0gJGNzdi0+Z2V0bGluZV9ociAoJGZoKSkgeworICAgICAkY3N2LT5pc19taXNzaW5nICgwKSBhbmQgbmV4dDsgIyBUaGlzIHdhcyBhbiBlbXB0eSBsaW5lCisgICAgIH0KKworV2hlbiB1c2luZyAgTDwvZ2V0bGluZV9ocj4sICBpdCBpcyBpbXBvc3NpYmxlIHRvIHRlbGwgaWYgdGhlICBwYXJzZWQgZmllbGRzCithcmUgQzx1bmRlZj4gYmVjYXVzZSB0aGV5IHdoZXJlIG5vdCBmaWxsZWQgaW4gdGhlIEM8Q1NWPiBzdHJlYW0gIG9yIGJlY2F1c2UKK3RoZXkgd2VyZSBub3QgcmVhZCBhdCBhbGwsIGFzIEI8YWxsPiB0aGUgZmllbGRzIGRlZmluZWQgYnkgTDwvY29sdW1uX25hbWVzPgorYXJlIHNldCBpbiB0aGUgaGFzaC1yZWYuICAgIElmIHlvdSBzdGlsbCBuZWVkIHRvIGtub3cgaWYgYWxsIGZpZWxkcyBpbiBlYWNoCityb3cgYXJlIHByb3ZpZGVkLCB5b3Ugc2hvdWxkIGVuYWJsZSBMPEM8a2VlcF9tZXRhX2luZm8+fC9rZWVwX21ldGFfaW5mbz4gc28KK3lvdSBjYW4gY2hlY2sgdGhlIGZsYWdzLgorCitJZiAgTDxDPGtlZXBfbWV0YV9pbmZvPnwva2VlcF9tZXRhX2luZm8+ICBpcyBDPGZhbHNlPiwgIEM8aXNfbWlzc2luZz4gIHdpbGwKK2Fsd2F5cyByZXR1cm4gQzx1bmRlZj4sIHJlZ2FyZGxlc3Mgb2YgQzwkY29sdW1uX2lkeD4gYmVpbmcgdmFsaWQgb3Igbm90LiBJZgordGhpcyBhdHRyaWJ1dGUgaXMgQzx0cnVlPiBpdCB3aWxsIHJldHVybiBlaXRoZXIgQzwwPiAodGhlIGZpZWxkIGlzIHByZXNlbnQpCitvciBDPDE+ICh0aGUgZmllbGQgaXMgbWlzc2luZykuCisKK0Egc3BlY2lhbCBjYXNlIGlzIHRoZSBlbXB0eSBsaW5lLiAgSWYgdGhlIGxpbmUgaXMgY29tcGxldGVseSBlbXB0eSAtICBhZnRlcgorZGVhbGluZyB3aXRoIHRoZSBmbGFncyAtIHRoaXMgaXMgc3RpbGwgYSB2YWxpZCBDU1YgbGluZTogIGl0IGlzIGEgcmVjb3JkIG9mCitqdXN0IG9uZSBzaW5nbGUgZW1wdHkgZmllbGQuIEhvd2V2ZXIsIGlmIEM8a2VlcF9tZXRhX2luZm8+IGlzIHNldCwgaW52b2tpbmcKK0M8aXNfbWlzc2luZz4gd2l0aCBpbmRleCBDPDA+IHdpbGwgbm93IHJldHVybiB0cnVlLgorCis9aGVhZDIgc3RhdHVzCisKKyAkc3RhdHVzID0gJGNzdi0+c3RhdHVzICgpOworCitUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIGxhc3QgaW52b2tlZCBMPC9jb21iaW5lPiBvciBMPC9wYXJzZT4KK2NhbGwuIFN0YXR1cyBpcyBzdWNjZXNzICh0cnVlOiBDPDE+KSBvciBmYWlsdXJlIChmYWxzZTogQzx1bmRlZj4gb3IgQzwwPikuCisKKz1oZWFkMiBlcnJvcl9pbnB1dAorCisgJGJhZF9hcmd1bWVudCA9ICRjc3YtPmVycm9yX2lucHV0ICgpOworCitUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlcnJvbmVvdXMgYXJndW1lbnQgKGlmIGl0IGV4aXN0cykgb2YgTDwvY29tYmluZT4gb3IKK0w8L3BhcnNlPiwgIHdoaWNoZXZlciB3YXMgY2FsbGVkIG1vcmUgcmVjZW50bHkuICBJZiB0aGUgbGFzdCBpbnZvY2F0aW9uIHdhcworc3VjY2Vzc2Z1bCwgQzxlcnJvcl9pbnB1dD4gd2lsbCByZXR1cm4gQzx1bmRlZj4uCisKKz1oZWFkMiBlcnJvcl9kaWFnCisKKyBUZXh0OjpDU1YtPmVycm9yX2RpYWcgKCk7CisgJGNzdi0+ZXJyb3JfZGlhZyAoKTsKKyAkZXJyb3JfY29kZSAgICAgICAgICAgICAgID0gMCAgKyAkY3N2LT5lcnJvcl9kaWFnICgpOworICRlcnJvcl9zdHIgICAgICAgICAgICAgICAgPSAiIiAuICRjc3YtPmVycm9yX2RpYWcgKCk7CisgKCRjZGUsICRzdHIsICRwb3MsICRyZWMsICRmbGQpID0gJGNzdi0+ZXJyb3JfZGlhZyAoKTsKKworSWYgKGFuZCBvbmx5IGlmKSBhbiBlcnJvciBvY2N1cnJlZCwgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAgdGhlIGRpYWdub3N0aWNzCitvZiB0aGF0IGVycm9yLgorCitJZiBjYWxsZWQgaW4gdm9pZCBjb250ZXh0LCAgdGhpcyB3aWxsIHByaW50IHRoZSBpbnRlcm5hbCBlcnJvciBjb2RlIGFuZCB0aGUKK2Fzc29jaWF0ZWQgZXJyb3IgbWVzc2FnZSB0byBTVERFUlIuCisKK0lmIGNhbGxlZCBpbiBsaXN0IGNvbnRleHQsICB0aGlzIHdpbGwgcmV0dXJuICB0aGUgZXJyb3IgY29kZSAgYW5kIHRoZSBlcnJvcgorbWVzc2FnZSBpbiB0aGF0IG9yZGVyLiAgSWYgdGhlIGxhc3QgZXJyb3Igd2FzIGZyb20gcGFyc2luZywgdGhlIHJlc3Qgb2YgdGhlCit2YWx1ZXMgcmV0dXJuZWQgYXJlIGEgYmVzdCBndWVzcyBhdCB0aGUgbG9jYXRpb24gIHdpdGhpbiB0aGUgbGluZSAgdGhhdCB3YXMKK2JlaW5nIHBhcnNlZC4gVGhlaXIgdmFsdWVzIGFyZSAxLWJhc2VkLiAgVGhlIHBvc2l0aW9uIGN1cnJlbnRseSBpcyBpbmRleCBvZgordGhlIGJ5dGUgYXQgd2hpY2ggdGhlIHBhcnNpbmcgZmFpbGVkIGluIHRoZSBjdXJyZW50IHJlY29yZC4gSXQgbWlnaHQgY2hhbmdlCit0byBiZSB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGluIGEgbGF0ZXIgcmVsZWFzZS4gVGhlIHJlY29yZHMgaXMKK3RoZSBpbmRleCBvZiB0aGUgcmVjb3JkIHBhcnNlZCBieSB0aGUgY3N2IGluc3RhbmNlLiBUaGUgZmllbGQgbnVtYmVyIGlzIHRoZQoraW5kZXggb2YgdGhlIGZpZWxkIHRoZSBwYXJzZXIgdGhpbmtzIGl0IGlzIGN1cnJlbnRseSAgdHJ5aW5nIHRvICBwYXJzZS4gU2VlCitGPGV4YW1wbGVzL2Nzdi1jaGVjaz4gZm9yIGhvdyB0aGlzIGNhbiBiZSB1c2VkLgorCitJZiBjYWxsZWQgaW4gIHNjYWxhciBjb250ZXh0LCAgaXQgd2lsbCByZXR1cm4gIHRoZSBkaWFnbm9zdGljcyAgaW4gYSBzaW5nbGUKK3NjYWxhciwgYS1sYSBDPCQhPi4gIEl0IHdpbGwgY29udGFpbiB0aGUgZXJyb3IgY29kZSBpbiBudW1lcmljIGNvbnRleHQsIGFuZAordGhlIGRpYWdub3N0aWNzIG1lc3NhZ2UgaW4gc3RyaW5nIGNvbnRleHQuCisKK1doZW4gY2FsbGVkIGFzIGEgY2xhc3MgbWV0aG9kIG9yIGEgIGRpcmVjdCBmdW5jdGlvbiBjYWxsLCAgdGhlICBkaWFnbm9zdGljcworYXJlIHRoYXQgb2YgdGhlIGxhc3QgTDwvbmV3PiBjYWxsLgorCis9aGVhZDIgcmVjb3JkX251bWJlcgorCisgJHJlY25vID0gJGNzdi0+cmVjb3JkX251bWJlciAoKTsKKworUmV0dXJucyB0aGUgcmVjb3JkcyBwYXJzZWQgYnkgdGhpcyBjc3YgaW5zdGFuY2UuICBUaGlzIHZhbHVlIHNob3VsZCBiZSBtb3JlCithY2N1cmF0ZSB0aGFuIEM8JC4+IHdoZW4gZW1iZWRkZWQgbmV3bGluZXMgY29tZSBpbiBwbGF5LiBSZWNvcmRzIHdyaXR0ZW4gYnkKK3RoaXMgaW5zdGFuY2UgYXJlIG5vdCBjb3VudGVkLgorCis9aGVhZDIgU2V0RGlhZworCisgJGNzdi0+U2V0RGlhZyAoMCk7CisKK1VzZSB0byByZXNldCB0aGUgZGlhZ25vc3RpY3MgaWYgeW91IGFyZSBkZWFsaW5nIHdpdGggZXJyb3JzLgorCis9aGVhZDEgQURESVRJT05BTCBNRVRIT0RTCisKKz1vdmVyCisKKz1pdGVtIGJhY2tlbmQKKworUmV0dXJucyB0aGUgYmFja2VuZCBtb2R1bGUgbmFtZSBjYWxsZWQgYnkgVGV4dDo6Q1NWLgorQzxtb2R1bGU+IGlzIGFuIGFsaWFzLgorCis9aXRlbSBpc194cworCitSZXR1cm5zIHRydWUgdmFsdWUgaWYgVGV4dDo6Q1NWIHVzZXMgYW4gWFMgYmFja2VuZC4KKworPWl0ZW0gaXNfcHAKKworUmV0dXJucyB0cnVlIHZhbHVlIGlmIFRleHQ6OkNTViB1c2VzIGEgcHVyZS1QZXJsIGJhY2tlbmQuCisKKz1iYWNrCisKKz1oZWFkMSBGVU5DVElPTlMKKworVGhpcyB3aG9sZSBzZWN0aW9uIGlzIGFsc28gdGFrZW4gZnJvbSBUZXh0OjpDU1ZfWFMuCisKKz1oZWFkMiBjc3YKKworVGhpcyBmdW5jdGlvbiBpcyBub3QgZXhwb3J0ZWQgYnkgZGVmYXVsdCBhbmQgc2hvdWxkIGJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkOgorCisgdXNlIFRleHQ6OkNTViBxdyggY3N2ICk7CisKK1RoaXMgaXMgYW4gaGlnaC1sZXZlbCBmdW5jdGlvbiB0aGF0IGFpbXMgYXQgc2ltcGxlICh1c2VyKSBpbnRlcmZhY2VzLiAgVGhpcworY2FuIGJlIHVzZWQgdG8gcmVhZC9wYXJzZSBhIEM8Q1NWPiBmaWxlIG9yIHN0cmVhbSAodGhlIGRlZmF1bHQgYmVoYXZpb3IpIG9yCit0byBwcm9kdWNlIGEgZmlsZSBvciB3cml0ZSB0byBhIHN0cmVhbSAoZGVmaW5lIHRoZSAgQzxvdXQ+ICBhdHRyaWJ1dGUpLiAgSXQKK3JldHVybnMgYW4gYXJyYXktIG9yIGhhc2gtcmVmZXJlbmNlIG9uIHBhcnNpbmcgKG9yIEM8dW5kZWY+IG9uIGZhaWwpIG9yIHRoZQorbnVtZXJpYyB2YWx1ZSBvZiAgTDwvZXJyb3JfZGlhZz4gIG9uIHdyaXRpbmcuICBXaGVuIHRoaXMgZnVuY3Rpb24gZmFpbHMgeW91CitjYW4gZ2V0IHRvIHRoZSBlcnJvciB1c2luZyB0aGUgY2xhc3MgY2FsbCB0byBMPC9lcnJvcl9kaWFnPgorCisgbXkgJGFvYSA9IGNzdiAoaW4gPT4gInRlc3QuY3N2Iikgb3IKKyAgICAgZGllIFRleHQ6OkNTVi0+ZXJyb3JfZGlhZzsKKworVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgYXJndW1lbnRzIGFzIGtleS12YWx1ZSBwYWlycy4gVGhpcyBjYW4gYmUgcGFzc2VkIGFzCithIGxpc3Qgb3IgYXMgYW4gYW5vbnltb3VzIGhhc2g6CisKKyBteSAkYW9hID0gY3N2ICggIGluID0+ICJ0ZXN0LmNzdiIsIHNlcF9jaGFyID0+ICI7Iik7CisgbXkgJGFvaCA9IGNzdiAoeyBpbiA9PiAkZmgsIGhlYWRlcnMgPT4gImF1dG8iIH0pOworCitUaGUgYXJndW1lbnRzIHBhc3NlZCBjb25zaXN0IG9mIHR3byBwYXJ0czogIHRoZSBhcmd1bWVudHMgdG8gTDwvY3N2PiBpdHNlbGYKK2FuZCB0aGUgb3B0aW9uYWwgYXR0cmlidXRlcyB0byB0aGUgIEM8Q1NWPiAgb2JqZWN0IHVzZWQgaW5zaWRlIHRoZSBmdW5jdGlvbgorYXMgZW51bWVyYXRlZCBhbmQgZXhwbGFpbmVkIGluIEw8L25ldz4uCisKK0lmIG5vdCBvdmVycmlkZGVuLCB0aGUgZGVmYXVsdCBvcHRpb24gdXNlZCBmb3IgQ1NWIGlzCisKKyBhdXRvX2RpYWcgICA9PiAxCisgZXNjYXBlX251bGwgPT4gMAorCitUaGUgb3B0aW9uIHRoYXQgaXMgYWx3YXlzIHNldCBhbmQgY2Fubm90IGJlIGFsdGVyZWQgaXMKKworIGJpbmFyeSAgICAgID0+IDEKKworQXMgdGhpcyBmdW5jdGlvbiB3aWxsIGxpa2VseSBiZSB1c2VkIGluIG9uZS1saW5lcnMsICBpdCBhbGxvd3MgIEM8cXVvdGU+IHRvCitiZSBhYmJyZXZpYXRlZCBhcyBDPHF1bz4sICBhbmQgIEM8ZXNjYXBlX2NoYXI+IHRvIGJlIGFiYnJldmlhdGVkIGFzICBDPGVzYz4KK29yIEM8ZXNjYXBlPi4KKworQWx0ZXJuYXRpdmUgaW52b2NhdGlvbnM6CisKKyBteSAkYW9hID0gVGV4dDo6Q1NWOjpjc3YgKGluID0+ICJmaWxlLmNzdiIpOworCisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICgpOworIG15ICRhb2EgPSAkY3N2LT5jc3YgKGluID0+ICJmaWxlLmNzdiIpOworCitJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBvYmplY3QgYXR0cmlidXRlcyBhcmUgdXNlZCBmcm9tIHRoZSBleGlzdGluZyBvYmplY3QKK2FuZCB0aGUgYXR0cmlidXRlIGFyZ3VtZW50cyBpbiB0aGUgZnVuY3Rpb24gY2FsbCBhcmUgaWdub3JlZDoKKworIG15ICRjc3YgPSBUZXh0OjpDU1YtPm5ldyAoeyBzZXBfY2hhciA9PiAiOyIgfSk7CisgbXkgJGFvaCA9ICRjc3YtPmNzdiAoaW4gPT4gImZpbGUuY3N2IiwgYm9tID0+IDEpOworCit3aWxsIHBhcnNlIHVzaW5nIEM8Oz4gYXMgQzxzZXBfY2hhcj4sIG5vdCBDPCw+LgorCis9aGVhZDMgaW4KKworVXNlZCB0byBzcGVjaWZ5IHRoZSBzb3VyY2UuICBDPGluPiBjYW4gYmUgYSBmaWxlIG5hbWUgKGUuZy4gQzwiZmlsZS5jc3YiPiksCit3aGljaCB3aWxsIGJlICBvcGVuZWQgZm9yIHJlYWRpbmcgIGFuZCBjbG9zZWQgd2hlbiBmaW5pc2hlZCwgIGEgZmlsZSBoYW5kbGUKKyhlLmcuICBDPCRmaD4gb3IgQzxGSD4pLCAgYSByZWZlcmVuY2UgdG8gYSBnbG9iIChlLmcuIEM8XCpBUkdWPiksICB0aGUgZ2xvYgoraXRzZWxmIChlLmcuIEM8KlNURElOPiksIG9yIGEgcmVmZXJlbmNlIHRvIGEgc2NhbGFyIChlLmcuIEM8XHF7MSwyLCJjc3YifT4pLgorCitXaGVuIHVzZWQgd2l0aCBMPC9vdXQ+LCBDPGluPiBzaG91bGQgYmUgYSByZWZlcmVuY2UgdG8gYSBDU1Ygc3RydWN0dXJlIChBb0EKK29yIEFvSCkgIG9yIGEgQ09ERS1yZWYgdGhhdCByZXR1cm5zIGFuIGFycmF5LXJlZmVyZW5jZSBvciBhIGhhc2gtcmVmZXJlbmNlLgorVGhlIGNvZGUtcmVmIHdpbGwgYmUgaW52b2tlZCB3aXRoIG5vIGFyZ3VtZW50cy4KKworIG15ICRhb2EgPSBjc3YgKGluID0+ICJmaWxlLmNzdiIpOworCisgb3BlbiBteSAkZmgsICI8IiwgImZpbGUuY3N2IjsKKyBteSAkYW9hID0gY3N2IChpbiA9PiAkZmgpOworCisgbXkgJGNzdiA9IFsgW3F3KCBGb28gQmFyICldLCBbIDEsIDIgXSwgWyAyLCAzIF1dOworIG15ICRlcnIgPSBjc3YgKGluID0+ICRjc3YsIG91dCA9PiAiZmlsZS5jc3YiKTsKKworSWYgY2FsbGVkIGluIHZvaWQgY29udGV4dCB3aXRob3V0IHRoZSBMPC9vdXQ+IGF0dHJpYnV0ZSwgdGhlIHJlc3VsdGluZyByZWYKK3dpbGwgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHN1YnNlcXVlbnQgY2FsbCB0byBjc3Y6CisKKyBjc3YgKGluID0+ICJmaWxlLmNzdiIsIGZpbHRlciA9PiB7IDIgPT4gc3ViIHsgbGVuZ3RoID4gMiB9fSkKKword2lsbCBiZSBhIHNob3J0Y3V0IHRvCisKKyBjc3YgKGluID0+IGNzdiAoaW4gPT4gImZpbGUuY3N2IiwgZmlsdGVyID0+IHsgMiA9PiBzdWIgeyBsZW5ndGggPiAyIH19KSkKKword2hlcmUsIGluIHRoZSBhYnNlbmNlIG9mIHRoZSBDPG91dD4gYXR0cmlidXRlLCB0aGlzIGlzIGEgc2hvcnRjdXQgdG8KKworIGNzdiAoaW4gID0+IGNzdiAoaW4gPT4gImZpbGUuY3N2IiwgZmlsdGVyID0+IHsgMiA9PiBzdWIgeyBsZW5ndGggPiAyIH19KSwKKyAgICAgIG91dCA9PiAqU1RET1VUKQorCis9aGVhZDMgb3V0CisKK0luIG91dHB1dCBtb2RlLCB0aGUgZGVmYXVsdCBDU1Ygb3B0aW9ucyB3aGVuIHByb2R1Y2luZyBDU1YgYXJlCisKKyBlb2wgICAgICAgPT4gIlxyXG4iCisKK1RoZSBMPC9mcmFnbWVudD4gYXR0cmlidXRlIGlzIGlnbm9yZWQgaW4gb3V0cHV0IG1vZGUuCisKK0M8b3V0PiBjYW4gYmUgYSBmaWxlIG5hbWUgIChlLmcuICBDPCJmaWxlLmNzdiI+KSwgIHdoaWNoIHdpbGwgYmUgb3BlbmVkIGZvcgord3JpdGluZyBhbmQgY2xvc2VkIHdoZW4gZmluaXNoZWQsICBhIGZpbGUgaGFuZGxlIChlLmcuIEM8JGZoPiBvciBDPEZIPiksICBhCityZWZlcmVuY2UgdG8gYSBnbG9iIChlLmcuIEM8XCpTVERPVVQ+KSwgb3IgdGhlIGdsb2IgaXRzZWxmIChlLmcuIEM8KlNURE9VVD4pLgorCisgY3N2IChpbiA9PiBzdWIgeyAkc3RoLT5mZXRjaCB9LCAgICAgICAgICAgIG91dCA9PiAiZHVtcC5jc3YiKTsKKyBjc3YgKGluID0+IHN1YiB7ICRzdGgtPmZldGNocm93X2hhc2hyZWYgfSwgb3V0ID0+ICJkdW1wLmNzdiIsCisgICAgICBoZWFkZXJzID0+ICRzdGgtPntOQU1FX2xjfSk7CisKK1doZW4gYSBjb2RlLXJlZiBpcyB1c2VkIGZvciBDPGluPiwgdGhlIG91dHB1dCBpcyBnZW5lcmF0ZWQgIHBlciBpbnZvY2F0aW9uLAorc28gbm8gYnVmZmVyaW5nIGlzIGludm9sdmVkLiBUaGlzIGltcGxpZXMgdGhhdCB0aGVyZSBpcyBubyBzaXplIHJlc3RyaWN0aW9uCitvbiB0aGUgbnVtYmVyIG9mIHJlY29yZHMuIFRoZSBDPGNzdj4gZnVuY3Rpb24gZW5kcyB3aGVuIHRoZSBjb2RlcmVmIHJldHVybnMKK2EgZmFsc2UgdmFsdWUuCisKKz1oZWFkMyBlbmNvZGluZworCitJZiBwYXNzZWQsICBpdCBzaG91bGQgYmUgYW4gZW5jb2RpbmcgYWNjZXB0ZWQgYnkgdGhlICBDPDplbmNvZGluZygpPiBvcHRpb24KK3RvIEM8b3Blbj4uIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuIFRoaXMgYXR0cmlidXRlIGRvZXMgbm90IHdvcmsgaW4gcGVybAorNS42LnguICBDPGVuY29kaW5nPiBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gQzxlbmM+IGZvciBlYXNlIG9mIHVzZSBpbiBjb21tYW5kCitsaW5lIGludm9jYXRpb25zLgorCitJZiBDPGVuY29kaW5nPiBpcyBzZXQgdG8gdGhlIGxpdGVyYWwgdmFsdWUgQzwiYXV0byI+LCB0aGUgbWV0aG9kIEw8L2hlYWRlcj4KK3dpbGwgYmUgaW52b2tlZCBvbiB0aGUgb3BlbmVkIHN0cmVhbSB0byBjaGVjayBpZiB0aGVyZSBpcyBhIEJPTSBhbmQgc2V0IHRoZQorZW5jb2RpbmcgYWNjb3JkaW5nbHkuICAgVGhpcyBpcyBlcXVhbCB0byBwYXNzaW5nIGEgdHJ1ZSB2YWx1ZSBpbiB0aGUgb3B0aW9uCitMPEM8ZGV0ZWN0X2JvbT58L2RldGVjdF9ib20+LgorCis9aGVhZDMgZGV0ZWN0X2JvbQorCitJZiAgQzxkZXRlY3RfYm9tPiAgaXMgZ2l2ZW4sIHRoZSBtZXRob2QgIEw8L2hlYWRlcj4gIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUKK29wZW5lZCBzdHJlYW0gdG8gY2hlY2sgaWYgdGhlcmUgaXMgYSBCT00gYW5kIHNldCB0aGUgZW5jb2RpbmcgYWNjb3JkaW5nbHkuCisKK0M8ZGV0ZWN0X2JvbT4gY2FuIGJlIGFiYnJldmlhdGVkIHRvIEM8Ym9tPi4KKworVGhpcyBpcyB0aGUgc2FtZSBhcyBzZXR0aW5nIEw8QzxlbmNvZGluZz58L2VuY29kaW5nPiB0byBDPCJhdXRvIj4uCisKK05vdGUgdGhhdCBhcyBMPC9oZWFkZXI+IGlzIGludm9rZWQsIGl0cyBkZWZhdWx0IGlzIHRvIGFsc28gc2V0IHRoZSBoZWFkZXJzLgorCis9aGVhZDMgaGVhZGVycworCitJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgZ2l2ZW4sIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHByb2R1Y2UgYW4gYXJyYXkKK29mIGFycmF5cy4KKworSWYgQzxoZWFkZXJzPiBpcyBzdXBwbGllZCwgIGl0IHNob3VsZCBiZSBhbiBhbm9ueW1vdXMgbGlzdCBvZiBjb2x1bW4gbmFtZXMsCithbiBhbm9ueW1vdXMgaGFzaHJlZiwgYSBjb2RlcmVmLCBvciBhIGxpdGVyYWwgZmxhZzogIEM8YXV0bz4sIEM8bGM+LCBDPHVjPiwKK29yIEM8c2tpcD4uCisKKz1vdmVyIDIKKworPWl0ZW0gc2tpcAorCitXaGVuIEM8c2tpcD4gaXMgdXNlZCwgdGhlIGhlYWRlciB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgorCisgbXkgJGFvYSA9IGNzdiAoaW4gPT4gJGZoLCBoZWFkZXJzID0+ICJza2lwIik7CisKKz1pdGVtIGF1dG8KKworSWYgQzxhdXRvPiBpcyB1c2VkLCB0aGUgZmlyc3QgbGluZSBvZiB0aGUgQzxDU1Y+IHNvdXJjZSB3aWxsIGJlIHJlYWQgYXMgdGhlCitsaXN0IG9mIGZpZWxkIGhlYWRlcnMgYW5kIHVzZWQgdG8gcHJvZHVjZSBhbiBhcnJheSBvZiBoYXNoZXMuCisKKyBteSAkYW9oID0gY3N2IChpbiA9PiAkZmgsIGhlYWRlcnMgPT4gImF1dG8iKTsKKworPWl0ZW0gbGMKKworSWYgQzxsYz4gaXMgdXNlZCwgIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSAgQzxDU1Y+IHNvdXJjZSB3aWxsIGJlIHJlYWQgYXMgdGhlCitsaXN0IG9mIGZpZWxkIGhlYWRlcnMgbWFwcGVkIHRvICBsb3dlciBjYXNlIGFuZCB1c2VkIHRvIHByb2R1Y2UgYW4gYXJyYXkgb2YKK2hhc2hlcy4gVGhpcyBpcyBhIHZhcmlhdGlvbiBvZiBDPGF1dG8+LgorCisgbXkgJGFvaCA9IGNzdiAoaW4gPT4gJGZoLCBoZWFkZXJzID0+ICJsYyIpOworCis9aXRlbSB1YworCitJZiBDPHVjPiBpcyB1c2VkLCAgdGhlIGZpcnN0IGxpbmUgb2YgdGhlICBDPENTVj4gc291cmNlIHdpbGwgYmUgcmVhZCBhcyB0aGUKK2xpc3Qgb2YgZmllbGQgaGVhZGVycyBtYXBwZWQgdG8gIHVwcGVyIGNhc2UgYW5kIHVzZWQgdG8gcHJvZHVjZSBhbiBhcnJheSBvZgoraGFzaGVzLiBUaGlzIGlzIGEgdmFyaWF0aW9uIG9mIEM8YXV0bz4uCisKKyBteSAkYW9oID0gY3N2IChpbiA9PiAkZmgsIGhlYWRlcnMgPT4gInVjIik7CisKKz1pdGVtIENPREUKKworSWYgYSBjb2RlcmVmIGlzIHVzZWQsICB0aGUgZmlyc3QgbGluZSBvZiB0aGUgIEM8Q1NWPiBzb3VyY2Ugd2lsbCBiZSByZWFkIGFzCit0aGUgbGlzdCBvZiBtYW5nbGVkIGZpZWxkIGhlYWRlcnMgaW4gd2hpY2ggZWFjaCBmaWVsZCBpcyBwYXNzZWQgYXMgdGhlIG9ubHkKK2FyZ3VtZW50IHRvIHRoZSBjb2RlcmVmLiBUaGlzIGxpc3QgaXMgdXNlZCB0byBwcm9kdWNlIGFuIGFycmF5IG9mIGhhc2hlcy4KKworIG15ICRhb2ggPSBjc3YgKGluICAgICAgPT4gJGZoLAorICAgICAgICAgICAgICAgIGhlYWRlcnMgPT4gc3ViIHsgbGMgKCRfWzBdKSA9fiBzL2tvZGUvY29kZS9nciB9KTsKKwordGhpcyBleGFtcGxlIGlzIGEgdmFyaWF0aW9uIG9mIHVzaW5nIEM8bGM+IHdoZXJlIGFsbCBvY2N1cnJlbmNlcyBvZiBDPGtvZGU+CithcmUgcmVwbGFjZWQgd2l0aCBDPGNvZGU+LgorCis9aXRlbSBBUlJBWQorCitJZiAgQzxoZWFkZXJzPiAgaXMgYW4gYW5vbnltb3VzIGxpc3QsICB0aGUgZW50cmllcyBpbiB0aGUgbGlzdCB3aWxsIGJlIHVzZWQKK2FzIGZpZWxkIG5hbWVzLiBUaGUgZmlyc3QgbGluZSBpcyBjb25zaWRlcmVkIGRhdGEgaW5zdGVhZCBvZiBoZWFkZXJzLgorCisgbXkgJGFvaCA9IGNzdiAoaW4gPT4gJGZoLCBoZWFkZXJzID0+IFtxdyggRm9vIEJhciApXSk7CisgY3N2IChpbiA9PiAkYW9hLCBvdXQgPT4gJGZoLCBoZWFkZXJzID0+IFtxdyggY29kZSBkZXNjcmlwdGlvbiBwcmljZSApXSk7CisKKz1pdGVtIEhBU0gKKworSWYgQzxoZWFkZXJzPiBpcyBhbiBoYXNoIHJlZmVyZW5jZSwgdGhpcyBpbXBsaWVzIEM8YXV0bz4sIGJ1dCBoZWFkZXIgZmllbGRzCitmb3IgdGhhdCBleGlzdCBhcyBrZXkgaW4gdGhlIGhhc2hyZWYgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdmFsdWUgZm9yIHRoYXQKK2tleS4gR2l2ZW4gYSBDU1YgZmlsZSBsaWtlCisKKyBwb3N0LWtvZGUsY2l0eSxuYW1lLGlkIG51bWJlcixmdWJibGUKKyAxMjM0QUEsRHVja3N0YWQsRG9uYWxkLDEzLCJYMzEzREYiCisKK3VzaW5nCisKKyBjc3YgKGhlYWRlcnMgPT4geyAicG9zdC1rb2RlIiA9PiAicGMiLCAiaWQgbnVtYmVyIiA9PiAiSUQiIH0sIC4uLgorCit3aWxsIHJldHVybiBhbiBlbnRyeSBsaWtlCisKKyB7IHBjICAgICA9PiAiMTIzNEFBIiwKKyAgIGNpdHkgICA9PiAiRHVja3N0YWQiLAorICAgbmFtZSAgID0+ICJEb25hbGQiLAorICAgSUQgICAgID0+ICIxMyIsCisgICBmdWJibGUgPT4gIlgzMTNERiIsCisgICB9CisKKz1iYWNrCisKK1NlZSBhbHNvIEw8QzxtdW5nZV9jb2x1bW5fbmFtZXM+fC9tdW5nZV9jb2x1bW5fbmFtZXM+IGFuZAorTDxDPHNldF9jb2x1bW5fbmFtZXM+fC9zZXRfY29sdW1uX25hbWVzPi4KKworPWhlYWQzIG11bmdlX2NvbHVtbl9uYW1lcworCitJZiBDPG11bmdlX2NvbHVtbl9uYW1lcz4gaXMgc2V0LCAgdGhlIG1ldGhvZCAgTDwvaGVhZGVyPiAgaXMgaW52b2tlZCBvbiB0aGUKK29wZW5lZCBzdHJlYW0gd2l0aCBhbGwgbWF0Y2hpbmcgYXJndW1lbnRzIHRvIGRldGVjdCBhbmQgc2V0IHRoZSBoZWFkZXJzLgorCitDPG11bmdlX2NvbHVtbl9uYW1lcz4gY2FuIGJlIGFiYnJldmlhdGVkIHRvIEM8bXVuZ2U+LgorCis9aGVhZDMga2V5CisKK0lmIHBhc3NlZCwgIHdpbGwgZGVmYXVsdCAgTDxDPGhlYWRlcnM+fC9oZWFkZXJzPiAgdG8gQzwiYXV0byI+IGFuZCByZXR1cm4gYQoraGFzaHJlZiBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIGhhc2hlcy4KKworIG15ICRyZWYgPSBjc3YgKGluID0+ICJ0ZXN0LmNzdiIsIGtleSA9PiAiY29kZSIpOworCit3aXRoIHRlc3QuY3N2IGxpa2UKKworIGNvZGUscHJvZHVjdCxwcmljZSxjb2xvcgorIDEscGMsODUwLGdyYXkKKyAyLGtleWJvYXJkLDEyLHdoaXRlCisgMyxtb3VzZSw1LGJsYWNrCisKK3dpbGwgcmV0dXJuCisKKyAgeyAxICAgPT4geworICAgICAgICBjb2RlICAgID0+IDEsCisgICAgICAgIGNvbG9yICAgPT4gJ2dyYXknLAorICAgICAgICBwcmljZSAgID0+IDg1MCwKKyAgICAgICAgcHJvZHVjdCA9PiAncGMnCisgICAgICAgIH0sCisgICAgMiAgID0+IHsKKyAgICAgICAgY29kZSAgICA9PiAyLAorICAgICAgICBjb2xvciAgID0+ICd3aGl0ZScsCisgICAgICAgIHByaWNlICAgPT4gMTIsCisgICAgICAgIHByb2R1Y3QgPT4gJ2tleWJvYXJkJworICAgICAgICB9LAorICAgIDMgICA9PiB7CisgICAgICAgIGNvZGUgICAgPT4gMywKKyAgICAgICAgY29sb3IgICA9PiAnYmxhY2snLAorICAgICAgICBwcmljZSAgID0+IDUsCisgICAgICAgIHByb2R1Y3QgPT4gJ21vdXNlJworICAgICAgICB9CisgICAgfQorCis9aGVhZDMgZnJhZ21lbnQKKworT25seSBvdXRwdXQgdGhlIGZyYWdtZW50IGFzIGRlZmluZWQgaW4gdGhlIEw8L2ZyYWdtZW50PiBtZXRob2QuIFRoaXMgb3B0aW9uCitpcyBpZ25vcmVkIHdoZW4gSTxnZW5lcmF0aW5nPiBDPENTVj4uIFNlZSBMPC9vdXQ+LgorCitDb21iaW5pbmcgYWxsIG9mIHRoZW0gY291bGQgZ2l2ZSBzb21ldGhpbmcgbGlrZQorCisgdXNlIFRleHQ6OkNTViBxdyggY3N2ICk7CisgbXkgJGFvaCA9IGNzdiAoCisgICAgIGluICAgICAgID0+ICJ0ZXN0LnR4dCIsCisgICAgIGVuY29kaW5nID0+ICJ1dGYtOCIsCisgICAgIGhlYWRlcnMgID0+ICJhdXRvIiwKKyAgICAgc2VwX2NoYXIgPT4gInwiLAorICAgICBmcmFnbWVudCA9PiAicm93PTM7Ni05OzE1LSoiLAorICAgICApOworIHNheSAkYW9oLT5bMTVde0Zvb307CisKKz1oZWFkMyBzZXBfc2V0CisKK0lmIEM8c2VwX3NldD4gaXMgc2V0LCB0aGUgbWV0aG9kIEw8L2hlYWRlcj4gaXMgaW52b2tlZCBvbiB0aGUgb3BlbmVkIHN0cmVhbQordG8gZGV0ZWN0IGFuZCBzZXQgTDxDPHNlcF9jaGFyPnwvc2VwX2NoYXI+IHdpdGggdGhlIGdpdmVuIHNldC4KKworQzxzZXBfc2V0PiBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gQzxzZXBzPi4KKworTm90ZSB0aGF0IGFzIEw8L2hlYWRlcj4gaXMgaW52b2tlZCwgaXRzIGRlZmF1bHQgaXMgdG8gYWxzbyBzZXQgdGhlIGhlYWRlcnMuCisKKz1oZWFkMyBzZXRfY29sdW1uX25hbWVzCisKK0lmICBDPHNldF9jb2x1bW5fbmFtZXM+IGlzIHBhc3NlZCwgIHRoZSBtZXRob2QgTDwvaGVhZGVyPiBpcyBpbnZva2VkIG9uIHRoZQorb3BlbmVkIHN0cmVhbSB3aXRoIGFsbCBhcmd1bWVudHMgbWVhbnQgZm9yIEw8L2hlYWRlcj4uCisKKz1oZWFkMiBDYWxsYmFja3MKKworQ2FsbGJhY2tzIGVuYWJsZSBhY3Rpb25zIHRyaWdnZXJlZCBmcm9tIHRoZSBJPGluc2lkZT4gb2YgVGV4dDo6Q1NWLgorCitXaGlsZSBtb3N0IG9mIHdoYXQgdGhpcyBlbmFibGVzICBjYW4gZWFzaWx5IGJlIGRvbmUgaW4gYW4gIHVucm9sbGVkIGxvb3AgYXMKK2Rlc2NyaWJlZCBpbiB0aGUgTDwvU1lOT1BTSVM+IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCB0byBtZWV0IHNwZWNpYWwgZGVtYW5kcworb3IgZW5oYW5jZSB0aGUgTDwvY3N2PiBmdW5jdGlvbi4KKworPW92ZXIgMgorCis9aXRlbSBlcnJvcgorCisgJGNzdi0+Y2FsbGJhY2tzIChlcnJvciA9PiBzdWIgeyAkY3N2LT5TZXREaWFnICgwKSB9KTsKKwordGhlIEM8ZXJyb3I+ICBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYW4gZXJyb3Igb2NjdXJzLCAgYnV0ICBJPG9ubHk+ICB3aGVuCitMPC9hdXRvX2RpYWc+IGlzIHNldCB0byBhIHRydWUgdmFsdWUuIEEgY2FsbGJhY2sgaXMgaW52b2tlZCB3aXRoIHRoZSB2YWx1ZXMKK3JldHVybmVkIGJ5IEw8L2Vycm9yX2RpYWc+OgorCisgbXkgKCRjLCAkcyk7CisKKyBzdWIgaWdub3JlMzAwNgorIHsKKyAgICAgbXkgKCRlcnIsICRtc2csICRwb3MsICRyZWNubywgJGZsZG5vKSA9IEBfOworICAgICBpZiAoJGVyciA9PSAzMDA2KSB7CisgICAgICAgICAjIGlnbm9yZSB0aGlzIGVycm9yCisgICAgICAgICAoJGMsICRzKSA9ICh1bmRlZiwgdW5kZWYpOworICAgICAgICAgVGV4dDo6Q1NWLT5TZXREaWFnICgwKTsKKyAgICAgICAgIH0KKyAgICAgIyBBbnkgb3RoZXIgZXJyb3IKKyAgICAgcmV0dXJuOworICAgICB9ICMgaWdub3JlMzAwNgorCisgJGNzdi0+Y2FsbGJhY2tzIChlcnJvciA9PiBcJmlnbm9yZTMwMDYpOworICRjc3YtPmJpbmRfY29sdW1ucyAoXCRjLCBcJHMpOworIHdoaWxlICgkY3N2LT5nZXRsaW5lICgkZmgpKSB7CisgICAgICMgRXJyb3IgMzAwNiB3aWxsIG5vdCBzdG9wIHRoZSBsb29wCisgICAgIH0KKworPWl0ZW0gYWZ0ZXJfcGFyc2UKKworICRjc3YtPmNhbGxiYWNrcyAoYWZ0ZXJfcGFyc2UgPT4gc3ViIHsgcHVzaCBAeyRfWzFdfSwgIk5FVyIgfSk7Cisgd2hpbGUgKG15ICRyb3cgPSAkY3N2LT5nZXRsaW5lICgkZmgpKSB7CisgICAgICRyb3ctPlstMV0gZXEgIk5FVyI7CisgICAgIH0KKworVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGFmdGVyIHBhcnNpbmcgd2l0aCAgTDwvZ2V0bGluZT4gIG9ubHkgaWYgbm8gIGVycm9yCitvY2N1cnJlZC4gIFRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogICB0aGUgY3VycmVudCBDPENTVj4KK3BhcnNlciBvYmplY3QgYW5kIGFuIGFycmF5IHJlZmVyZW5jZSB0byB0aGUgZmllbGRzIHBhcnNlZC4KKworVGhlIHJldHVybiBjb2RlIG9mIHRoZSBjYWxsYmFjayBpcyBpZ25vcmVkICB1bmxlc3MgaXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlCitzdHJpbmcgInNraXAiLCBpbiB3aGljaCBjYXNlIHRoZSByZWNvcmQgd2lsbCBiZSBza2lwcGVkIGluIEw8L2dldGxpbmVfYWxsPi4KKworIHN1YiBhZGRfZnJvbV9kYgorIHsKKyAgICAgbXkgKCRjc3YsICRyb3cpID0gQF87CisgICAgICRzdGgtPmV4ZWN1dGUgKCRyb3ctPls0XSk7CisgICAgIHB1c2ggQCRyb3csICRzdGgtPmZldGNocm93X2FycmF5OworICAgICB9ICMgYWRkX2Zyb21fZGIKKworIG15ICRhb2EgPSBjc3YgKGluID0+ICJmaWxlLmNzdiIsIGNhbGxiYWNrcyA9PiB7CisgICAgIGFmdGVyX3BhcnNlID0+IFwmYWRkX2Zyb21fZGIgfSk7CisKK1RoaXMgaG9vayBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbjoKKworPW92ZXIgMgorCis9aXRlbSBGQUlMCisKK0RpZSBpZiBhbnkgb2YgdGhlIHJlY29yZHMgZG9lcyBub3QgdmFsaWRhdGUgYSBydWxlOgorCisgYWZ0ZXJfcGFyc2UgPT4gc3ViIHsKKyAgICAgJF9bMV1bNF0gPX4gbS9eWzAtOV17NH1ccz9bQS1aXXsyfSQvIG9yCisgICAgICAgICBkaWUgIjV0aCBmaWVsZCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgRHV0Y2ggemlwY29kZSI7CisgICAgIH0KKworPWl0ZW0gREVGQVVMVAorCitSZXBsYWNlIGludmFsaWQgZmllbGRzIHdpdGggYSBkZWZhdWx0IHZhbHVlOgorCisgYWZ0ZXJfcGFyc2UgPT4gc3ViIHsgJF9bMV1bMl0gPX4gbS9eXGQrJC8gb3IgJF9bMV1bMl0gPSAwIH0KKworPWl0ZW0gU0tJUAorCitTa2lwIHJlY29yZHMgdGhhdCBoYXZlIGludmFsaWQgZmllbGRzIChvbmx5IGFwcGxpZXMgdG8gTDwvZ2V0bGluZV9hbGw+KToKKworIGFmdGVyX3BhcnNlID0+IHN1YiB7ICRfWzFdWzBdID1+IG0vXlxkKyQvIG9yIHJldHVybiBcInNraXAiOyB9CisKKz1iYWNrCisKKz1pdGVtIGJlZm9yZV9wcmludAorCisgbXkgJGlkeCA9IDE7CisgJGNzdi0+Y2FsbGJhY2tzIChiZWZvcmVfcHJpbnQgPT4gc3ViIHsgJF9bMV1bMF0gPSAkaWR4KysgfSk7CisgJGNzdi0+cHJpbnQgKCpTVERPVVQsIFsgMCwgJF8gXSkgZm9yIEBtZW1iZXJzOworCitUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgIGJlZm9yZSBwcmludGluZyB3aXRoICBMPC9wcmludD4gIG9ubHkgaWYgbm8gZXJyb3IKK29jY3VycmVkLiAgVGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAgdGhlIGN1cnJlbnQgIEM8Q1NWPgorcGFyc2VyIG9iamVjdCBhbmQgYW4gYXJyYXkgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZHMgcGFzc2VkLgorCitUaGUgcmV0dXJuIGNvZGUgb2YgdGhlIGNhbGxiYWNrIGlzIGlnbm9yZWQuCisKKyBzdWIgbWF4XzRfZmllbGRzCisgeworICAgICBteSAoJGNzdiwgJHJvdykgPSBAXzsKKyAgICAgQCRyb3cgPiA0IGFuZCBzcGxpY2UgQCRyb3csIDQ7CisgICAgIH0gIyBtYXhfNF9maWVsZHMKKworIGNzdiAoaW4gPT4gY3N2IChpbiA9PiAiZmlsZS5jc3YiKSwgb3V0ID0+ICpTVERPVVQsCisgICAgIGNhbGxiYWNrcyA9PiB7IGJlZm9yZSBwcmludCA9PiBcJm1heF80X2ZpZWxkcyB9KTsKKworVGhpcyBjYWxsYmFjayBpcyBub3QgYWN0aXZlIGZvciBMPC9jb21iaW5lPi4KKworPWJhY2sKKworPWhlYWQzIENhbGxiYWNrcyBmb3IgY3N2ICgpCisKK1RoZSBMPC9jc3Y+IGFsbG93cyBmb3Igc29tZSBjYWxsYmFja3MgdGhhdCBkbyBub3QgaW50ZWdyYXRlIGluIFhTIGludGVybmFscworYnV0IG9ubHkgZmVhdHVyZSB0aGUgTDwvY3N2PiBmdW5jdGlvbi4KKworICBjc3YgKGluICAgICAgICA9PiAiZmlsZS5jc3YiLAorICAgICAgIGNhbGxiYWNrcyA9PiB7CisgICAgICAgICAgIGZpbHRlciAgICAgICA9PiB7IDYgPT4gc3ViIHsgJF8gPiAxNSB9IH0sICAgICMgZmlyc3QKKyAgICAgICAgICAgYWZ0ZXJfcGFyc2UgID0+IHN1YiB7IHNheSAiQUZURVIgUEFSU0UiOyAgfSwgIyBmaXJzdAorICAgICAgICAgICBhZnRlcl9pbiAgICAgPT4gc3ViIHsgc2F5ICJBRlRFUiBJTiI7ICAgICB9LCAjIHNlY29uZAorICAgICAgICAgICBvbl9pbiAgICAgICAgPT4gc3ViIHsgc2F5ICJPTiBJTiI7ICAgICAgICB9LCAjIHRoaXJkCisgICAgICAgICAgIH0sCisgICAgICAgKTsKKworICBjc3YgKGluICAgICAgICA9PiAkYW9oLAorICAgICAgIG91dCAgICAgICA9PiAiZmlsZS5jc3YiLAorICAgICAgIGNhbGxiYWNrcyA9PiB7CisgICAgICAgICAgIG9uX2luICAgICAgICA9PiBzdWIgeyBzYXkgIk9OIElOIjsgICAgICAgIH0sICMgZmlyc3QKKyAgICAgICAgICAgYmVmb3JlX291dCAgID0+IHN1YiB7IHNheSAiQkVGT1JFIE9VVCI7ICAgfSwgIyBzZWNvbmQKKyAgICAgICAgICAgYmVmb3JlX3ByaW50ID0+IHN1YiB7IHNheSAiQkVGT1JFIFBSSU5UIjsgfSwgIyB0aGlyZAorICAgICAgICAgICB9LAorICAgICAgICk7CisKKz1vdmVyIDIKKworPWl0ZW0gZmlsdGVyCisKK1RoaXMgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gZmlsdGVyIHJlY29yZHMuICBJdCBpcyBjYWxsZWQganVzdCBhZnRlciBhIG5ldworcmVjb3JkIGhhcyBiZWVuIHNjYW5uZWQuICBUaGUgY2FsbGJhY2sgYWNjZXB0cyBhIGhhc2hyZWYgd2hlcmUgdGhlIGtleXMgYXJlCit0aGUgaW5kZXggdG8gdGhlIHJvdyAodGhlIGZpZWxkIG51bWJlciwgMS1iYXNlZCkgYW5kIHRoZSB2YWx1ZXMgYXJlIHN1YnMgdG8KK3JldHVybiBhIHRydWUgb3IgZmFsc2UgdmFsdWUuCisKKyBjc3YgKGluID0+ICJmaWxlLmNzdiIsIGZpbHRlciA9PiB7CisgICAgICAgICAgICAzID0+IHN1YiB7IG0vYS8gfSwgICAgICAgIyB0aGlyZCBmaWVsZCBzaG91bGQgY29udGFpbiBhbiAiYSIKKyAgICAgICAgICAgIDUgPT4gc3ViIHsgbGVuZ3RoID4gNCB9LCAjIGxlbmd0aCBvZiB0aGUgNXRoIGZpZWxkIG1pbmltYWwgNQorICAgICAgICAgICAgfSk7CisKKyBjc3YgKGluID0+ICJmaWxlLmNzdiIsIGZpbHRlciA9PiAibm90X2JsYW5rIik7CisgY3N2IChpbiA9PiAiZmlsZS5jc3YiLCBmaWx0ZXIgPT4gIm5vdF9lbXB0eSIpOworIGNzdiAoaW4gPT4gImZpbGUuY3N2IiwgZmlsdGVyID0+ICJmaWxsZWQiKTsKKworSWYgdGhlIGtleXMgdG8gdGhlIGZpbHRlciBoYXNoIGNvbnRhaW4gYW55IGNoYXJhY3RlciB0aGF0IGlzIG5vdCBhIGRpZ2l0IGl0Cit3aWxsIGFsc28gaW1wbGljaXRseSBzZXQgTDwvaGVhZGVycz4gdG8gQzwiYXV0byI+ICB1bmxlc3MgIEw8L2hlYWRlcnM+ICB3YXMKK2FscmVhZHkgcGFzc2VkIGFzIGFyZ3VtZW50LiAgV2hlbiBoZWFkZXJzIGFyZSBhY3RpdmUsIHJldHVybmluZyBhbiBhcnJheSBvZgoraGFzaGVzLCB0aGUgZmlsdGVyIGlzIG5vdCBhcHBsaWNhYmxlIHRvIHRoZSBoZWFkZXIgaXRzZWxmLgorCisgY3N2IChpbiA9PiAiZmlsZS5jc3YiLCBmaWx0ZXIgPT4geyBmb28gPT4gc3ViIHsgJF8gPiA0IH19KTsKKworQWxsIHN1YiByZXN1bHRzIHNob3VsZCBtYXRjaCwgYXMgaW4gQU5ELgorCitUaGUgY29udGV4dCBvZiB0aGUgY2FsbGJhY2sgc2V0cyAgQzwkXz4gbG9jYWxpemVkIHRvIHRoZSBmaWVsZCBpbmRpY2F0ZWQgYnkKK3RoZSBmaWx0ZXIuIFRoZSB0d28gYXJndW1lbnRzIGFyZSBhcyB3aXRoIGFsbCBvdGhlciBjYWxsYmFja3MsIHNvIHRoZSBvdGhlcgorZmllbGRzIGluIHRoZSBjdXJyZW50IHJvdyBjYW4gYmUgc2VlbjoKKworIGZpbHRlciA9PiB7IDMgPT4gc3ViIHsgJF8gPiAxMDAgPyAkX1sxXVsxXSA9fiBtL0EvIDogJF9bMV1bNl0gPX4gbS9CLyB9fQorCitJZiB0aGUgY29udGV4dCBpcyBzZXQgdG8gcmV0dXJuIGEgbGlzdCBvZiBoYXNoZXMgIChMPC9oZWFkZXJzPiBpcyBkZWZpbmVkKSwKK3RoZSBjdXJyZW50IHJlY29yZCB3aWxsIGFsc28gYmUgYXZhaWxhYmxlIGluIHRoZSBsb2NhbGl6ZWQgQzwlXz46CisKKyBmaWx0ZXIgPT4geyAzID0+IHN1YiB7ICRfID4gMTAwICYmICRfe2Zvb30gPX4gbS9BLyAmJiAkX3tiYXJ9IDwgMTAwMCAgfX0KKworSWYgdGhlIGZpbHRlciBpcyB1c2VkIHRvIEk8YWx0ZXI+IHRoZSBjb250ZW50IGJ5IGNoYW5naW5nIEM8JF8+LCAgbWFrZSBzdXJlCit0aGF0IHRoZSBzdWIgcmV0dXJucyB0cnVlIGluIG9yZGVyIG5vdCB0byBoYXZlIHRoYXQgcmVjb3JkIHNraXBwZWQ6CisKKyBmaWx0ZXIgPT4geyAyID0+IHN1YiB7ICRfID0gdWMgfX0KKword2lsbCB1cHBlci1jYXNlIHRoZSBzZWNvbmQgZmllbGQsIGFuZCB0aGVuIHNraXAgaXQgaWYgdGhlIHJlc3VsdGluZyBjb250ZW50CitldmFsdWF0ZXMgdG8gZmFsc2UuIFRvIGFsd2F5cyBhY2NlcHQsIGVuZCB3aXRoIHRydXRoOgorCisgZmlsdGVyID0+IHsgMiA9PiBzdWIgeyAkXyA9IHVjOyAxIH19CisKK0I8UHJlZGVmaW5lZCBmaWx0ZXJzPgorCitHaXZlbiBhIGZpbGUgbGlrZSAobGluZSBudW1iZXJzIHByZWZpeGVkIGZvciBkb2MgcHVycG9zZSBvbmx5KToKKworIDE6MSwyLDMKKyAyOgorIDM6LAorIDQ6IiIKKyA1OiwsCisgNjosICwKKyA3OiIiLAorIDg6IiAiCisgOTo0LDUsNgorCis9b3ZlciAyCisKKz1pdGVtIG5vdF9ibGFuaworCitGaWx0ZXIgb3V0IHRoZSBibGFuayBsaW5lcworCitUaGlzIGZpbHRlciBpcyBhIHNob3J0Y3V0IGZvcgorCisgZmlsdGVyID0+IHsgMCA9PiBzdWIgeyBAeyRfWzFdfSA+IDEgb3IKKyAgICAgICAgICAgICBkZWZpbmVkICRfWzFdWzBdICYmICRfWzFdWzBdIG5lICIiIH0gfQorCitEdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uLCAgaXQgaXMgY3VycmVudGx5IGltcG9zc2libGUgdG8gYWxzbyBmaWx0ZXIgbGluZXMKK3RoYXQgY29uc2lzdHMgb25seSBvZiBhIHF1b3RlZCBlbXB0eSBmaWVsZC4gVGhlc2UgbGluZXMgYXJlIGFsc28gY29uc2lkZXJlZAorYmxhbmsgbGluZXMuCisKK1dpdGggdGhlIGdpdmVuIGV4YW1wbGUsIGxpbmVzIDIgYW5kIDQgd2lsbCBiZSBza2lwcGVkLgorCis9aXRlbSBub3RfZW1wdHkKKworRmlsdGVyIG91dCBsaW5lcyB3aGVyZSBhbGwgdGhlIGZpZWxkcyBhcmUgZW1wdHkuCisKK1RoaXMgZmlsdGVyIGlzIGEgc2hvcnRjdXQgZm9yCisKKyBmaWx0ZXIgPT4geyAwID0+IHN1YiB7IGdyZXAgeyBkZWZpbmVkICYmICRfIG5lICIiIH0gQHskX1sxXX0gfSB9CisKK0Egc3BhY2UgaXMgbm90IHJlZ2FyZGVkIGJlaW5nIGVtcHR5LCBzbyBnaXZlbiB0aGUgZXhhbXBsZSBkYXRhLCBsaW5lcyAyLCAzLAorNCwgNSwgYW5kIDcgYXJlIHNraXBwZWQuCisKKz1pdGVtIGZpbGxlZAorCitGaWx0ZXIgb3V0IGxpbmVzIHRoYXQgaGF2ZSBubyB2aXNpYmxlIGRhdGEKKworVGhpcyBmaWx0ZXIgaXMgYSBzaG9ydGN1dCBmb3IKKworIGZpbHRlciA9PiB7IDAgPT4gc3ViIHsgZ3JlcCB7IGRlZmluZWQgJiYgbS9cUy8gfSBAeyRfWzFdfSB9IH0KKworVGhpcyBmaWx0ZXIgcmVqZWN0cyBhbGwgbGluZXMgdGhhdCBJPG5vdD4gaGF2ZSBhdCBsZWFzdCBvbmUgZmllbGQgdGhhdCBkb2VzCitub3QgZXZhbHVhdGUgdG8gdGhlIGVtcHR5IHN0cmluZy4KKworV2l0aCB0aGUgZ2l2ZW4gZXhhbXBsZSBkYXRhLCB0aGlzIGZpbHRlciB3b3VsZCBza2lwIGxpbmVzIDIgdGhyb3VnaCA4LgorCis9YmFjaworCis9aXRlbSBhZnRlcl9pbgorCitUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgZm9yIGVhY2ggcmVjb3JkIGFmdGVyIGFsbCByZWNvcmRzIGhhdmUgYmVlbiBwYXJzZWQKK2J1dCBiZWZvcmUgcmV0dXJuaW5nIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNhbGxlci4gIFRoZSBob29rIGlzIGludm9rZWQgd2l0aAordHdvIGFyZ3VtZW50czogIHRoZSBjdXJyZW50ICBDPENTVj4gIHBhcnNlciBvYmplY3QgIGFuZCBhICByZWZlcmVuY2UgdG8gdGhlCityZWNvcmQuICAgVGhlIHJlZmVyZW5jZSBjYW4gYmUgYSByZWZlcmVuY2UgdG8gYSAgSEFTSCAgb3IgYSByZWZlcmVuY2UgdG8gYW4KK0FSUkFZIGFzIGRldGVybWluZWQgYnkgdGhlIGFyZ3VtZW50cy4KKworVGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBwYXNzZWQgYXMgIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSAgQzxjYWxsYmFja3M+Cit3cmFwcGVyLgorCis9aXRlbSBiZWZvcmVfb3V0CisKK1RoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBmb3IgZWFjaCByZWNvcmQgYmVmb3JlIHRoZSByZWNvcmQgaXMgcHJpbnRlZC4gIFRoZQoraG9vayBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogIHRoZSBjdXJyZW50IEM8Q1NWPiBwYXJzZXIgb2JqZWN0IGFuZCBhCityZWZlcmVuY2UgdG8gdGhlIHJlY29yZC4gICBUaGUgcmVmZXJlbmNlIGNhbiBiZSBhIHJlZmVyZW5jZSB0byBhICBIQVNIIG9yIGEKK3JlZmVyZW5jZSB0byBhbiBBUlJBWSBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBhcmd1bWVudHMuCisKK1RoaXMgY2FsbGJhY2sgY2FuIGFsc28gYmUgcGFzc2VkIGFzIGFuIGF0dHJpYnV0ZSAgd2l0aG91dCB0aGUgIEM8Y2FsbGJhY2tzPgord3JhcHBlci4KKworVGhpcyBjYWxsYmFjayBtYWtlcyB0aGUgcm93IGF2YWlsYWJsZSBpbiBDPCVfPiBpZiB0aGUgcm93IGlzIGEgaGFzaHJlZi4gIEluCit0aGlzIGNhc2UgQzwlXz4gaXMgd3JpdGFibGUgYW5kIHdpbGwgY2hhbmdlIHRoZSBvcmlnaW5hbCByb3cuCisKKz1pdGVtIG9uX2luCisKK1RoaXMgY2FsbGJhY2sgYWN0cyBleGFjdGx5IGFzIHRoZSBMPC9hZnRlcl9pbj4gb3IgdGhlIEw8L2JlZm9yZV9vdXQ+IGhvb2tzLgorCitUaGlzIGNhbGxiYWNrIGNhbiBhbHNvIGJlIHBhc3NlZCBhcyBhbiBhdHRyaWJ1dGUgIHdpdGhvdXQgdGhlICBDPGNhbGxiYWNrcz4KK3dyYXBwZXIuCisKK1RoaXMgY2FsbGJhY2sgbWFrZXMgdGhlIHJvdyBhdmFpbGFibGUgaW4gQzwlXz4gaWYgdGhlIHJvdyBpcyBhIGhhc2hyZWYuICBJbgordGhpcyBjYXNlIEM8JV8+IGlzIHdyaXRhYmxlIGFuZCB3aWxsIGNoYW5nZSB0aGUgb3JpZ2luYWwgcm93LiBTbyBlLmcuIHdpdGgKKworICBteSAkYW9oID0gY3N2ICgKKyAgICAgIGluICAgICAgPT4gXCJmb29cbjFcbjJcbiIsCisgICAgICBoZWFkZXJzID0+ICJhdXRvIiwKKyAgICAgIG9uX2luICAgPT4gc3ViIHsgJF97YmFyfSA9IDI7IH0sCisgICAgICApOworCitDPCRhb2g+IHdpbGwgYmU6CisKKyAgWyB7IGZvbyA9PiAxLAorICAgICAgYmFyID0+IDIsCisgICAgICB9CisgICAgeyBmb28gPT4gMiwKKyAgICAgIGJhciA9PiAyLAorICAgICAgfQorICAgIF0KKworPWl0ZW0gY3N2CisKK1RoZSBJPGZ1bmN0aW9uPiAgTDwvY3N2PiBjYW4gYWxzbyBiZSBjYWxsZWQgYXMgYSBtZXRob2Qgb3Igd2l0aCBhbiBleGlzdGluZworVGV4dDo6Q1NWIG9iamVjdC4gVGhpcyBjb3VsZCBoZWxwIGlmIHRoZSBmdW5jdGlvbiBpcyB0byBiZSBpbnZva2VkIGEgbG90CitvZiB0aW1lcyBhbmQgdGhlIG92ZXJoZWFkIG9mIGNyZWF0aW5nIHRoZSBvYmplY3QgaW50ZXJuYWxseSBvdmVyICBhbmQgIG92ZXIKK2FnYWluIHdvdWxkIGJlIHByZXZlbnRlZCBieSBwYXNzaW5nIGFuIGV4aXN0aW5nIGluc3RhbmNlLgorCisgbXkgJGNzdiA9IFRleHQ6OkNTVi0+bmV3ICh7IGJpbmFyeSA9PiAxLCBhdXRvX2RpYWcgPT4gMSB9KTsKKworIG15ICRhb2EgPSAkY3N2LT5jc3YgKGluID0+ICRmaCk7CisgbXkgJGFvYSA9IGNzdiAoaW4gPT4gJGZoLCBjc3YgPT4gJGNzdik7CisKK2JvdGggYWN0IHRoZSBzYW1lLiBSdW5uaW5nIHRoaXMgMjAwMDAgdGltZXMgb24gYSAyMCBsaW5lcyBDU1YgZmlsZSwgIHNob3dlZAorYSA1MyUgc3BlZWR1cC4KKworPWJhY2sKKworPWhlYWQxIERJQUdOT1NUSUNTCisKK1RoaXMgc2VjdGlvbiBpcyBhbHNvIHRha2VuIGZyb20gVGV4dDo6Q1NWX1hTLgorCitJZiBhbiBlcnJvciBvY2N1cnMsICBDPDwgJGNzdi0+ZXJyb3JfZGlhZyA+PiBjYW4gYmUgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24KK29uIHRoZSBjYXVzZSBvZiB0aGUgZmFpbHVyZS4gTm90ZSB0aGF0IGZvciBzcGVlZCByZWFzb25zIHRoZSBpbnRlcm5hbCB2YWx1ZQoraXMgbmV2ZXIgY2xlYXJlZCBvbiBzdWNjZXNzLCAgc28gdXNpbmcgdGhlIHZhbHVlIHJldHVybmVkIGJ5IEw8L2Vycm9yX2RpYWc+CitpbiBub3JtYWwgY2FzZXMgLSB3aGVuIG5vIGVycm9yIG9jY3VycmVkIC0gbWF5IGNhdXNlIHVuZXhwZWN0ZWQgcmVzdWx0cy4KKworSWYgdGhlIGNvbnN0cnVjdG9yIGZhaWxlZCwgdGhlIGNhdXNlIGNhbiBiZSBmb3VuZCB1c2luZyBMPC9lcnJvcl9kaWFnPiBhcyBhCitjbGFzcyBtZXRob2QsIGxpa2UgQzw8IFRleHQ6OkNTVl9QUC0+ZXJyb3JfZGlhZyA+Pi4KKworVGhlIEM8PCAkY3N2LT5lcnJvcl9kaWFnID4+IG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdXBvbiBlcnJvciB3aGVuCit0aGUgY29udHJhY3RvciB3YXMgY2FsbGVkIHdpdGggIEw8QzxhdXRvX2RpYWc+fC9hdXRvX2RpYWc+ICBzZXQgdG8gIEM8MT4gb3IKK0M8Mj4sIG9yIHdoZW4gTDxhdXRvZGllPiBpcyBpbiBlZmZlY3QuICBXaGVuIHNldCB0byBDPDE+LCB0aGlzIHdpbGwgY2F1c2UgYQorQzx3YXJuPiB3aXRoIHRoZSBlcnJvciBtZXNzYWdlLCAgd2hlbiBzZXQgdG8gQzwyPiwgaXQgd2lsbCBDPGRpZT4uIEM8MjAxMiAtCitFT0Y+IGlzIGV4Y2x1ZGVkIGZyb20gTDxDPGF1dG9fZGlhZz58L2F1dG9fZGlhZz4gcmVwb3J0cy4KKworRXJyb3JzIGNhbiBiZSAoaW5kaXZpZHVhbGx5KSBjYXVnaHQgdXNpbmcgdGhlIEw8L2Vycm9yPiBjYWxsYmFjay4KKworVGhlIGVycm9ycyBhcyBkZXNjcmliZWQgYmVsb3cgYXJlIGF2YWlsYWJsZS4gSSBoYXZlIHRyaWVkIHRvIG1ha2UgdGhlIGVycm9yCitpdHNlbGYgZXhwbGFuYXRvcnkgZW5vdWdoLCBidXQgbW9yZSBkZXNjcmlwdGlvbnMgd2lsbCBiZSBhZGRlZC4gRm9yIG1vc3Qgb2YKK3RoZXNlIGVycm9ycywgdGhlIGZpcnN0IHRocmVlIGNhcGl0YWxzIGRlc2NyaWJlIHRoZSBlcnJvciBjYXRlZ29yeToKKworPW92ZXIgMgorCis9aXRlbSAqCitJTkkKKworSW5pdGlhbGl6YXRpb24gZXJyb3Igb3Igb3B0aW9uIGNvbmZsaWN0LgorCis9aXRlbSAqCitFQ1IKKworQ2FycmlhZ2UtUmV0dXJuIHJlbGF0ZWQgcGFyc2UgZXJyb3IuCisKKz1pdGVtICoKK0VPRgorCitFbmQtT2YtRmlsZSByZWxhdGVkIHBhcnNlIGVycm9yLgorCis9aXRlbSAqCitFSVEKKworUGFyc2UgZXJyb3IgaW5zaWRlIHF1b3RhdGlvbi4KKworPWl0ZW0gKgorRUlGCisKK1BhcnNlIGVycm9yIGluc2lkZSBmaWVsZC4KKworPWl0ZW0gKgorRUNCCisKK0NvbWJpbmUgZXJyb3IuCisKKz1pdGVtICoKK0VIUgorCitIYXNoUmVmIHBhcnNlIHJlbGF0ZWQgZXJyb3IuCisKKz1iYWNrCisKK0FuZCBiZWxvdyBzaG91bGQgYmUgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgZXJyb3IgY29kZXMgdGhhdCBjYW4gYmUgcmV0dXJuZWQ6CisKKz1vdmVyIDIKKworPWl0ZW0gKgorMTAwMSAiSU5JIC0gc2VwX2NoYXIgaXMgZXF1YWwgdG8gcXVvdGVfY2hhciBvciBlc2NhcGVfY2hhciIKK1g8MTAwMT4KKworVGhlICBMPHNlcGFyYXRpb24gY2hhcmFjdGVyfC9zZXBfY2hhcj4gIGNhbm5vdCBiZSBlcXVhbCB0byAgTDx0aGUgcXVvdGF0aW9uCitjaGFyYWN0ZXJ8L3F1b3RlX2NoYXI+IG9yIHRvIEw8dGhlIGVzY2FwZSBjaGFyYWN0ZXJ8L2VzY2FwZV9jaGFyPiwgIGFzIHRoaXMKK3dvdWxkIGludmFsaWRhdGUgYWxsIHBhcnNpbmcgcnVsZXMuCisKKz1pdGVtICoKKzEwMDIgIklOSSAtIGFsbG93X3doaXRlc3BhY2Ugd2l0aCBlc2NhcGVfY2hhciBvciBxdW90ZV9jaGFyIFNQIG9yIFRBQiIKK1g8MTAwMj4KKworVXNpbmcgdGhlICBMPEM8YWxsb3dfd2hpdGVzcGFjZT58L2FsbG93X3doaXRlc3BhY2U+ICBhdHRyaWJ1dGUgIHdoZW4gZWl0aGVyCitMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+IG9yIEw8Qzxlc2NhcGVfY2hhcj58L2VzY2FwZV9jaGFyPiAgaXMgZXF1YWwgdG8KK0M8U1BBQ0U+IG9yIEM8VEFCPiBpcyB0b28gYW1iaWd1b3VzIHRvIGFsbG93LgorCis9aXRlbSAqCisxMDAzICJJTkkgLSBcciBvciBcbiBpbiBtYWluIGF0dHIgbm90IGFsbG93ZWQiCitYPDEwMDM+CisKK1VzaW5nIGRlZmF1bHQgTDxDPGVvbD58L2VvbD4gY2hhcmFjdGVycyBpbiBlaXRoZXIgTDxDPHNlcF9jaGFyPnwvc2VwX2NoYXI+LAorTDxDPHF1b3RlX2NoYXI+fC9xdW90ZV9jaGFyPiwgICBvciAgTDxDPGVzY2FwZV9jaGFyPnwvZXNjYXBlX2NoYXI+ICBpcyAgbm90CithbGxvd2VkLgorCis9aXRlbSAqCisxMDA0ICJJTkkgLSBjYWxsYmFja3Mgc2hvdWxkIGJlIHVuZGVmIG9yIGEgaGFzaHJlZiIKK1g8MTAwND4KKworVGhlIEw8QzxjYWxsYmFja3M+fC9DYWxsYmFja3M+ICBhdHRyaWJ1dGUgb25seSBhbGxvd3Mgb25lIHRvIGJlIEM8dW5kZWY+IG9yCithIGhhc2ggcmVmZXJlbmNlLgorCis9aXRlbSAqCisxMDA1ICJJTkkgLSBFT0wgdG9vIGxvbmciCitYPDEwMDU+CisKK1RoZSB2YWx1ZSBwYXNzZWQgZm9yIEVPTCBpcyBleGNlZWRpbmcgaXRzIG1heGltdW0gbGVuZ3RoICgxNikuCisKKz1pdGVtICoKKzEwMDYgIklOSSAtIFNFUCB0b28gbG9uZyIKK1g8MTAwNj4KKworVGhlIHZhbHVlIHBhc3NlZCBmb3IgU0VQIGlzIGV4Y2VlZGluZyBpdHMgbWF4aW11bSBsZW5ndGggKDE2KS4KKworPWl0ZW0gKgorMTAwNyAiSU5JIC0gUVVPVEUgdG9vIGxvbmciCitYPDEwMDc+CisKK1RoZSB2YWx1ZSBwYXNzZWQgZm9yIFFVT1RFIGlzIGV4Y2VlZGluZyBpdHMgbWF4aW11bSBsZW5ndGggKDE2KS4KKworPWl0ZW0gKgorMTAwOCAiSU5JIC0gU0VQIHVuZGVmaW5lZCIKK1g8MTAwOD4KKworVGhlIHZhbHVlIHBhc3NlZCBmb3IgU0VQIHNob3VsZCBiZSBkZWZpbmVkIGFuZCBub3QgZW1wdHkuCisKKz1pdGVtICoKKzEwMTAgIklOSSAtIHRoZSBoZWFkZXIgaXMgZW1wdHkiCitYPDEwMTA+CisKK1RoZSBoZWFkZXIgbGluZSBwYXJzZWQgaW4gdGhlIEw8L2hlYWRlcj4gaXMgZW1wdHkuCisKKz1pdGVtICoKKzEwMTEgIklOSSAtIHRoZSBoZWFkZXIgY29udGFpbnMgbW9yZSB0aGFuIG9uZSB2YWxpZCBzZXBhcmF0b3IiCitYPDEwMTE+CisKK1RoZSBoZWFkZXIgbGluZSBwYXJzZWQgaW4gdGhlICBMPC9oZWFkZXI+ICBjb250YWlucyBtb3JlIHRoYW4gb25lICAodW5pcXVlKQorc2VwYXJhdG9yIGNoYXJhY3RlciBvdXQgb2YgdGhlIGFsbG93ZWQgc2V0IG9mIHNlcGFyYXRvcnMuCisKKz1pdGVtICoKKzEwMTIgIklOSSAtIHRoZSBoZWFkZXIgY29udGFpbnMgYW4gZW1wdHkgZmllbGQiCitYPDEwMTI+CisKK1RoZSBoZWFkZXIgbGluZSBwYXJzZWQgaW4gdGhlIEw8L2hlYWRlcj4gaXMgY29udGFpbnMgYW4gZW1wdHkgZmllbGQuCisKKz1pdGVtICoKKzEwMTMgIklOSSAtIHRoZSBoZWFkZXIgY29udGFpbnMgbnVuLXVuaXF1ZSBmaWVsZHMiCitYPDEwMTM+CisKK1RoZSBoZWFkZXIgbGluZSBwYXJzZWQgaW4gdGhlICBMPC9oZWFkZXI+ICBjb250YWlucyBhdCBsZWFzdCAgdHdvIGlkZW50aWNhbAorZmllbGRzLgorCis9aXRlbSAqCisxMDE0ICJJTkkgLSBoZWFkZXIgY2FsbGVkIG9uIHVuZGVmaW5lZCBzdHJlYW0iCitYPDEwMTQ+CisKK1RoZSBoZWFkZXIgbGluZSBjYW5ub3QgYmUgcGFyc2VkIGZyb20gYW4gdW5kZWZpbmVkIHNvdXJjZXMuCisKKz1pdGVtICoKKzE1MDAgIlBSTSAtIEludmFsaWQvdW5zdXBwb3J0ZWQgYXJndW1lbnQocykiCitYPDE1MDA+CisKK0Z1bmN0aW9uIG9yIG1ldGhvZCBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50KHMpIG9yIHBhcmFtZXRlcihzKS4KKworPWl0ZW0gKgorMjAxMCAiRUNSIC0gUVVPIGNoYXIgaW5zaWRlIHF1b3RlcyBmb2xsb3dlZCBieSBDUiBub3QgcGFydCBvZiBFT0wiCitYPDIwMTA+CisKK1doZW4gIEw8Qzxlb2w+fC9lb2w+ICBoYXMgIGJlZW4gIHNldCAgdG8gIGFueXRoaW5nICBidXQgdGhlICBkZWZhdWx0LCAgbGlrZQorQzwiXHJcdFxuIj4sICBhbmQgIHRoZSAgQzwiXHIiPiAgaXMgIGZvbGxvd2luZyAgdGhlICAgQjxzZWNvbmQ+ICAgKGNsb3NpbmcpCitMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+LCB3aGVyZSB0aGUgY2hhcmFjdGVycyBmb2xsb3dpbmcgdGhlIEM8IlxyIj4gZG8KK25vdCBtYWtlIHVwIHRoZSBMPEM8ZW9sPnwvZW9sPiBzZXF1ZW5jZSwgdGhpcyBpcyBhbiBlcnJvci4KKworPWl0ZW0gKgorMjAxMSAiRUNSIC0gQ2hhcmFjdGVycyBhZnRlciBlbmQgb2YgcXVvdGVkIGZpZWxkIgorWDwyMDExPgorCitTZXF1ZW5jZXMgbGlrZSBDPDEsZm9vLCJiYXIiYmF6LDIyLDE+IGFyZSBub3QgYWxsb3dlZC4gQzwiYmFyIj4gaXMgYSBxdW90ZWQKK2ZpZWxkIGFuZCBhZnRlciB0aGUgY2xvc2luZyBkb3VibGUtcXVvdGUsIHRoZXJlIHNob3VsZCBiZSBlaXRoZXIgYSBuZXctbGluZQorc2VxdWVuY2Ugb3IgYSBzZXBhcmF0aW9uIGNoYXJhY3Rlci4KKworPWl0ZW0gKgorMjAxMiAiRU9GIC0gRW5kIG9mIGRhdGEgaW4gcGFyc2luZyBpbnB1dCBzdHJlYW0iCitYPDIwMTI+CisKK1NlbGYtZXhwbGFpbmluZy4gRW5kLW9mLWZpbGUgd2hpbGUgaW5zaWRlIHBhcnNpbmcgYSBzdHJlYW0uIENhbiBoYXBwZW4gb25seQord2hlbiByZWFkaW5nIGZyb20gc3RyZWFtcyB3aXRoIEw8L2dldGxpbmU+LCAgYXMgdXNpbmcgIEw8L3BhcnNlPiBpcyBkb25lIG9uCitzdHJpbmdzIHRoYXQgYXJlIG5vdCByZXF1aXJlZCB0byBoYXZlIGEgdHJhaWxpbmcgTDxDPGVvbD58L2VvbD4uCisKKz1pdGVtICoKKzIwMTMgIklOSSAtIFNwZWNpZmljYXRpb24gZXJyb3IgZm9yIGZyYWdtZW50cyBSRkM3MTExIgorWDwyMDEzPgorCitJbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIFVSSSBMPC9mcmFnbWVudD4gc3BlY2lmaWNhdGlvbi4KKworPWl0ZW0gKgorMjAyMSAiRUlRIC0gTkwgY2hhciBpbnNpZGUgcXVvdGVzLCBiaW5hcnkgb2ZmIgorWDwyMDIxPgorCitTZXF1ZW5jZXMgbGlrZSBDPDEsImZvb1xuYmFyIiwyMiwxPiBhcmUgYWxsb3dlZCBvbmx5IHdoZW4gdGhlIGJpbmFyeSBvcHRpb24KK2hhcyBiZWVuIHNlbGVjdGVkIHdpdGggdGhlIGNvbnN0cnVjdG9yLgorCis9aXRlbSAqCisyMDIyICJFSVEgLSBDUiBjaGFyIGluc2lkZSBxdW90ZXMsIGJpbmFyeSBvZmYiCitYPDIwMjI+CisKK1NlcXVlbmNlcyBsaWtlIEM8MSwiZm9vXHJiYXIiLDIyLDE+IGFyZSBhbGxvd2VkIG9ubHkgd2hlbiB0aGUgYmluYXJ5IG9wdGlvbgoraGFzIGJlZW4gc2VsZWN0ZWQgd2l0aCB0aGUgY29uc3RydWN0b3IuCisKKz1pdGVtICoKKzIwMjMgIkVJUSAtIFFVTyBjaGFyYWN0ZXIgbm90IGFsbG93ZWQiCitYPDIwMjM+CisKK1NlcXVlbmNlcyBsaWtlIEM8ImZvbyAiYmFyIiBiYXoiLHF1PiBhbmQgQzwyMDIzLCIsMjAwOC0wNC0wNSwiRm9vLCBCYXIiLFxuPgord2lsbCBjYXVzZSB0aGlzIGVycm9yLgorCis9aXRlbSAqCisyMDI0ICJFSVEgLSBFT0YgY2Fubm90IGJlIGVzY2FwZWQsIG5vdCBldmVuIGluc2lkZSBxdW90ZXMiCitYPDIwMjQ+CisKK1RoZSBlc2NhcGUgY2hhcmFjdGVyIGlzIG5vdCBhbGxvd2VkIGFzIGxhc3QgY2hhcmFjdGVyIGluIGFuIGlucHV0IHN0cmVhbS4KKworPWl0ZW0gKgorMjAyNSAiRUlRIC0gTG9vc2UgdW5lc2NhcGVkIGVzY2FwZSIKK1g8MjAyNT4KKworQW4gZXNjYXBlIGNoYXJhY3RlciBzaG91bGQgZXNjYXBlIG9ubHkgY2hhcmFjdGVycyB0aGF0IG5lZWQgZXNjYXBpbmcuCisKK0FsbG93aW5nICB0aGUgZXNjYXBlICBmb3Igb3RoZXIgY2hhcmFjdGVycyAgaXMgcG9zc2libGUgIHdpdGggdGhlIGF0dHJpYnV0ZQorTDwvYWxsb3dfbG9vc2VfZXNjYXBlPi4KKworPWl0ZW0gKgorMjAyNiAiRUlRIC0gQmluYXJ5IGNoYXJhY3RlciBpbnNpZGUgcXVvdGVkIGZpZWxkLCBiaW5hcnkgb2ZmIgorWDwyMDI2PgorCitCaW5hcnkgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQgYnkgZGVmYXVsdC4gICAgRXhjZXB0aW9ucyBhcmUgZmllbGRzIHRoYXQKK2NvbnRhaW4gdmFsaWQgVVRGLTgsICB0aGF0IHdpbGwgYXV0b21hdGljYWxseSBiZSB1cGdyYWRlZCBpZiB0aGUgY29udGVudCBpcwordmFsaWQgVVRGLTguIFNldCBMPEM8YmluYXJ5PnwvYmluYXJ5PiB0byBDPDE+IHRvIGFjY2VwdCBiaW5hcnkgZGF0YS4KKworPWl0ZW0gKgorMjAyNyAiRUlRIC0gUXVvdGVkIGZpZWxkIG5vdCB0ZXJtaW5hdGVkIgorWDwyMDI3PgorCitXaGVuIHBhcnNpbmcgYSBmaWVsZCB0aGF0IHN0YXJ0ZWQgd2l0aCBhIHF1b3RhdGlvbiBjaGFyYWN0ZXIsICB0aGUgZmllbGQgaXMKK2V4cGVjdGVkIHRvIGJlIGNsb3NlZCB3aXRoIGEgcXVvdGF0aW9uIGNoYXJhY3Rlci4gICBXaGVuIHRoZSBwYXJzZWQgbGluZSBpcworZXhoYXVzdGVkIGJlZm9yZSB0aGUgcXVvdGUgaXMgZm91bmQsIHRoYXQgZmllbGQgaXMgbm90IHRlcm1pbmF0ZWQuCisKKz1pdGVtICoKKzIwMzAgIkVJRiAtIE5MIGNoYXIgaW5zaWRlIHVucXVvdGVkIHZlcmJhdGltLCBiaW5hcnkgb2ZmIgorWDwyMDMwPgorCis9aXRlbSAqCisyMDMxICJFSUYgLSBDUiBjaGFyIGlzIGZpcnN0IGNoYXIgb2YgZmllbGQsIG5vdCBwYXJ0IG9mIEVPTCIKK1g8MjAzMT4KKworPWl0ZW0gKgorMjAzMiAiRUlGIC0gQ1IgY2hhciBpbnNpZGUgdW5xdW90ZWQsIG5vdCBwYXJ0IG9mIEVPTCIKK1g8MjAzMj4KKworPWl0ZW0gKgorMjAzNCAiRUlGIC0gTG9vc2UgdW5lc2NhcGVkIHF1b3RlIgorWDwyMDM0PgorCis9aXRlbSAqCisyMDM1ICJFSUYgLSBFc2NhcGVkIEVPRiBpbiB1bnF1b3RlZCBmaWVsZCIKK1g8MjAzNT4KKworPWl0ZW0gKgorMjAzNiAiRUlGIC0gRVNDIGVycm9yIgorWDwyMDM2PgorCis9aXRlbSAqCisyMDM3ICJFSUYgLSBCaW5hcnkgY2hhcmFjdGVyIGluIHVucXVvdGVkIGZpZWxkLCBiaW5hcnkgb2ZmIgorWDwyMDM3PgorCis9aXRlbSAqCisyMTEwICJFQ0IgLSBCaW5hcnkgY2hhcmFjdGVyIGluIENvbWJpbmUsIGJpbmFyeSBvZmYiCitYPDIxMTA+CisKKz1pdGVtICoKKzIyMDAgIkVJTyAtIHByaW50IHRvIElPIGZhaWxlZC4gU2VlIGVycm5vIgorWDwyMjAwPgorCis9aXRlbSAqCiszMDAxICJFSFIgLSBVbnN1cHBvcnRlZCBzeW50YXggZm9yIGNvbHVtbl9uYW1lcyAoKSIKK1g8MzAwMT4KKworPWl0ZW0gKgorMzAwMiAiRUhSIC0gZ2V0bGluZV9ociAoKSBjYWxsZWQgYmVmb3JlIGNvbHVtbl9uYW1lcyAoKSIKK1g8MzAwMj4KKworPWl0ZW0gKgorMzAwMyAiRUhSIC0gYmluZF9jb2x1bW5zICgpIGFuZCBjb2x1bW5fbmFtZXMgKCkgZmllbGRzIGNvdW50IG1pc21hdGNoIgorWDwzMDAzPgorCis9aXRlbSAqCiszMDA0ICJFSFIgLSBiaW5kX2NvbHVtbnMgKCkgb25seSBhY2NlcHRzIHJlZnMgdG8gc2NhbGFycyIKK1g8MzAwND4KKworPWl0ZW0gKgorMzAwNiAiRUhSIC0gYmluZF9jb2x1bW5zICgpIGRpZCBub3QgcGFzcyBlbm91Z2ggcmVmcyBmb3IgcGFyc2VkIGZpZWxkcyIKK1g8MzAwNj4KKworPWl0ZW0gKgorMzAwNyAiRUhSIC0gYmluZF9jb2x1bW5zIG5lZWRzIHJlZnMgdG8gd3JpdGFibGUgc2NhbGFycyIKK1g8MzAwNz4KKworPWl0ZW0gKgorMzAwOCAiRUhSIC0gdW5leHBlY3RlZCBlcnJvciBpbiBib3VuZCBmaWVsZHMiCitYPDMwMDg+CisKKz1pdGVtICoKKzMwMDkgIkVIUiAtIHByaW50X2hyICgpIGNhbGxlZCBiZWZvcmUgY29sdW1uX25hbWVzICgpIgorWDwzMDA5PgorCis9aXRlbSAqCiszMDEwICJFSFIgLSBwcmludF9ociAoKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cyIKK1g8MzAxMD4KKworPWJhY2sKKworPWhlYWQxIFNFRSBBTFNPCisKK0w8VGV4dDo6Q1NWX1BQPiwgTDxUZXh0OjpDU1ZfWFM+IGFuZCBMPFRleHQ6OkNTVjo6RW5jb2RlZD4uCisKKworPWhlYWQxIEFVVEhPUlMgYW5kIE1BSU5UQUlORVJTCisKK0FsYW4gQ2l0dGVybWFuIEY8RTxsdD5hbGFuW2F0XW1mZ3J0bC5jb21FPGd0Pj4gd3JvdGUgdGhlIG9yaWdpbmFsIFBlcmwKK21vZHVsZS4gUGxlYXNlIGRvbid0IHNlbmQgbWFpbCBjb25jZXJuaW5nIFRleHQ6OkNTViB0byBBbGFuLCBhcworaGUncyBub3QgYSBwcmVzZW50IG1haW50YWluZXIuCisKK0pvY2hlbiBXaWVkbWFubiBGPEU8bHQ+am9lW2F0XWlzcHNvZnQuZGVFPGd0Pj4gcmV3cm90ZSB0aGUgZW5jb2RpbmcgYW5kCitkZWNvZGluZyBpbiBDIGJ5IGltcGxlbWVudGluZyBhIHNpbXBsZSBmaW5pdGUtc3RhdGUgbWFjaGluZSBhbmQgYWRkZWQKK3RoZSB2YXJpYWJsZSBxdW90ZSwgZXNjYXBlIGFuZCBzZXBhcmF0b3IgY2hhcmFjdGVycywgdGhlIGJpbmFyeSBtb2RlCithbmQgdGhlIHByaW50IGFuZCBnZXRsaW5lIG1ldGhvZHMuIFNlZSBDaGFuZ2VMb2cgcmVsZWFzZXMgMC4xMCB0aHJvdWdoCiswLjIzLgorCitILk1lcmlqbiBCcmFuZCBGPEU8bHQ+aC5tLmJyYW5kW2F0XXhzNGFsbC5ubEU8Z3Q+PiBjbGVhbmVkIHVwIHRoZSBjb2RlLAorYWRkZWQgdGhlIGZpZWxkIGZsYWdzIG1ldGhvZHMsIHdyb3RlIHRoZSBtYWpvciBwYXJ0IG9mIHRoZSB0ZXN0IHN1aXRlLAorY29tcGxldGVkIHRoZSBkb2N1bWVudGF0aW9uLCBmaXhlZCBzb21lIFJUIGJ1Z3MuIFNlZSBDaGFuZ2VMb2cgcmVsZWFzZXMKKzAuMjUgYW5kIG9uLgorCitNYWthbWFrYSBIYW5ueWFoYXJhbWl0dSwgRTxsdD5tYWthbWFrYVthdF1jcGFuLm9yZ0U8Z3Q+IHdyb3RlIFRleHQ6OkNTVl9QUAord2hpY2ggaXMgdGhlIHB1cmUtUGVybCB2ZXJzaW9uIG9mIFRleHQ6OkNTVl9YUy4KKworTmV3IFRleHQ6OkNTViAoc2luY2UgMC45OSkgaXMgbWFpbnRhaW5lZCBieSBNYWthbWFrYSwgYW5kIEtlbmljaGkgSXNoaWdha2kKK3NpbmNlIDEuOTEuCisKKworPWhlYWQxIENPUFlSSUdIVCBBTkQgTElDRU5TRQorCitUZXh0OjpDU1YKKworQ29weXJpZ2h0IChDKSAxOTk3IEFsYW4gQ2l0dGVybWFuLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorQ29weXJpZ2h0IChDKSAyMDA3LTIwMTUgTWFrYW1ha2EgSGFubnlhaGFyYW1pdHUuCitDb3B5cmlnaHQgKEMpIDIwMTctIEtlbmljaGkgSXNoaWdha2kKK0EgbGFyZ2UgcG9ydGlvbiBvZiB0aGUgZG9jIGlzIHRha2VuIGZyb20gVGV4dDo6Q1NWX1hTLiBTZWUgYmVsb3cuCisKK1RleHQ6OkNTVl9QUDoKKworQ29weXJpZ2h0IChDKSAyMDA1LTIwMTUgTWFrYW1ha2EgSGFubnlhaGFyYW1pdHUuCitDb3B5cmlnaHQgKEMpIDIwMTctIEtlbmljaGkgSXNoaWdha2kKK0EgbGFyZ2UgcG9ydGlvbiBvZiB0aGUgY29kZS9kb2MgYXJlIGFsc28gdGFrZW4gZnJvbSBUZXh0OjpDU1ZfWFMuIFNlZSBiZWxvdy4KKworVGV4dDpDU1ZfWFM6CisKK0NvcHlyaWdodCAoQykgMjAwNy0yMDE2IEguTWVyaWpuIEJyYW5kIGZvciBQUk9DVVJBIEIuVi4KK0NvcHlyaWdodCAoQykgMTk5OC0yMDAxIEpvY2hlbiBXaWVkbWFubi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KK1BvcnRpb25zIENvcHlyaWdodCAoQykgMTk5NyBBbGFuIENpdHRlcm1hbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworCitUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKKz1jdXQKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1RleHQvQ1NWX1BQLnBtIGIvbWN1L3Rvb2xzL3BlcmwvVGV4dC9DU1ZfUFAucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0MzBkNAotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1RleHQvQ1NWX1BQLnBtCkBAIC0wLDAgKzEsNDkxNiBAQAorcGFja2FnZSBUZXh0OjpDU1ZfUFA7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRleHQ6OkNTVl9QUCAtIFRleHQ6OkNTVl9YUyBjb21wYXRpYmxlIHB1cmUtUGVybCBtb2R1bGUKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCityZXF1aXJlIDUuMDA1OworCit1c2Ugc3RyaWN0OwordXNlIEV4cG9ydGVyICgpOwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSBARVhQT1JUX09LKTsKK3VzZSBDYXJwOworCiskVkVSU0lPTiA9ICcxLjk1JzsKK0BJU0EgPSBxdyhFeHBvcnRlcik7CitARVhQT1JUX09LID0gcXcoY3N2KTsKKworc3ViIFBWICB7IDAgfQorc3ViIElWICB7IDEgfQorc3ViIE5WICB7IDIgfQorCitzdWIgSVNfUVVPVEVEICgpIHsgMHgwMDAxOyB9CitzdWIgSVNfQklOQVJZICgpIHsgMHgwMDAyOyB9CitzdWIgSVNfRVJST1IgKCkgIHsgMHgwMDA0OyB9CitzdWIgSVNfTUlTU0lORyAoKSB7IDB4MDAxMDsgfQorCitzdWIgSE9PS19FUlJPUiAoKSB7IDB4MDAwMTsgfQorc3ViIEhPT0tfQUZURVJfUEFSU0UgKCkgeyAweDAwMDI7IH0KK3N1YiBIT09LX0JFRk9SRV9QUklOVCAoKSB7IDB4MDAwNDsgfQorCitzdWIgdXNlSU9fRU9GICgpIHsgMHgwMDEwOyB9CisKK215ICRFUlJPUlMgPSB7CisgICAgICAgICMgR2VuZXJpYyBlcnJvcnMKKyAgICAgICAgMTAwMCA9PiAiSU5JIC0gY29uc3RydWN0b3IgZmFpbGVkIiwKKyAgICAgICAgMTAwMSA9PiAiSU5JIC0gc2VwX2NoYXIgaXMgZXF1YWwgdG8gcXVvdGVfY2hhciBvciBlc2NhcGVfY2hhciIsCisgICAgICAgIDEwMDIgPT4gIklOSSAtIGFsbG93X3doaXRlc3BhY2Ugd2l0aCBlc2NhcGVfY2hhciBvciBxdW90ZV9jaGFyIFNQIG9yIFRBQiIsCisgICAgICAgIDEwMDMgPT4gIklOSSAtIFxcciBvciBcXG4gaW4gbWFpbiBhdHRyIG5vdCBhbGxvd2VkIiwKKyAgICAgICAgMTAwNCA9PiAiSU5JIC0gY2FsbGJhY2tzIHNob3VsZCBiZSB1bmRlZiBvciBhIGhhc2hyZWYiLAorICAgICAgICAxMDA1ID0+ICJJTkkgLSBFT0wgdG9vIGxvbmciLAorICAgICAgICAxMDA2ID0+ICJJTkkgLSBTRVAgdG9vIGxvbmciLAorICAgICAgICAxMDA3ID0+ICJJTkkgLSBRVU9URSB0b28gbG9uZyIsCisgICAgICAgIDEwMDggPT4gIklOSSAtIFNFUCB1bmRlZmluZWQiLAorCisgICAgICAgIDEwMTAgPT4gIklOSSAtIHRoZSBoZWFkZXIgaXMgZW1wdHkiLAorICAgICAgICAxMDExID0+ICJJTkkgLSB0aGUgaGVhZGVyIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgdmFsaWQgc2VwYXJhdG9yIiwKKyAgICAgICAgMTAxMiA9PiAiSU5JIC0gdGhlIGhlYWRlciBjb250YWlucyBhbiBlbXB0eSBmaWVsZCIsCisgICAgICAgIDEwMTMgPT4gIklOSSAtIHRoZSBoZWFkZXIgY29udGFpbnMgbnVuLXVuaXF1ZSBmaWVsZHMiLAorICAgICAgICAxMDE0ID0+ICJJTkkgLSBoZWFkZXIgY2FsbGVkIG9uIHVuZGVmaW5lZCBzdHJlYW0iLAorCisgICAgICAgICMgU3ludGF4IGVycm9ycworICAgICAgICAxNTAwID0+ICJQUk0gLSBJbnZhbGlkL3Vuc3VwcG9ydGVkIGFyZ3VtZW50cyhzKSIsCisKKyAgICAgICAgIyBQYXJzZSBlcnJvcnMKKyAgICAgICAgMjAxMCA9PiAiRUNSIC0gUVVPIGNoYXIgaW5zaWRlIHF1b3RlcyBmb2xsb3dlZCBieSBDUiBub3QgcGFydCBvZiBFT0wiLAorICAgICAgICAyMDExID0+ICJFQ1IgLSBDaGFyYWN0ZXJzIGFmdGVyIGVuZCBvZiBxdW90ZWQgZmllbGQiLAorICAgICAgICAyMDEyID0+ICJFT0YgLSBFbmQgb2YgZGF0YSBpbiBwYXJzaW5nIGlucHV0IHN0cmVhbSIsCisgICAgICAgIDIwMTMgPT4gIkVTUCAtIFNwZWNpZmljYXRpb24gZXJyb3IgZm9yIGZyYWdtZW50cyBSRkM3MTExIiwKKyAgICAgICAgMjAxNCA9PiAiRU5GIC0gSW5jb25zaXN0ZW50IG51bWJlciBvZiBmaWVsZHMiLAorCisgICAgICAgICMgRUlRIC0gRXJyb3IgSW5zaWRlIFF1b3RlcworICAgICAgICAyMDIxID0+ICJFSVEgLSBOTCBjaGFyIGluc2lkZSBxdW90ZXMsIGJpbmFyeSBvZmYiLAorICAgICAgICAyMDIyID0+ICJFSVEgLSBDUiBjaGFyIGluc2lkZSBxdW90ZXMsIGJpbmFyeSBvZmYiLAorICAgICAgICAyMDIzID0+ICJFSVEgLSBRVU8gY2hhcmFjdGVyIG5vdCBhbGxvd2VkIiwKKyAgICAgICAgMjAyNCA9PiAiRUlRIC0gRU9GIGNhbm5vdCBiZSBlc2NhcGVkLCBub3QgZXZlbiBpbnNpZGUgcXVvdGVzIiwKKyAgICAgICAgMjAyNSA9PiAiRUlRIC0gTG9vc2UgdW5lc2NhcGVkIGVzY2FwZSIsCisgICAgICAgIDIwMjYgPT4gIkVJUSAtIEJpbmFyeSBjaGFyYWN0ZXIgaW5zaWRlIHF1b3RlZCBmaWVsZCwgYmluYXJ5IG9mZiIsCisgICAgICAgIDIwMjcgPT4gIkVJUSAtIFF1b3RlZCBmaWVsZCBub3QgdGVybWluYXRlZCIsCisKKyAgICAgICAgIyBFSUYgLSBFcnJvciBJbnNpZGUgRmllbGQKKyAgICAgICAgMjAzMCA9PiAiRUlGIC0gTkwgY2hhciBpbnNpZGUgdW5xdW90ZWQgdmVyYmF0aW0sIGJpbmFyeSBvZmYiLAorICAgICAgICAyMDMxID0+ICJFSUYgLSBDUiBjaGFyIGlzIGZpcnN0IGNoYXIgb2YgZmllbGQsIG5vdCBwYXJ0IG9mIEVPTCIsCisgICAgICAgIDIwMzIgPT4gIkVJRiAtIENSIGNoYXIgaW5zaWRlIHVucXVvdGVkLCBub3QgcGFydCBvZiBFT0wiLAorICAgICAgICAyMDM0ID0+ICJFSUYgLSBMb29zZSB1bmVzY2FwZWQgcXVvdGUiLAorICAgICAgICAyMDM1ID0+ICJFSUYgLSBFc2NhcGVkIEVPRiBpbiB1bnF1b3RlZCBmaWVsZCIsCisgICAgICAgIDIwMzYgPT4gIkVJRiAtIEVTQyBlcnJvciIsCisgICAgICAgIDIwMzcgPT4gIkVJRiAtIEJpbmFyeSBjaGFyYWN0ZXIgaW4gdW5xdW90ZWQgZmllbGQsIGJpbmFyeSBvZmYiLAorCisgICAgICAgICMgQ29tYmluZSBlcnJvcnMKKyAgICAgICAgMjExMCA9PiAiRUNCIC0gQmluYXJ5IGNoYXJhY3RlciBpbiBDb21iaW5lLCBiaW5hcnkgb2ZmIiwKKworICAgICAgICAjIElPIGVycm9ycworICAgICAgICAyMjAwID0+ICJFSU8gLSBwcmludCB0byBJTyBmYWlsZWQuIFNlZSBlcnJubyIsCisKKyAgICAgICAgIyBIYXNoLVJlZiBlcnJvcnMKKyAgICAgICAgMzAwMSA9PiAiRUhSIC0gVW5zdXBwb3J0ZWQgc3ludGF4IGZvciBjb2x1bW5fbmFtZXMgKCkiLAorICAgICAgICAzMDAyID0+ICJFSFIgLSBnZXRsaW5lX2hyICgpIGNhbGxlZCBiZWZvcmUgY29sdW1uX25hbWVzICgpIiwKKyAgICAgICAgMzAwMyA9PiAiRUhSIC0gYmluZF9jb2x1bW5zICgpIGFuZCBjb2x1bW5fbmFtZXMgKCkgZmllbGRzIGNvdW50IG1pc21hdGNoIiwKKyAgICAgICAgMzAwNCA9PiAiRUhSIC0gYmluZF9jb2x1bW5zICgpIG9ubHkgYWNjZXB0cyByZWZzIHRvIHNjYWxhcnMiLAorICAgICAgICAzMDA2ID0+ICJFSFIgLSBiaW5kX2NvbHVtbnMgKCkgZGlkIG5vdCBwYXNzIGVub3VnaCByZWZzIGZvciBwYXJzZWQgZmllbGRzIiwKKyAgICAgICAgMzAwNyA9PiAiRUhSIC0gYmluZF9jb2x1bW5zIG5lZWRzIHJlZnMgdG8gd3JpdGFibGUgc2NhbGFycyIsCisgICAgICAgIDMwMDggPT4gIkVIUiAtIHVuZXhwZWN0ZWQgZXJyb3IgaW4gYm91bmQgZmllbGRzIiwKKyAgICAgICAgMzAwOSA9PiAiRUhSIC0gcHJpbnRfaHIgKCkgY2FsbGVkIGJlZm9yZSBjb2x1bW5fbmFtZXMgKCkiLAorICAgICAgICAzMDEwID0+ICJFSFIgLSBwcmludF9ociAoKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cyIsCisKKyAgICAgICAgIyBQUCBPbmx5IEVycm9yCisgICAgICAgIDQwMDIgPT4gIkVJUSAtIFVuZXNjYXBlZCBFU0MgaW4gcXVvdGVkIGZpZWxkIiwKKyAgICAgICAgNDAwMyA9PiAiRUlGIC0gRVNDIENSIiwKKyAgICAgICAgNDAwNCA9PiAiRVVGIC0gRmllbGQgaXMgdGVybWluYXRlZCBieSB0aGUgZXNjYXBlIGNoYXJhY3RlciAoZXNjYXBlX2NoYXIpIiwKKworICAgICAgICAwICAgID0+ICIiLAorfTsKKworQkVHSU4geworICAgIGlmICggJF0gPCA1LjAwNiApIHsKKyAgICAgICAgJElOQ3snYnl0ZXMucG0nfSA9IDEgdW5sZXNzICRJTkN7J2J5dGVzLnBtJ307ICMgZHVtbXkKKyAgICAgICAgbm8gc3RyaWN0ICdyZWZzJzsKKyAgICAgICAgKnsidXRmODo6aXNfdXRmOCJ9ID0gc3ViIHsgMDsgfTsKKyAgICAgICAgKnsidXRmODo6ZGVjb2RlIn0gID0gc3ViIHsgfTsKKyAgICB9CisgICAgZWxzaWYgKCAkXSA8IDUuMDA4ICkgeworICAgICAgICBubyBzdHJpY3QgJ3JlZnMnOworICAgICAgICAqeyJ1dGY4Ojppc191dGY4In0gPSBzdWIgeyAwOyB9OworICAgICAgICAqeyJ1dGY4OjpkZWNvZGUifSAgPSBzdWIgeyB9OworICAgICAgICAqeyJ1dGY4OjplbmNvZGUifSAgPSBzdWIgeyB9OworICAgIH0KKyAgICBlbHNpZiAoICFkZWZpbmVkICZ1dGY4Ojppc191dGY4ICkgeworICAgICAgIHJlcXVpcmUgRW5jb2RlOworICAgICAgICp1dGY4Ojppc191dGY4ID0gKkVuY29kZTo6aXNfdXRmODsKKyAgICB9CisKKyAgICBldmFsIHF8IHJlcXVpcmUgU2NhbGFyOjpVdGlsIHw7CisgICAgaWYgKCAkQCApIHsKKyAgICAgICAgZXZhbCBxfCByZXF1aXJlIEIgfDsKKyAgICAgICAgaWYgKCAkQCApIHsKKyAgICAgICAgICAgIENhcnA6OmNyb2FrICRAOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbXkgJXRtYXAgPSBxdygKKyAgICAgICAgICAgICAgICBCOjpOVUxMICAgU0NBTEFSCisgICAgICAgICAgICAgICAgQjo6SFYgICAgIEhBU0gKKyAgICAgICAgICAgICAgICBCOjpBViAgICAgQVJSQVkKKyAgICAgICAgICAgICAgICBCOjpDViAgICAgQ09ERQorICAgICAgICAgICAgICAgIEI6OklPICAgICBJTworICAgICAgICAgICAgICAgIEI6OkdWICAgICBHTE9CCisgICAgICAgICAgICAgICAgQjo6UkVHRVhQIFJFR0VYUAorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICpTY2FsYXI6OlV0aWw6OnJlZnR5cGUgPSBzdWIgKFwkKSB7CisgICAgICAgICAgICAgICAgbXkgJHIgPSBzaGlmdDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWYgdW5sZXNzIGxlbmd0aChyZWYoJHIpKTsKKyAgICAgICAgICAgICAgICBteSAkdCA9IHJlZihCOjpzdnJlZl8yb2JqZWN0KCRyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIGV4aXN0cyAkdG1hcHskdH0gPyAkdG1hcHskdH0KKyAgICAgICAgICAgICAgICAgIDogbGVuZ3RoKHJlZigkJHIpKSA/ICdSRUYnCisgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAnU0NBTEFSJzsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAqU2NhbGFyOjpVdGlsOjpyZWFkb25seSA9IHN1YiAoXCQpIHsKKyAgICAgICAgICAgICAgICBteSAkYiA9IEI6OnN2cmVmXzJvYmplY3QoICRfWzBdICk7CisgICAgICAgICAgICAgICAgJGItPkZMQUdTICYgMHgwMDgwMDAwMDsgIyBTVmZfUkVBRE9OTFk/CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDb21tb24gcHVyZSBwZXJsIG1ldGhvZHMsIHRha2VuIGFsbW9zdCBkaXJlY3RseSBmcm9tIFRleHQ6OkNTVl9YUy4KKyMgKFRoZXNlIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGEgY29tbW9uIGNsYXNzIGV2ZW50dWFsbHksIHNvIHRoYXQKKyMgYm90aCBYUyBhbmQgUFAgZG9uJ3QgbmVlZCB0byBhcHBseSB0aGUgc2FtZSBjaGFuZ2VzLikKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHZlcnNpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N1YiB2ZXJzaW9uIHsKKyAgICByZXR1cm4gJFZFUlNJT047Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIG5ldworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworbXkgJWRlZl9hdHRyID0gKAorICAgIGVvbAkJCQk9PiAnJywKKyAgICBzZXBfY2hhcgkJCT0+ICcsJywKKyAgICBxdW90ZV9jaGFyCQkJPT4gJyInLAorICAgIGVzY2FwZV9jaGFyCQkJPT4gJyInLAorICAgIGJpbmFyeQkJCT0+IDAsCisgICAgZGVjb2RlX3V0ZjgJCQk9PiAxLAorICAgIGF1dG9fZGlhZwkJCT0+IDAsCisgICAgZGlhZ192ZXJib3NlCQk9PiAwLAorICAgIHN0cmljdCAgICAgICAgICAgICAgPT4gMCwKKyAgICBibGFua19pc191bmRlZgkJPT4gMCwKKyAgICBlbXB0eV9pc191bmRlZgkJPT4gMCwKKyAgICBhbGxvd193aGl0ZXNwYWNlCQk9PiAwLAorICAgIGFsbG93X2xvb3NlX3F1b3RlcwkJPT4gMCwKKyAgICBhbGxvd19sb29zZV9lc2NhcGVzCQk9PiAwLAorICAgIGFsbG93X3VucXVvdGVkX2VzY2FwZQk9PiAwLAorICAgIGFsd2F5c19xdW90ZQkJPT4gMCwKKyAgICBxdW90ZV9lbXB0eQkJCT0+IDAsCisgICAgcXVvdGVfc3BhY2UJCQk9PiAxLAorICAgIHF1b3RlX2JpbmFyeQkJPT4gMSwKKyAgICBlc2NhcGVfbnVsbAkJCT0+IDEsCisgICAga2VlcF9tZXRhX2luZm8JCT0+IDAsCisgICAgdmVyYmF0aW0JCQk9PiAwLAorICAgIHR5cGVzCQkJPT4gdW5kZWYsCisgICAgY2FsbGJhY2tzCQkJPT4gdW5kZWYsCisKKyAgICBfRU9GCQkJPT4gMCwKKyAgICBfUkVDTk8JCQk9PiAwLAorICAgIF9TVEFUVVMJCQk9PiB1bmRlZiwKKyAgICBfRklFTERTCQkJPT4gdW5kZWYsCisgICAgX0ZGTEFHUwkJCT0+IHVuZGVmLAorICAgIF9TVFJJTkcJCQk9PiB1bmRlZiwKKyAgICBfRVJST1JfSU5QVVQJCT0+IHVuZGVmLAorICAgIF9DT0xVTU5fTkFNRVMJCT0+IHVuZGVmLAorICAgIF9CT1VORF9DT0xVTU5TCQk9PiB1bmRlZiwKKyAgICBfQUhFQUQJCQk9PiB1bmRlZiwKKyk7CisKK215ICVhdHRyX2FsaWFzID0gKAorICAgIHF1b3RlX2Fsd2F5cwkJPT4gImFsd2F5c19xdW90ZSIsCisgICAgdmVyYm9zZV9kaWFnCQk9PiAiZGlhZ192ZXJib3NlIiwKKyAgICBxdW90ZV9udWxsCQkJPT4gImVzY2FwZV9udWxsIiwKKyAgICApOworCitteSAkbGFzdF9uZXdfZXJyb3IgPSBUZXh0OjpDU1ZfUFAtPlNldERpYWcoMCk7CitteSAkbGFzdF9lcnJvcjsKKworIyBOT1QgYSBtZXRob2Q6IGlzIGFsc28gdXNlZCBiZWZvcmUgYmxlc3MKK3N1YiBfdW5oZWFsdGh5X3doaXRlc3BhY2UgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgJF9bMF0gb3IgcmV0dXJuIDA7ICMgbm8gY2hlY2tzIG5lZWRlZCB3aXRob3V0IGFsbG93X3doaXRlc3BhY2UKKworICAgIG15ICRxdW8gPSAkc2VsZi0+e3F1b3RlfTsKKyAgICBkZWZpbmVkICRxdW8gJiYgbGVuZ3RoICgkcXVvKSBvciAkcXVvID0gJHNlbGYtPntxdW90ZV9jaGFyfTsKKyAgICBteSAkZXNjID0gJHNlbGYtPntlc2NhcGVfY2hhcn07CisKKyAgICAoZGVmaW5lZCAkcXVvICYmICRxdW8gPX4gbS9eWyBcdF0vKSB8fCAoZGVmaW5lZCAkZXNjICYmICRlc2MgPX4gbS9eWyBcdF0vKSBhbmQKKyAgICAgICAgcmV0dXJuIDEwMDI7CisKKyAgICByZXR1cm4gMDsKKyAgICB9CisKK3N1YiBfY2hlY2tfc2FuaXR5IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJGVvbCA9ICRzZWxmLT57ZW9sfTsKKyAgICBteSAkc2VwID0gJHNlbGYtPntzZXB9OworICAgIGRlZmluZWQgJHNlcCAmJiBsZW5ndGggKCRzZXApIG9yICRzZXAgPSAkc2VsZi0+e3NlcF9jaGFyfTsKKyAgICBteSAkcXVvID0gJHNlbGYtPntxdW90ZX07CisgICAgZGVmaW5lZCAkcXVvICYmIGxlbmd0aCAoJHF1bykgb3IgJHF1byA9ICRzZWxmLT57cXVvdGVfY2hhcn07CisgICAgbXkgJGVzYyA9ICRzZWxmLT57ZXNjYXBlX2NoYXJ9OworCisjICAgIHVzZSBEUDs6OmRpYWcgKCJTRVA6ICciLCBEUGVlayAoJHNlcCksCisjICAgICAgICAgICAgICAgICInLCBRVU86ICciLCBEUGVlayAoJHF1byksCisjICAgICAgICAgICAgICAgICInLCBFU0M6ICciLCBEUGVlayAoJGVzYyksIiciKTsKKworICAgICMgc2VwX2NoYXIgc2hvdWxkIG5vdCBiZSB1bmRlZmluZWQKKyAgICBpZiAoZGVmaW5lZCAkc2VwICYmICRzZXAgbmUgIiIpIHsKKyAgICAgICAgbGVuZ3RoICgkc2VwKSA+IDE2ICAgICAgICAgICAgICAgIGFuZCByZXR1cm4gMTAwNjsKKyAgICAgICAgJHNlcCA9fiBtL1tcclxuXS8gICAgICAgICAgICAgICAgYW5kIHJldHVybiAxMDAzOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDA4OworICAgICAgICB9CisgICAgaWYgKGRlZmluZWQgJHF1bykgeworICAgICAgICBkZWZpbmVkICRzZXAgJiYgJHF1byBlcSAkc2VwICAgICAgICBhbmQgcmV0dXJuIDEwMDE7CisgICAgICAgIGxlbmd0aCAoJHF1bykgPiAxNiAgICAgICAgICAgICAgICBhbmQgcmV0dXJuIDEwMDc7CisgICAgICAgICRxdW8gPX4gbS9bXHJcbl0vICAgICAgICAgICAgICAgIGFuZCByZXR1cm4gMTAwMzsKKyAgICAgICAgfQorICAgIGlmIChkZWZpbmVkICRlc2MpIHsKKyAgICAgICAgZGVmaW5lZCAkc2VwICYmICRlc2MgZXEgJHNlcCAgICAgICAgYW5kIHJldHVybiAxMDAxOworICAgICAgICAkZXNjID1+IG0vW1xyXG5dLyAgICAgICAgICAgICAgICBhbmQgcmV0dXJuIDEwMDM7CisgICAgICAgIH0KKyAgICBpZiAoZGVmaW5lZCAkZW9sKSB7CisgICAgICAgIGxlbmd0aCAoJGVvbCkgPiAxNiAgICAgICAgICAgICAgICBhbmQgcmV0dXJuIDEwMDU7CisgICAgICAgIH0KKworICAgIHJldHVybiBfdW5oZWFsdGh5X3doaXRlc3BhY2UgKCRzZWxmLCAkc2VsZi0+e2FsbG93X3doaXRlc3BhY2V9KTsKKyAgICB9CisKK3N1YiBrbm93bl9hdHRyaWJ1dGVzIHsKKyAgICBzb3J0IGdyZXAgIW0vXl8vID0+ICJzZXAiLCAicXVvdGUiLCBrZXlzICVkZWZfYXR0cjsKKyAgICB9CisKK3N1YiBuZXcgeworICAgICRsYXN0X25ld19lcnJvciAgID0gVGV4dDo6Q1NWX1BQLT5TZXREaWFnKDEwMDAsCisgICAgICAgICd1c2FnZTogbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3IChbeyBvcHRpb24gPT4gdmFsdWUsIC4uLiB9XSk7Jyk7CisKKyAgICBteSAkcHJvdG8gPSBzaGlmdDsKKyAgICBteSAkY2xhc3MgPSByZWYgKCRwcm90bykgfHwgJHByb3RvCW9yICByZXR1cm47CisgICAgQF8gPiAwICYmICAgcmVmICRfWzBdIG5lICJIQVNIIglhbmQgcmV0dXJuOworICAgIG15ICRhdHRyICA9IHNoaWZ0IHx8IHt9OworICAgIG15ICVhdHRyICA9IG1hcCB7CisgICAgICAgIG15ICRrID0gbS9eW2EtekEtWl1cdyskLyA/IGxjICRfIDogJF87CisgICAgICAgIGV4aXN0cyAkYXR0cl9hbGlhc3ska30gYW5kICRrID0gJGF0dHJfYWxpYXN7JGt9OworICAgICAgICAkayA9PiAkYXR0ci0+eyRffTsKKyAgICAgICAgfSBrZXlzICUkYXR0cjsKKworICAgIG15ICRzZXBfYWxpYXNlZCA9IDA7CisgICAgaWYgKGV4aXN0cyAkYXR0cntzZXB9KSB7CisgICAgICAgICRhdHRye3NlcF9jaGFyfSA9IGRlbGV0ZSAkYXR0cntzZXB9OworICAgICAgICAkc2VwX2FsaWFzZWQgPSAxOworICAgICAgICB9CisgICAgbXkgJHF1b3RlX2FsaWFzZWQgPSAwOworICAgIGlmIChleGlzdHMgJGF0dHJ7cXVvdGV9KSB7CisgICAgICAgICRhdHRye3F1b3RlX2NoYXJ9ID0gZGVsZXRlICRhdHRye3F1b3RlfTsKKyAgICAgICAgJHF1b3RlX2FsaWFzZWQgPSAxOworICAgICAgICB9CisgICAgZm9yIChrZXlzICVhdHRyKSB7CisgICAgICAgIGlmIChtL15bYS16XS8gJiYgZXhpc3RzICRkZWZfYXR0cnskX30pIHsKKyAgICAgICAgICAgICMgdW5jb3ZlcmFibGUgY29uZGl0aW9uIGZhbHNlCisgICAgICAgICAgICBkZWZpbmVkICRhdHRyeyRffSAmJiBtL19jaGFyJC8gYW5kIHV0Zjg6OmRlY29kZSAoJGF0dHJ7JF99KTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisjICAgICAgICBjcm9haz8KKyAgICAgICAgJGxhc3RfbmV3X2Vycm9yID0gVGV4dDo6Q1NWX1BQLT5TZXREaWFnKDEwMDAsICJJTkkgLSBVbmtub3duIGF0dHJpYnV0ZSAnJF8nIik7CisgICAgICAgICRhdHRye2F1dG9fZGlhZ30gYW5kIGVycm9yX2RpYWcgKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIGlmICgkc2VwX2FsaWFzZWQgYW5kIGRlZmluZWQgJGF0dHJ7c2VwX2NoYXJ9KSB7CisgICAgICAgIG15IEBiID0gdW5wYWNrICJVMEMqIiwgJGF0dHJ7c2VwX2NoYXJ9OworICAgICAgICBpZiAoQGIgPiAxKSB7CisgICAgICAgICAgICAkYXR0cntzZXB9ID0gJGF0dHJ7c2VwX2NoYXJ9OworICAgICAgICAgICAgJGF0dHJ7c2VwX2NoYXJ9ID0gIlwwIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkYXR0cntzZXB9ID0gdW5kZWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBpZiAoJHF1b3RlX2FsaWFzZWQgYW5kIGRlZmluZWQgJGF0dHJ7cXVvdGVfY2hhcn0pIHsKKyAgICAgICAgbXkgQGIgPSB1bnBhY2sgIlUwQyoiLCAkYXR0cntxdW90ZV9jaGFyfTsKKyAgICAgICAgaWYgKEBiID4gMSkgeworICAgICAgICAgICAgJGF0dHJ7cXVvdGV9ID0gJGF0dHJ7cXVvdGVfY2hhcn07CisgICAgICAgICAgICAkYXR0cntxdW90ZV9jaGFyfSA9ICJcMCI7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJGF0dHJ7cXVvdGV9ID0gdW5kZWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIG15ICRzZWxmID0geyAlZGVmX2F0dHIsICVhdHRyIH07CisgICAgaWYgKG15ICRlYyA9IF9jaGVja19zYW5pdHkgKCRzZWxmKSkgeworICAgICAgICAkbGFzdF9uZXdfZXJyb3IgICA9IFRleHQ6OkNTVl9QUC0+U2V0RGlhZygkZWMpOworICAgICAgICAkYXR0cnthdXRvX2RpYWd9IGFuZCBlcnJvcl9kaWFnICgpOworICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e2NhbGxiYWNrc30gJiYgcmVmICRzZWxmLT57Y2FsbGJhY2tzfSBuZSAiSEFTSCIpIHsKKyAgICAgICAgQ2FycDo6Y2FycCAiVGhlICdjYWxsYmFja3MnIGF0dHJpYnV0ZSBpcyBzZXQgYnV0IGlzIG5vdCBhIGhhc2g6IGlnbm9yZWRcbiI7CisgICAgICAgICRzZWxmLT57Y2FsbGJhY2tzfSA9IHVuZGVmOworICAgICAgICB9CisKKyAgICAkbGFzdF9uZXdfZXJyb3IgPSBUZXh0OjpDU1ZfUFAtPlNldERpYWcoMCk7CisgICAgZGVmaW5lZCAkXCAmJiAhZXhpc3RzICRhdHRye2VvbH0gYW5kICRzZWxmLT57ZW9sfSA9ICRcOworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgZGVmaW5lZCAkc2VsZi0+e3R5cGVzfSBhbmQgJHNlbGYtPnR5cGVzICgkc2VsZi0+e3R5cGVzfSk7CisgICAgJHNlbGY7Cit9CisKKyMgS2VlcCBpbiBzeW5jIHdpdGggWFMhCitteSAlX2NhY2hlX2lkID0gKCAjIE9ubHkgZXhwb3NlIHdoYXQgaXMgYWNjZXNzZWQgZnJvbSB3aXRoaW4gUE0KKyAgICBxdW90ZV9jaGFyCQkJPT4gIDAsCisgICAgZXNjYXBlX2NoYXIJCQk9PiAgMSwKKyAgICBzZXBfY2hhcgkJCT0+ICAyLAorICAgIHNlcAkJCQk9PiAzOSwJIyAzOSAuLiA1NQorICAgIGJpbmFyeQkJCT0+ICAzLAorICAgIGtlZXBfbWV0YV9pbmZvCQk9PiAgNCwKKyAgICBhbHdheXNfcXVvdGUJCT0+ICA1LAorICAgIGFsbG93X2xvb3NlX3F1b3RlcwkJPT4gIDYsCisgICAgYWxsb3dfbG9vc2VfZXNjYXBlcwkJPT4gIDcsCisgICAgYWxsb3dfdW5xdW90ZWRfZXNjYXBlCT0+ICA4LAorICAgIGFsbG93X3doaXRlc3BhY2UJCT0+ICA5LAorICAgIGJsYW5rX2lzX3VuZGVmCQk9PiAxMCwKKyAgICBlb2wJCQkJPT4gMTEsCisgICAgcXVvdGUJCQk9PiAxNSwKKyAgICB2ZXJiYXRpbQkJCT0+IDIyLAorICAgIGVtcHR5X2lzX3VuZGVmCQk9PiAyMywKKyAgICBhdXRvX2RpYWcJCQk9PiAyNCwKKyAgICBkaWFnX3ZlcmJvc2UJCT0+IDMzLAorICAgIHF1b3RlX3NwYWNlCQkJPT4gMjUsCisgICAgcXVvdGVfZW1wdHkJCQk9PiAzNywKKyAgICBxdW90ZV9iaW5hcnkJCT0+IDMyLAorICAgIGVzY2FwZV9udWxsCQkJPT4gMzEsCisgICAgZGVjb2RlX3V0ZjgJCQk9PiAzNSwKKyAgICBfaGFzX2hvb2tzCQkJPT4gMzYsCisgICAgX2lzX2JvdW5kCQkJPT4gMjYsCSMgMjYgLi4gMjkKKyAgICBzdHJpY3QgICAJCQk9PiA1OCwKKyAgICApOworCitteSAlX2hpZGRlbl9jYWNoZV9pZCA9IHF3KAorICAgIHNlcF9sZW4JCTM4CisgICAgZW9sX2xlbgkJMTIKKyAgICBlb2xfaXNfY3IJCTEzCisgICAgcXVvX2xlbgkJMTYKKyAgICBfaGFzX2FoZWFkCQkzMAorICAgIGhhc19lcnJvcl9pbnB1dAkJMzQKKyk7CisKK215ICVfcmV2ZXJzZV9jYWNoZV9pZCA9ICgKKyAgICBtYXAoeyRfY2FjaGVfaWR7JF99ID0+ICRffSBrZXlzICVfY2FjaGVfaWQpLAorICAgIG1hcCh7JF9oaWRkZW5fY2FjaGVfaWR7JF99ID0+ICRffSBrZXlzICVfaGlkZGVuX2NhY2hlX2lkKSwKKyk7CisKKyMgQSBgY2hhcmFjdGVyJworc3ViIF9zZXRfYXR0cl9DIHsKKyAgICBteSAoJHNlbGYsICRuYW1lLCAkdmFsLCAkZWMpID0gQF87CisgICAgZGVmaW5lZCAkdmFsIG9yICR2YWwgPSAwOworICAgIHV0Zjg6OmRlY29kZSAoJHZhbCk7CisgICAgJHNlbGYtPnskbmFtZX0gPSAkdmFsOworICAgICRlYyA9IF9jaGVja19zYW5pdHkgKCRzZWxmKSBhbmQKKyAgICAgICAgY3JvYWsgKCRzZWxmLT5TZXREaWFnICgkZWMpKTsKKyAgICAkc2VsZi0+X2NhY2hlX3NldCAoJF9jYWNoZV9pZHskbmFtZX0sICR2YWwpOworICAgIH0KKworIyBBIGZsYWcKK3N1YiBfc2V0X2F0dHJfWCB7CisgICAgbXkgKCRzZWxmLCAkbmFtZSwgJHZhbCkgPSBAXzsKKyAgICBkZWZpbmVkICR2YWwgb3IgJHZhbCA9IDA7CisgICAgJHNlbGYtPnskbmFtZX0gPSAkdmFsOworICAgICRzZWxmLT5fY2FjaGVfc2V0ICgkX2NhY2hlX2lkeyRuYW1lfSwgMCArICR2YWwpOworICAgIH0KKworIyBBIG51bWJlcgorc3ViIF9zZXRfYXR0cl9OIHsKKyAgICBteSAoJHNlbGYsICRuYW1lLCAkdmFsKSA9IEBfOworICAgICRzZWxmLT57JG5hbWV9ID0gJHZhbDsKKyAgICAkc2VsZi0+X2NhY2hlX3NldCAoJF9jYWNoZV9pZHskbmFtZX0sIDAgKyAkdmFsKTsKKyAgICB9CisKKyMgQWNjZXNzb3IgbWV0aG9kcy4KKyMgICBJdCBpcyB1bndpc2UgdG8gY2hhbmdlIHRoZW0gaGFsZndheSB0aHJvdWdoIGEgc2luZ2xlIGZpbGUhCitzdWIgcXVvdGVfY2hhciB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBpZiAoQF8pIHsKKyAgICAgICAgJHNlbGYtPl9zZXRfYXR0cl9DICgicXVvdGVfY2hhciIsIHNoaWZ0KTsKKyAgICAgICAgJHNlbGYtPl9jYWNoZV9zZXQgKCRfY2FjaGVfaWR7cXVvdGV9LCAiIik7CisgICAgICAgIH0KKyAgICAkc2VsZi0+e3F1b3RlX2NoYXJ9OworICAgIH0KKworc3ViIHF1b3RlIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIGlmIChAXykgeworICAgICAgICBteSAkcXVvdGUgPSBzaGlmdDsKKyAgICAgICAgZGVmaW5lZCAkcXVvdGUgb3IgJHF1b3RlID0gIiI7CisgICAgICAgIHV0Zjg6OmRlY29kZSAoJHF1b3RlKTsKKyAgICAgICAgbXkgQGIgPSB1bnBhY2sgIlUwQyoiLCAkcXVvdGU7CisgICAgICAgIGlmIChAYiA+IDEpIHsKKyAgICAgICAgICAgIEBiID4gMTYgYW5kIGNyb2FrICgkc2VsZi0+U2V0RGlhZyAoMTAwNykpOworICAgICAgICAgICAgJHNlbGYtPnF1b3RlX2NoYXIgKCJcMCIpOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRzZWxmLT5xdW90ZV9jaGFyICgkcXVvdGUpOworICAgICAgICAgICAgJHF1b3RlID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICRzZWxmLT57cXVvdGV9ID0gJHF1b3RlOworCisgICAgICAgIG15ICRlYyA9IF9jaGVja19zYW5pdHkgKCRzZWxmKTsKKyAgICAgICAgJGVjIGFuZCBjcm9hayAoJHNlbGYtPlNldERpYWcgKCRlYykpOworCisgICAgICAgICRzZWxmLT5fY2FjaGVfc2V0ICgkX2NhY2hlX2lke3F1b3RlfSwgJHF1b3RlKTsKKyAgICAgICAgfQorICAgIG15ICRxdW90ZSA9ICRzZWxmLT57cXVvdGV9OworICAgIGRlZmluZWQgJHF1b3RlICYmIGxlbmd0aCAoJHF1b3RlKSA/ICRxdW90ZSA6ICRzZWxmLT57cXVvdGVfY2hhcn07CisgICAgfQorCitzdWIgZXNjYXBlX2NoYXIgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgQF8gYW5kICRzZWxmLT5fc2V0X2F0dHJfQyAoImVzY2FwZV9jaGFyIiwgc2hpZnQpOworICAgICRzZWxmLT57ZXNjYXBlX2NoYXJ9OworICAgIH0KKworc3ViIHNlcF9jaGFyIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIGlmIChAXykgeworICAgICAgICAkc2VsZi0+X3NldF9hdHRyX0MgKCJzZXBfY2hhciIsIHNoaWZ0KTsKKyAgICAgICAgJHNlbGYtPl9jYWNoZV9zZXQgKCRfY2FjaGVfaWR7c2VwfSwgIiIpOworICAgICAgICB9CisgICAgJHNlbGYtPntzZXBfY2hhcn07Cit9CisKK3N1YiBzZXAgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgaWYgKEBfKSB7CisgICAgICAgIG15ICRzZXAgPSBzaGlmdDsKKyAgICAgICAgZGVmaW5lZCAkc2VwIG9yICRzZXAgPSAiIjsKKyAgICAgICAgdXRmODo6ZGVjb2RlICgkc2VwKTsKKyAgICAgICAgbXkgQGIgPSB1bnBhY2sgIlUwQyoiLCAkc2VwOworICAgICAgICBpZiAoQGIgPiAxKSB7CisgICAgICAgICAgICBAYiA+IDE2IGFuZCBjcm9hayAoJHNlbGYtPlNldERpYWcgKDEwMDYpKTsKKyAgICAgICAgICAgICRzZWxmLT5zZXBfY2hhciAoIlwwIik7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJHNlbGYtPnNlcF9jaGFyICgkc2VwKTsKKyAgICAgICAgICAgICRzZXAgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgJHNlbGYtPntzZXB9ID0gJHNlcDsKKworICAgICAgICBteSAkZWMgPSBfY2hlY2tfc2FuaXR5ICgkc2VsZik7CisgICAgICAgICRlYyBhbmQgY3JvYWsgKCRzZWxmLT5TZXREaWFnICgkZWMpKTsKKworICAgICAgICAkc2VsZi0+X2NhY2hlX3NldCAoJF9jYWNoZV9pZHtzZXB9LCAkc2VwKTsKKyAgICAgICAgfQorICAgIG15ICRzZXAgPSAkc2VsZi0+e3NlcH07CisgICAgZGVmaW5lZCAkc2VwICYmIGxlbmd0aCAoJHNlcCkgPyAkc2VwIDogJHNlbGYtPntzZXBfY2hhcn07CisgICAgfQorCitzdWIgZW9sIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIGlmIChAXykgeworICAgICAgICBteSAkZW9sID0gc2hpZnQ7CisgICAgICAgIGRlZmluZWQgJGVvbCBvciAkZW9sID0gIiI7CisgICAgICAgIGxlbmd0aCAoJGVvbCkgPiAxNiBhbmQgY3JvYWsgKCRzZWxmLT5TZXREaWFnICgxMDA1KSk7CisgICAgICAgICRzZWxmLT57ZW9sfSA9ICRlb2w7CisgICAgICAgICRzZWxmLT5fY2FjaGVfc2V0ICgkX2NhY2hlX2lke2VvbH0sICRlb2wpOworICAgICAgICB9CisgICAgJHNlbGYtPntlb2x9OworICAgIH0KKworc3ViIGFsd2F5c19xdW90ZSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBAXyBhbmQgJHNlbGYtPl9zZXRfYXR0cl9YICgiYWx3YXlzX3F1b3RlIiwgc2hpZnQpOworICAgICRzZWxmLT57YWx3YXlzX3F1b3RlfTsKKyAgICB9CisKK3N1YiBxdW90ZV9zcGFjZSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBAXyBhbmQgJHNlbGYtPl9zZXRfYXR0cl9YICgicXVvdGVfc3BhY2UiLCBzaGlmdCk7CisgICAgJHNlbGYtPntxdW90ZV9zcGFjZX07CisgICAgfQorCitzdWIgcXVvdGVfZW1wdHkgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgQF8gYW5kICRzZWxmLT5fc2V0X2F0dHJfWCAoInF1b3RlX2VtcHR5Iiwgc2hpZnQpOworICAgICRzZWxmLT57cXVvdGVfZW1wdHl9OworICAgIH0KKworc3ViIGVzY2FwZV9udWxsIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIEBfIGFuZCAkc2VsZi0+X3NldF9hdHRyX1ggKCJlc2NhcGVfbnVsbCIsIHNoaWZ0KTsKKyAgICAkc2VsZi0+e2VzY2FwZV9udWxsfTsKKyAgICB9CisKK3N1YiBxdW90ZV9udWxsIHsgZ290byAmZXNjYXBlX251bGw7IH0KKworc3ViIHF1b3RlX2JpbmFyeSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBAXyBhbmQgJHNlbGYtPl9zZXRfYXR0cl9YICgicXVvdGVfYmluYXJ5Iiwgc2hpZnQpOworICAgICRzZWxmLT57cXVvdGVfYmluYXJ5fTsKKyAgICB9CisKK3N1YiBiaW5hcnkgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgQF8gYW5kICRzZWxmLT5fc2V0X2F0dHJfWCAoImJpbmFyeSIsIHNoaWZ0KTsKKyAgICAkc2VsZi0+e2JpbmFyeX07CisgICAgfQorCitzdWIgc3RyaWN0IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIEBfIGFuZCAkc2VsZi0+X3NldF9hdHRyX1ggKCJzdHJpY3QiLCBzaGlmdCk7CisgICAgJHNlbGYtPntzdHJpY3R9OworICAgIH0KKworc3ViIGRlY29kZV91dGY4IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIEBfIGFuZCAkc2VsZi0+X3NldF9hdHRyX1ggKCJkZWNvZGVfdXRmOCIsIHNoaWZ0KTsKKyAgICAkc2VsZi0+e2RlY29kZV91dGY4fTsKK30KKworc3ViIGtlZXBfbWV0YV9pbmZvIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIGlmIChAXykgeworICAgICAgICBteSAkdiA9IHNoaWZ0OworICAgICAgICAhZGVmaW5lZCAkdiB8fCAkdiBlcSAiIiBhbmQgJHYgPSAwOworICAgICAgICAkdiA9fiBtL15bMC05XS8gb3IgJHYgPSBsYyAkdiBlcSAiZmFsc2UiID8gMCA6IDE7ICMgdHJ1ZS90cnV0aCA9IDEKKyAgICAgICAgJHNlbGYtPl9zZXRfYXR0cl9YICgia2VlcF9tZXRhX2luZm8iLCAkdik7CisgICAgICAgIH0KKyAgICAkc2VsZi0+e2tlZXBfbWV0YV9pbmZvfTsKKyAgICB9CisKK3N1YiBhbGxvd19sb29zZV9xdW90ZXMgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgQF8gYW5kICRzZWxmLT5fc2V0X2F0dHJfWCAoImFsbG93X2xvb3NlX3F1b3RlcyIsIHNoaWZ0KTsKKyAgICAkc2VsZi0+e2FsbG93X2xvb3NlX3F1b3Rlc307CisgICAgfQorCitzdWIgYWxsb3dfbG9vc2VfZXNjYXBlcyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBAXyBhbmQgJHNlbGYtPl9zZXRfYXR0cl9YICgiYWxsb3dfbG9vc2VfZXNjYXBlcyIsIHNoaWZ0KTsKKyAgICAkc2VsZi0+e2FsbG93X2xvb3NlX2VzY2FwZXN9OworICAgIH0KKworc3ViIGFsbG93X3doaXRlc3BhY2UgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgaWYgKEBfKSB7CisgICAgICAgIG15ICRhdyA9IHNoaWZ0OworICAgICAgICBfdW5oZWFsdGh5X3doaXRlc3BhY2UgKCRzZWxmLCAkYXcpIGFuZAorICAgICAgICAgICAgY3JvYWsgKCRzZWxmLT5TZXREaWFnICgxMDAyKSk7CisgICAgICAgICRzZWxmLT5fc2V0X2F0dHJfWCAoImFsbG93X3doaXRlc3BhY2UiLCAkYXcpOworICAgICAgICB9CisgICAgJHNlbGYtPnthbGxvd193aGl0ZXNwYWNlfTsKKyAgICB9CisKK3N1YiBhbGxvd191bnF1b3RlZF9lc2NhcGUgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgQF8gYW5kICRzZWxmLT5fc2V0X2F0dHJfWCAoImFsbG93X3VucXVvdGVkX2VzY2FwZSIsIHNoaWZ0KTsKKyAgICAkc2VsZi0+e2FsbG93X3VucXVvdGVkX2VzY2FwZX07CisgICAgfQorCitzdWIgYmxhbmtfaXNfdW5kZWYgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgQF8gYW5kICRzZWxmLT5fc2V0X2F0dHJfWCAoImJsYW5rX2lzX3VuZGVmIiwgc2hpZnQpOworICAgICRzZWxmLT57YmxhbmtfaXNfdW5kZWZ9OworICAgIH0KKworc3ViIGVtcHR5X2lzX3VuZGVmIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIEBfIGFuZCAkc2VsZi0+X3NldF9hdHRyX1ggKCJlbXB0eV9pc191bmRlZiIsIHNoaWZ0KTsKKyAgICAkc2VsZi0+e2VtcHR5X2lzX3VuZGVmfTsKKyAgICB9CisKK3N1YiB2ZXJiYXRpbSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBAXyBhbmQgJHNlbGYtPl9zZXRfYXR0cl9YICgidmVyYmF0aW0iLCBzaGlmdCk7CisgICAgJHNlbGYtPnt2ZXJiYXRpbX07CisgICAgfQorCitzdWIgYXV0b19kaWFnIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIGlmIChAXykgeworICAgICAgICBteSAkdiA9IHNoaWZ0OworICAgICAgICAhZGVmaW5lZCAkdiB8fCAkdiBlcSAiIiBhbmQgJHYgPSAwOworICAgICAgICAkdiA9fiBtL15bMC05XS8gb3IgJHYgPSBsYyAkdiBlcSAiZmFsc2UiID8gMCA6IDE7ICMgdHJ1ZS90cnV0aCA9IDEKKyAgICAgICAgJHNlbGYtPl9zZXRfYXR0cl9YICgiYXV0b19kaWFnIiwgJHYpOworICAgICAgICB9CisgICAgJHNlbGYtPnthdXRvX2RpYWd9OworICAgIH0KKworc3ViIGRpYWdfdmVyYm9zZSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBpZiAoQF8pIHsKKyAgICAgICAgbXkgJHYgPSBzaGlmdDsKKyAgICAgICAgIWRlZmluZWQgJHYgfHwgJHYgZXEgIiIgYW5kICR2ID0gMDsKKyAgICAgICAgJHYgPX4gbS9eWzAtOV0vIG9yICR2ID0gbGMgJHYgZXEgImZhbHNlIiA/IDAgOiAxOyAjIHRydWUvdHJ1dGggPSAxCisgICAgICAgICRzZWxmLT5fc2V0X2F0dHJfWCAoImRpYWdfdmVyYm9zZSIsICR2KTsKKyAgICAgICAgfQorICAgICRzZWxmLT57ZGlhZ192ZXJib3NlfTsKKyAgICB9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHN0YXR1cworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3ViIHN0YXR1cyB7CisgICAgJF9bMF0tPntfU1RBVFVTfTsKK30KKworc3ViIGVvZiB7CisgICAgJF9bMF0tPntfRU9GfTsKK30KKworc3ViIHR5cGVzIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKEBfKSB7CisgICAgICAgIGlmIChteSAkdHlwZXMgPSBzaGlmdCkgeworICAgICAgICAgICAgJHNlbGYtPnsnX3R5cGVzJ30gPSBqb2luKCIiLCBtYXB7IGNocigkXykgfSBAJHR5cGVzKTsKKyAgICAgICAgICAgICRzZWxmLT57J3R5cGVzJ30gPSAkdHlwZXM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkZWxldGUgJHNlbGYtPnsndHlwZXMnfTsKKyAgICAgICAgICAgIGRlbGV0ZSAkc2VsZi0+eydfdHlwZXMnfTsKKyAgICAgICAgICAgIHVuZGVmOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+eyd0eXBlcyd9OworICAgIH0KK30KKworc3ViIGNhbGxiYWNrcyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBpZiAoQF8pIHsKKyAgICAgICAgbXkgJGNiOworICAgICAgICBteSAkaGYgPSAweDAwOworICAgICAgICBpZiAoZGVmaW5lZCAkX1swXSkgeworICAgICAgICAgICAgZ3JlcCB7ICFkZWZpbmVkIH0gQF8gYW5kIGNyb2FrICgkc2VsZi0+U2V0RGlhZyAoMTAwNCkpOworICAgICAgICAgICAgJGNiID0gQF8gPT0gMSAmJiByZWYgJF9bMF0gZXEgIkhBU0giID8gc2hpZnQKKyAgICAgICAgICAgICAgICA6IEBfICUgMiA9PSAwICAgICAgICAgICAgICAgICAgICA/IHsgQF8gfQorICAgICAgICAgICAgICAgIDogY3JvYWsgKCRzZWxmLT5TZXREaWFnICgxMDA0KSk7CisgICAgICAgICAgICBmb3JlYWNoIG15ICRjYmsgKGtleXMgJSRjYikgeworICAgICAgICAgICAgICAgICghcmVmICRjYmsgJiYgJGNiayA9fiBtL15bXHcuXSskLykgJiYgcmVmICRjYi0+eyRjYmt9IGVxICJDT0RFIiBvcgorICAgICAgICAgICAgICAgICAgICBjcm9hayAoJHNlbGYtPlNldERpYWcgKDEwMDQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBleGlzdHMgJGNiLT57ZXJyb3J9ICAgICAgICBhbmQgJGhmIHw9IDB4MDE7CisgICAgICAgICAgICBleGlzdHMgJGNiLT57YWZ0ZXJfcGFyc2V9ICBhbmQgJGhmIHw9IDB4MDI7CisgICAgICAgICAgICBleGlzdHMgJGNiLT57YmVmb3JlX3ByaW50fSBhbmQgJGhmIHw9IDB4MDQ7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2lmIChAXyA+IDEpIHsKKyAgICAgICAgICAgICMgKHVuZGVmLCB3aGF0ZXZlcikKKyAgICAgICAgICAgIGNyb2FrICgkc2VsZi0+U2V0RGlhZyAoMTAwNCkpOworICAgICAgICAgICAgfQorICAgICAgICAkc2VsZi0+X3NldF9hdHRyX1ggKCJfaGFzX2hvb2tzIiwgJGhmKTsKKyAgICAgICAgJHNlbGYtPntjYWxsYmFja3N9ID0gJGNiOworICAgICAgICB9CisgICAgJHNlbGYtPntjYWxsYmFja3N9OworICAgIH0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZXJyb3JfZGlhZworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3ViIGVycm9yX2RpYWcgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgQGRpYWcgPSAoMCArICRsYXN0X25ld19lcnJvciwgJGxhc3RfbmV3X2Vycm9yLCAwLCAwLCAwKTsKKworICAgIGlmICgkc2VsZiAmJiByZWYgJHNlbGYgJiYgIyBOb3QgYSBjbGFzcyBtZXRob2Qgb3IgZGlyZWN0IGNhbGwKKyAgICAgICAgICRzZWxmLT5pc2EgKF9fUEFDS0FHRV9fKSAmJiBkZWZpbmVkICRzZWxmLT57X0VSUk9SX0RJQUd9KSB7CisgICAgICAgICRkaWFnWzBdID0gMCArICRzZWxmLT57X0VSUk9SX0RJQUd9OworICAgICAgICAkZGlhZ1sxXSA9ICAgICAkc2VsZi0+e19FUlJPUl9ESUFHfTsKKyAgICAgICAgJGRpYWdbMl0gPSAxICsgJHNlbGYtPntfRVJST1JfUE9TfSBpZiBleGlzdHMgJHNlbGYtPntfRVJST1JfUE9TfTsKKyAgICAgICAgJGRpYWdbM10gPSAgICAgJHNlbGYtPntfUkVDTk99OworICAgICAgICAkZGlhZ1s0XSA9ICAgICAkc2VsZi0+e19FUlJPUl9GTER9IGlmIGV4aXN0cyAkc2VsZi0+e19FUlJPUl9GTER9OworCisgICAgICAgICRkaWFnWzBdICYmICRzZWxmICYmICRzZWxmLT57Y2FsbGJhY2tzfSAmJiAkc2VsZi0+e2NhbGxiYWNrc317ZXJyb3J9IGFuZAorICAgICAgICAgICAgcmV0dXJuICRzZWxmLT57Y2FsbGJhY2tzfXtlcnJvcn0tPihAZGlhZyk7CisgICAgICAgIH0KKworICAgIG15ICRjb250ZXh0ID0gd2FudGFycmF5OworCisgICAgdW5sZXNzIChkZWZpbmVkICRjb250ZXh0KSB7CSMgVm9pZCBjb250ZXh0LCBhdXRvLWRpYWcKKyAgICAgICAgaWYgKCRkaWFnWzBdICYmICRkaWFnWzBdICE9IDIwMTIpIHsKKyAgICAgICAgICAgIG15ICRtc2cgPSAiIyBDU1ZfUFAgRVJST1I6ICRkaWFnWzBdIC0gJGRpYWdbMV0gXEAgcmVjICRkaWFnWzNdIHBvcyAkZGlhZ1syXVxuIjsKKyAgICAgICAgICAgICRkaWFnWzRdIGFuZCAkbXNnID1+IHMvJC8gZmllbGQgJGRpYWdbNF0vOworCisgICAgICAgICAgICB1bmxlc3MgKCRzZWxmICYmIHJlZiAkc2VsZikgeyAgICAgICAgIyBhdXRvX2RpYWcKKyAgICAgICAgICAgICAgICAgICAgIyBjYWxsZWQgd2l0aG91dCBhcmdzIGluIHZvaWQgY29udGV4dAorICAgICAgICAgICAgICAgIHdhcm4gJG1zZzsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoJHNlbGYtPntkaWFnX3ZlcmJvc2V9IGFuZCAkc2VsZi0+e19FUlJPUl9JTlBVVH0pIHsKKyAgICAgICAgICAgICAgICAkbXNnIC49ICIkc2VsZi0+e19FUlJPUl9JTlBVVH0nXG4iOworICAgICAgICAgICAgICAgICRtc2cgLj0gIiAiIHggKCRkaWFnWzJdIC0gMSk7CisgICAgICAgICAgICAgICAgJG1zZyAuPSAiXlxuIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG15ICRsdmwgPSAkc2VsZi0+e2F1dG9fZGlhZ307CisgICAgICAgICAgICBpZiAoJGx2bCA8IDIpIHsKKyAgICAgICAgICAgICAgICBteSBAYyA9IGNhbGxlciAoMik7CisgICAgICAgICAgICAgICAgaWYgKEBjID49IDExICYmICRjWzEwXSAmJiByZWYgJGNbMTBdIGVxICJIQVNIIikgeworICAgICAgICAgICAgICAgICAgICBteSAkaGludHMgPSAkY1sxMF07CisgICAgICAgICAgICAgICAgICAgIChleGlzdHMgJGhpbnRzLT57YXV0b2RpZX0gJiYgJGhpbnRzLT57YXV0b2RpZX0gb3IKKyAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyAkaGludHMtPnsiZ3VhcmQgRmF0YWwifSAmJgorICAgICAgICAgICAgICAgICAgICAhZXhpc3RzICRoaW50cy0+eyJubyBGYXRhbCJ9KSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICRsdmwrKzsKKyAgICAgICAgICAgICAgICAgICAgIyBGdXR1cmUgcmVsZWFzZXMgb2YgYXV0b2RpZSB3aWxsIHByb2JhYmx5IHNldCAkXkh7YXV0b2RpZX0KKyAgICAgICAgICAgICAgICAgICAgIyAgdG8gImF1dG9kaWUgQGFyZ3MiLCBsaWtlICJhdXRvZGllIDphbGwiIG9yICJhdXRvZGllIG9wZW4iCisgICAgICAgICAgICAgICAgICAgICMgIHNvIHdlIGNhbi9zaG91bGQgY2hlY2sgZm9yICJvcGVuIiBvciAibmV3IgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgJGx2bCA+IDEgPyBkaWUgJG1zZyA6IHdhcm4gJG1zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICByZXR1cm4gJGNvbnRleHQgPyBAZGlhZyA6ICRkaWFnWzFdOworfQorCitzdWIgcmVjb3JkX251bWJlciB7CisgICAgcmV0dXJuIHNoaWZ0LT57X1JFQ05PfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc3RyaW5nCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisqc3RyaW5nID0gXCZfc3RyaW5nOworc3ViIF9zdHJpbmcgeworICAgIGRlZmluZWQgJF9bMF0tPntfU1RSSU5HfSA/ICR7ICRfWzBdLT57X1NUUklOR30gfSA6IHVuZGVmOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBmaWVsZHMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKypmaWVsZHMgPSBcJl9maWVsZHM7CitzdWIgX2ZpZWxkcyB7CisgICAgcmVmKCRfWzBdLT57X0ZJRUxEU30pID8gIEB7JF9bMF0tPntfRklFTERTfX0gOiB1bmRlZjsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbWV0YV9pbmZvCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzdWIgbWV0YV9pbmZvIHsKKyAgICAkX1swXS0+e19GRkxBR1N9ID8gQHsgJF9bMF0tPntfRkZMQUdTfSB9IDogdW5kZWY7Cit9CisKK3N1YiBpc19xdW90ZWQgeworICAgIHJldHVybiB1bmxlc3MgKGRlZmluZWQgJF9bMF0tPntfRkZMQUdTfSk7CisgICAgcmV0dXJuIGlmKCAkX1sxXSA9fiAvXEQvIG9yICRfWzFdIDwgMCBvciAgJF9bMV0gPiAkI3sgJF9bMF0tPntfRkZMQUdTfSB9ICk7CisKKyAgICAkX1swXS0+e19GRkxBR1N9LT5bJF9bMV1dICYgSVNfUVVPVEVEID8gMSA6IDA7Cit9CisKK3N1YiBpc19iaW5hcnkgeworICAgIHJldHVybiB1bmxlc3MgKGRlZmluZWQgJF9bMF0tPntfRkZMQUdTfSk7CisgICAgcmV0dXJuIGlmKCAkX1sxXSA9fiAvXEQvIG9yICRfWzFdIDwgMCBvciAgJF9bMV0gPiAkI3sgJF9bMF0tPntfRkZMQUdTfSB9ICk7CisgICAgJF9bMF0tPntfRkZMQUdTfS0+WyRfWzFdXSAmIElTX0JJTkFSWSA/IDEgOiAwOworfQorCitzdWIgaXNfbWlzc2luZyB7CisgICAgbXkgKCRzZWxmLCAkaWR4LCAkdmFsKSA9IEBfOworICAgIHJldHVybiB1bmxlc3MgJHNlbGYtPntrZWVwX21ldGFfaW5mb307ICMgRklYTUUKKyAgICAkaWR4IDwgMCB8fCAhcmVmICRzZWxmLT57X0ZGTEFHU30gYW5kIHJldHVybjsKKyAgICAkaWR4ID49IEB7JHNlbGYtPntfRkZMQUdTfX0gYW5kIHJldHVybiAxOworICAgICRzZWxmLT57X0ZGTEFHU31bJGlkeF0gJiBJU19NSVNTSU5HID8gMSA6IDA7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGNvbWJpbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisqY29tYmluZSA9IFwmX2NvbWJpbmU7CitzdWIgX2NvbWJpbmUgeworICAgIG15ICgkc2VsZiwgQGZpZWxkcykgPSBAXzsKKyAgICBteSAkc3RyICA9ICIiOworICAgICRzZWxmLT57X0ZJRUxEU30gPSBcQGZpZWxkczsKKyAgICAkc2VsZi0+e19TVEFUVVN9ID0gKEBmaWVsZHMgPiAwKSAmJiAkc2VsZi0+X19jb21iaW5lKFwkc3RyLCBcQGZpZWxkcywgMCk7CisgICAgJHNlbGYtPntfU1RSSU5HfSA9IFwkc3RyOworICAgICRzZWxmLT57X1NUQVRVU307CisgICAgfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBwYXJzZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKypwYXJzZSA9IFwmX3BhcnNlOworc3ViIF9wYXJzZSB7CisgICAgbXkgKCRzZWxmLCAkc3RyKSA9IEBfOworCisgICAgcmVmICRzdHIgYW5kIGNyb2FrICgkc2VsZi0+U2V0RGlhZyAoMTUwMCkpOworCisgICAgbXkgJGZpZWxkcyA9IFtdOworICAgIG15ICRmZmxhZ3MgPSBbXTsKKyAgICAkc2VsZi0+e19TVFJJTkd9ID0gXCRzdHI7CisgICAgaWYgKGRlZmluZWQgJHN0ciAmJiAkc2VsZi0+X19wYXJzZSAoJGZpZWxkcywgJGZmbGFncywgJHN0ciwgMCkpIHsKKyAgICAgICAgJHNlbGYtPntfRklFTERTfSA9ICRmaWVsZHM7CisgICAgICAgICRzZWxmLT57X0ZGTEFHU30gPSAkZmZsYWdzOworICAgICAgICAkc2VsZi0+e19TVEFUVVN9ID0gMTsKKyAgICAgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19GSUVMRFN9ID0gdW5kZWY7CisgICAgICAgICRzZWxmLT57X0ZGTEFHU30gPSB1bmRlZjsKKyAgICAgICAgJHNlbGYtPntfU1RBVFVTfSA9IDA7CisgICAgICAgIH0KKyAgICAkc2VsZi0+e19TVEFUVVN9OworICAgIH0KKworc3ViIGNvbHVtbl9uYW1lcyB7CisgICAgbXkgKCAkc2VsZiwgQGNvbHVtbnMgKSA9IEBfOworCisgICAgQGNvbHVtbnMgb3IgcmV0dXJuIGRlZmluZWQgJHNlbGYtPntfQ09MVU1OX05BTUVTfSA/IEB7JHNlbGYtPntfQ09MVU1OX05BTUVTfX0gOiAoKTsKKyAgICBAY29sdW1ucyA9PSAxICYmICEgZGVmaW5lZCAkY29sdW1uc1swXSBhbmQgcmV0dXJuICRzZWxmLT57X0NPTFVNTl9OQU1FU30gPSB1bmRlZjsKKworICAgIGlmICggQGNvbHVtbnMgPT0gMSAmJiByZWYgJGNvbHVtbnNbMF0gZXEgIkFSUkFZIiApIHsKKyAgICAgICAgQGNvbHVtbnMgPSBAeyAkY29sdW1uc1swXSB9OworICAgIH0KKyAgICBlbHNpZiAoIGpvaW4gIiIsIG1hcCB7IGRlZmluZWQgJF8gPyByZWYgJF8gOiAiIiB9IEBjb2x1bW5zICkgeworICAgICAgICBjcm9hayAkc2VsZi0+U2V0RGlhZyggMzAwMSApOworICAgIH0KKworICAgIGlmICggJHNlbGYtPntfQk9VTkRfQ09MVU1OU30gJiYgQGNvbHVtbnMgIT0gQHskc2VsZi0+e19CT1VORF9DT0xVTU5TfX0gKSB7CisgICAgICAgIGNyb2FrICRzZWxmLT5TZXREaWFnKCAzMDAzICk7CisgICAgfQorCisgICAgJHNlbGYtPntfQ09MVU1OX05BTUVTfSA9IFsgbWFwIHsgZGVmaW5lZCAkXyA/ICRfIDogIlxjQVVOREVGXGNBIiB9IEBjb2x1bW5zIF07CisgICAgQHsgJHNlbGYtPntfQ09MVU1OX05BTUVTfSB9OworfQorCitzdWIgaGVhZGVyIHsKKyAgICBteSAoJHNlbGYsICRmaCwgQGFyZ3MpID0gQF87CisKKyAgICAkZmggb3IgY3JvYWsgKCRzZWxmLT5TZXREaWFnICgxMDE0KSk7CisKKyAgICBteSAoQHNlcHMsICVhcmdzKTsKKyAgICBmb3IgKEBhcmdzKSB7CisgICAgICAgIGlmIChyZWYgJF8gZXEgIkFSUkFZIikgeworICAgICAgICAgICAgcHVzaCBAc2VwcywgQCRfOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHJlZiAkXyBlcSAiSEFTSCIpIHsKKyAgICAgICAgICAgICVhcmdzID0gJSRfOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY3JvYWsgKHF7dXNhZ2U6ICRjc3YtPmhlYWRlciAoJGZoLCBbIHNlcHMgXSwgeyBvcHRpb25zIH0pfSk7CisgICAgICAgIH0KKworICAgIGRlZmluZWQgJGFyZ3N7ZGV0ZWN0X2JvbX0gICAgICAgICBvciAkYXJnc3tkZXRlY3RfYm9tfSAgICAgICAgID0gMTsKKyAgICBkZWZpbmVkICRhcmdze211bmdlX2NvbHVtbl9uYW1lc30gb3IgJGFyZ3N7bXVuZ2VfY29sdW1uX25hbWVzfSA9ICJsYyI7CisgICAgZGVmaW5lZCAkYXJnc3tzZXRfY29sdW1uX25hbWVzfSAgIG9yICRhcmdze3NldF9jb2x1bW5fbmFtZXN9ICAgPSAxOworCisgICAgZGVmaW5lZCAkYXJnc3tzZXBfc2V0fSAmJiByZWYgJGFyZ3N7c2VwX3NldH0gZXEgIkFSUkFZIiBhbmQKKyAgICAgICAgQHNlcHMgPSAgQHskYXJnc3tzZXBfc2V0fX07CisKKyAgICBteSAkaGRyID0gPCRmaD47CisgICAgZGVmaW5lZCAkaGRyICYmICRoZHIgbmUgIiIgb3IgY3JvYWsgKCRzZWxmLT5TZXREaWFnICgxMDEwKSk7CisKKyAgICBteSAlc2VwOworICAgIEBzZXBzIG9yIEBzZXBzID0gKCIsIiwgIjsiKTsKKyAgICBmb3JlYWNoIG15ICRzZXAgKEBzZXBzKSB7CisgICAgICAgIGluZGV4ICgkaGRyLCAkc2VwKSA+PSAwIGFuZCAkc2VweyRzZXB9Kys7CisgICAgICAgIH0KKworICAgIGtleXMgJXNlcCA+PSAyIGFuZCBjcm9hayAoJHNlbGYtPlNldERpYWcgKDEwMTEpKTsKKworICAgICRzZWxmLT5zZXAgKGtleXMgJXNlcCk7CisgICAgbXkgJGVuYyA9ICIiOworICAgIGlmICgkYXJnc3tkZXRlY3RfYm9tfSkgeyAjIFVURi03IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgaWYgKCRoZHIgPX4gcy9eXHgwMFx4MDBceGZlXHhmZi8vKSB7ICRlbmMgPSAidXRmLTMyYmUiICAgfQorICAgICAgICBlbHNpZiAoJGhkciA9fiBzL15ceGZmXHhmZVx4MDBceDAwLy8pIHsgJGVuYyA9ICJ1dGYtMzJsZSIgICB9CisgICAgICAgIGVsc2lmICgkaGRyID1+IHMvXlx4ZmVceGZmLy8pICAgICAgICAgeyAkZW5jID0gInV0Zi0xNmJlIiAgIH0KKyAgICAgICAgZWxzaWYgKCRoZHIgPX4gcy9eXHhmZlx4ZmUvLykgICAgICAgICB7ICRlbmMgPSAidXRmLTE2bGUiICAgfQorICAgICAgICBlbHNpZiAoJGhkciA9fiBzL15ceGVmXHhiYlx4YmYvLykgICAgIHsgJGVuYyA9ICJ1dGYtOCIgICAgICB9CisgICAgICAgIGVsc2lmICgkaGRyID1+IHMvXlx4ZjdceDY0XHg0Yy8vKSAgICAgeyAkZW5jID0gInV0Zi0xIiAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRoZHIgPX4gcy9eXHhkZFx4NzNceDY2XHg3My8vKSB7ICRlbmMgPSAidXRmLWViY2RpYyIgfQorICAgICAgICBlbHNpZiAoJGhkciA9fiBzL15ceDBlXHhmZVx4ZmYvLykgICAgIHsgJGVuYyA9ICJzY3N1IiAgICAgICB9CisgICAgICAgIGVsc2lmICgkaGRyID1+IHMvXlx4ZmJceGVlXHgyOC8vKSAgICAgeyAkZW5jID0gImJvY3UtMSIgICAgIH0KKyAgICAgICAgZWxzaWYgKCRoZHIgPX4gcy9eXHg4NFx4MzFceDk1XHgzMy8vKSB7ICRlbmMgPSAiZ2ItMTgwMzAiICAgfQorCisgICAgICAgIGlmICgkZW5jKSB7CisgICAgICAgICAgICBpZiAoJGVuYyA9fiBtLyhbMTNdKS5sZSQvKSB7CisgICAgICAgICAgICAgICAgbXkgJGwgPSAwICsgJDE7CisgICAgICAgICAgICAgICAgbXkgJHg7CisgICAgICAgICAgICAgICAgJGhkciAuPSAiXDAiIHggJGw7CisgICAgICAgICAgICAgICAgcmVhZCAkZmgsICR4LCAkbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAkZW5jID0gIjplbmNvZGluZygkZW5jKSI7CisgICAgICAgICAgICBiaW5tb2RlICRmaCwgJGVuYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgJGFyZ3N7bXVuZ2VfY29sdW1uX25hbWVzfSBlcSAibGMiIGFuZCAkaGRyID0gbGMgJGhkcjsKKyAgICAkYXJnc3ttdW5nZV9jb2x1bW5fbmFtZXN9IGVxICJ1YyIgYW5kICRoZHIgPSB1YyAkaGRyOworCisgICAgbXkgJGhyID0gXCRoZHI7ICMgV2lsbCBjYXVzZSBjcm9hayBvbiBwZXJsLTUuNi54CisgICAgb3BlbiBteSAkaCwgIjwkZW5jIiwgJGhyOworICAgIG15ICRyb3cgPSAkc2VsZi0+Z2V0bGluZSAoJGgpIG9yIGNyb2FrOworICAgIGNsb3NlICRoOworCisgICAgbXkgQGhkciA9IEAkcm93ICAgb3IgIGNyb2FrICgkc2VsZi0+U2V0RGlhZyAoMTAxMCkpOworICAgIHJlZiAkYXJnc3ttdW5nZV9jb2x1bW5fbmFtZXN9IGVxICJDT0RFIiBhbmQKKyAgICAgICAgQGhkciA9IG1hcCB7ICRhcmdze211bmdlX2NvbHVtbl9uYW1lc30tPigkXykgfSBAaGRyOworICAgIG15ICVoZHIgPSBtYXAgeyAkXyA9PiAxIH0gQGhkcjsKKyAgICBleGlzdHMgJGhkcnsiIn0gICBhbmQgY3JvYWsgKCRzZWxmLT5TZXREaWFnICgxMDEyKSk7CisgICAga2V5cyAlaGRyID09IEBoZHIgb3IgIGNyb2FrICgkc2VsZi0+U2V0RGlhZyAoMTAxMykpOworICAgICRhcmdze3NldF9jb2x1bW5fbmFtZXN9IGFuZCAkc2VsZi0+Y29sdW1uX25hbWVzIChAaGRyKTsKKyAgICB3YW50YXJyYXkgPyBAaGRyIDogJHNlbGY7CisgICAgfQorCitzdWIgYmluZF9jb2x1bW5zIHsKKyAgICBteSAoICRzZWxmLCBAcmVmcyApID0gQF87CisKKyAgICBAcmVmcyBvciByZXR1cm4gZGVmaW5lZCAkc2VsZi0+e19CT1VORF9DT0xVTU5TfSA/IEB7JHNlbGYtPntfQk9VTkRfQ09MVU1OU319IDogdW5kZWY7CisgICAgQHJlZnMgPT0gMSAmJiAhIGRlZmluZWQgJHJlZnNbMF0gYW5kIHJldHVybiAkc2VsZi0+e19CT1VORF9DT0xVTU5TfSA9IHVuZGVmOworCisgICAgaWYgKCAkc2VsZi0+e19DT0xVTU5fTkFNRVN9ICYmIEByZWZzICE9IEB7JHNlbGYtPntfQ09MVU1OX05BTUVTfX0gKSB7CisgICAgICAgIGNyb2FrICRzZWxmLT5TZXREaWFnKCAzMDAzICk7CisgICAgfQorCisgICAgaWYgKCBncmVwIHsgcmVmICRfIG5lICJTQ0FMQVIiIH0gQHJlZnMgKSB7ICMgd2h5IGRvbid0IHVzZSBncmVwPworICAgICAgICBjcm9hayAkc2VsZi0+U2V0RGlhZyggMzAwNCApOworICAgIH0KKworICAgICRzZWxmLT5fc2V0X2F0dHJfTigiX2lzX2JvdW5kIiwgc2NhbGFyIEByZWZzKTsKKyAgICAkc2VsZi0+e19CT1VORF9DT0xVTU5TfSA9IFsgQHJlZnMgXTsKKyAgICBAcmVmczsKK30KKworc3ViIGdldGxpbmVfaHIgeworICAgIG15ICgkc2VsZiwgQGFyZ3MsICVocikgPSBAXzsKKyAgICAkc2VsZi0+e19DT0xVTU5fTkFNRVN9IG9yIGNyb2FrICgkc2VsZi0+U2V0RGlhZyAoMzAwMikpOworICAgIG15ICRmciA9ICRzZWxmLT5nZXRsaW5lIChAYXJncykgb3IgcmV0dXJuOworICAgIGlmIChyZWYgJHNlbGYtPntfRkZMQUdTfSkgeyAjIG1pc3NpbmcKKyAgICAgICAgJHNlbGYtPntfRkZMQUdTfVskX10gPSBJU19NSVNTSU5HCisgICAgICAgICAgICBmb3IgKEAkZnIgPyAkI3skZnJ9ICsgMSA6IDApIC4uICQjeyRzZWxmLT57X0NPTFVNTl9OQU1FU319OworICAgICAgICBAJGZyID09IDEgJiYgKCFkZWZpbmVkICRmci0+WzBdIHx8ICRmci0+WzBdIGVxICIiKSBhbmQKKyAgICAgICAgICAgICRzZWxmLT57X0ZGTEFHU31bMF0gfHw9IElTX01JU1NJTkc7CisgICAgICAgIH0KKyAgICBAaHJ7QHskc2VsZi0+e19DT0xVTU5fTkFNRVN9fX0gPSBAJGZyOworICAgIFwlaHI7Cit9CisKK3N1YiBnZXRsaW5lX2hyX2FsbCB7CisgICAgbXkgKCAkc2VsZiwgJGlvLCBAYXJncyApID0gQF87CisgICAgbXkgJWhyOworCisgICAgdW5sZXNzICggJHNlbGYtPntfQ09MVU1OX05BTUVTfSApIHsKKyAgICAgICAgY3JvYWsgJHNlbGYtPlNldERpYWcoIDMwMDIgKTsKKyAgICB9CisKKyAgICBteSBAY24gPSBAeyRzZWxmLT57X0NPTFVNTl9OQU1FU319OworCisgICAgcmV0dXJuIFsgbWFwIHsgbXkgJWg7IEBoeyBAY24gfSA9IEAkXzsgXCVoIH0gQHsgJHNlbGYtPmdldGxpbmVfYWxsKCAkaW8sIEBhcmdzICkgfSBdOworfQorCitzdWIgc2F5IHsKKyAgICBteSAoJHNlbGYsICRpbywgQGYpID0gQF87CisgICAgbXkgJGVvbCA9ICRzZWxmLT5lb2w7CisgICAgZGVmaW5lZCAkZW9sICYmICRlb2wgbmUgIiIgb3IgJHNlbGYtPmVvbCAoJFwgfHwgJC8pOworICAgIG15ICRzdGF0ZSA9ICRzZWxmLT5wcmludCAoJGlvLCBAZik7CisgICAgJHNlbGYtPmVvbCAoJGVvbCk7CisgICAgcmV0dXJuICRzdGF0ZTsKKyAgICB9CisKK3N1YiBwcmludF9ociB7CisgICAgbXkgKCRzZWxmLCAkaW8sICRocikgPSBAXzsKKyAgICAkc2VsZi0+e19DT0xVTU5fTkFNRVN9IG9yIGNyb2FrKCRzZWxmLT5TZXREaWFnKDMwMDkpKTsKKyAgICByZWYgJGhyIGVxICJIQVNIIiAgICAgIG9yIGNyb2FrKCRzZWxmLT5TZXREaWFnKDMwMTApKTsKKyAgICAkc2VsZi0+cHJpbnQgKCRpbywgWyBtYXAgeyAkaHItPnskX30gfSAkc2VsZi0+Y29sdW1uX25hbWVzIF0pOworfQorCitzdWIgZnJhZ21lbnQgeworICAgIG15ICgkc2VsZiwgJGlvLCAkc3BlYykgPSBAXzsKKworICAgIG15ICRxZCA9IHFye1xzKiBbMC05XSsgXHMqIH14OyAgICAgICAgICAgICAgICAjIGRpZ2l0CisgICAgbXkgJHFzID0gcXJ7XHMqICg/OiBbMC05XSsgfCBcKiApIFxzKn14OyAgICAgICAgIyBkaWdpdCBvciBzdGFyCisgICAgbXkgJHFyID0gcXJ7JHFkICg/OiAtICRxcyApP314OyAgICAgICAgICAgICAgICAjIHJhbmdlCisgICAgbXkgJHFjID0gcXJ7JHFyICg/OiA7ICRxciApKn14OyAgICAgICAgICAgICAgICAjIGxpc3QKKyAgICBkZWZpbmVkICRzcGVjICYmICRzcGVjID1+IG17XiBccyoKKyAgICAgICAgXHgyMyA/IFxzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCBsZWFkaW5nICMKKyAgICAgICAgKCByb3cgfCBjb2wgfCBjZWxsICkgXHMqID0KKyAgICAgICAgKCAkcWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3Igcm93IGFuZCBjb2wKKyAgICAgICAgfCAkcWQgLCAkcWQgKD86IC0gJHFzICwgJHFzKT8gICAgICAgICAgICAgICAgIyBmb3IgY2VsbCAocmFuZ2VzKQorICAgICAgICAgICg/OiA7ICRxZCAsICRxZCAoPzogLSAkcXMgLCAkcXMpPyApKiAgICAgICAgIyBhbmQgY2VsbCAocmFuZ2UpIGxpc3RzCisgICAgICAgICkgXHMqICR9eGkgb3IgY3JvYWsgKCRzZWxmLT5TZXREaWFnICgyMDEzKSk7CisgICAgbXkgKCR0eXBlLCAkcmFuZ2UpID0gKGxjICQxLCAkMik7CisKKyAgICBteSBAaCA9ICRzZWxmLT5jb2x1bW5fbmFtZXMgKCk7CisKKyAgICBteSBAYzsKKyAgICBpZiAoJHR5cGUgZXEgImNlbGwiKSB7CisgICAgICAgIG15IEBzcGVjOworICAgICAgICBteSAkbWluX3JvdzsKKyAgICAgICAgbXkgJG1heF9yb3cgPSAwOworICAgICAgICBmb3IgKHNwbGl0IG0vXHMqO1xzKi8gPT4gJHJhbmdlKSB7CisgICAgICAgICAgICBteSAoJHRsciwgJHRsYywgJGJyciwgJGJyYykgPSAobXsKKyAgICAgICAgICAgICAgICAgICAgXiBccyogKFswLTldKyAgICAgKSBccyogLCBccyogKFswLTldKyAgICAgKSBccyoKKyAgICAgICAgICAgICAgICAoPzogLSBccyogKFswLTldKyB8IFwqKSBccyogLCBccyogKFswLTldKyB8IFwqKSBccyogKT8KKyAgICAgICAgICAgICAgICAgICAgJH14KSBvciBjcm9hayAoJHNlbGYtPlNldERpYWcgKDIwMTMpKTsKKyAgICAgICAgICAgIGRlZmluZWQgJGJyciBvciAoJGJyciwgJGJyYykgPSAoJHRsciwgJHRsYyk7CisgICAgICAgICAgICAkdGxyID09IDAgfHwgJHRsYyA9PSAwIHx8CisgICAgICAgICAgICAgICAgKCRicnIgbmUgIioiICYmICgkYnJyID09IDAgfHwgJGJyciA8ICR0bHIpKSB8fAorICAgICAgICAgICAgICAgICgkYnJjIG5lICIqIiAmJiAoJGJyYyA9PSAwIHx8ICRicmMgPCAkdGxjKSkKKyAgICAgICAgICAgICAgICAgICAgYW5kIGNyb2FrICgkc2VsZi0+U2V0RGlhZyAoMjAxMykpOworICAgICAgICAgICAgJHRsYy0tOworICAgICAgICAgICAgJGJyYy0tIHVubGVzcyAkYnJjIGVxICIqIjsKKyAgICAgICAgICAgIGRlZmluZWQgJG1pbl9yb3cgb3IgJG1pbl9yb3cgPSAkdGxyOworICAgICAgICAgICAgJHRsciA8ICRtaW5fcm93IGFuZCAkbWluX3JvdyA9ICR0bHI7CisgICAgICAgICAgICAkYnJyIGVxICIqIiB8fCAkYnJyID4gJG1heF9yb3cgYW5kCisgICAgICAgICAgICAgICAgJG1heF9yb3cgPSAkYnJyOworICAgICAgICAgICAgcHVzaCBAc3BlYywgWyAkdGxyLCAkdGxjLCAkYnJyLCAkYnJjIF07CisgICAgICAgICAgICB9CisgICAgICAgIG15ICRyID0gMDsKKyAgICAgICAgd2hpbGUgKG15ICRyb3cgPSAkc2VsZi0+Z2V0bGluZSAoJGlvKSkgeworICAgICAgICAgICAgKyskciA8ICRtaW5fcm93IGFuZCBuZXh0OworICAgICAgICAgICAgbXkgJXJvdzsKKyAgICAgICAgICAgIG15ICRsYzsKKyAgICAgICAgICAgIGZvcmVhY2ggbXkgJHMgKEBzcGVjKSB7CisgICAgICAgICAgICAgICAgbXkgKCR0bHIsICR0bGMsICRicnIsICRicmMpID0gQCRzOworICAgICAgICAgICAgICAgICRyIDwgICR0bHIgfHwgKCRicnIgbmUgIioiICYmICRyID4gJGJycikgYW5kIG5leHQ7CisgICAgICAgICAgICAgICAgIWRlZmluZWQgJGxjIHx8ICR0bGMgPCAkbGMgYW5kICRsYyA9ICR0bGM7CisgICAgICAgICAgICAgICAgbXkgJHJyID0gJGJyYyBlcSAiKiIgPyAkIyRyb3cgOiAkYnJjOworICAgICAgICAgICAgICAgICRyb3d7JF99ID0gJHJvdy0+WyRfXSBmb3IgJHRsYyAuLiAkcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaCBAYywgWyBAcm93e3NvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICVyb3cgfSBdOworICAgICAgICAgICAgaWYgKEBoKSB7CisgICAgICAgICAgICAgICAgbXkgJWg7IEBoe0BofSA9IEB7JGNbLTFdfTsKKyAgICAgICAgICAgICAgICAkY1stMV0gPSBcJWg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgJG1heF9yb3cgbmUgIioiICYmICRyID09ICRtYXhfcm93IGFuZCBsYXN0OworICAgICAgICAgICAgfQorICAgICAgICByZXR1cm4gXEBjOworICAgICAgICB9CisKKyAgICAjIHJvdyBvciBjb2wKKyAgICBteSBAcjsKKyAgICBteSAkZW9kID0gMDsKKyAgICBmb3IgKHNwbGl0IG0vXHMqO1xzKi8gPT4gJHJhbmdlKSB7CisgICAgICAgIG15ICgkZnJvbSwgJHRvKSA9IG0vXlxzKiAoWzAtOV0rKSAoPzogXHMqIC0gXHMqIChbMC05XSsgfCBcKiApKT8gXHMqICQveAorICAgICAgICAgICAgb3IgY3JvYWsgKCRzZWxmLT5TZXREaWFnICgyMDEzKSk7CisgICAgICAgICR0byB8fD0gJGZyb207CisgICAgICAgICR0byBlcSAiKiIgYW5kICgkdG8sICRlb2QpID0gKCRmcm9tLCAxKTsKKyAgICAgICAgJGZyb20gPD0gMCB8fCAkdG8gPD0gMCB8fCAkdG8gPCAkZnJvbSBhbmQgY3JvYWsgKCRzZWxmLT5TZXREaWFnICgyMDEzKSk7CisgICAgICAgICRyWyRfXSA9IDEgZm9yICRmcm9tIC4uICR0bzsKKyAgICAgICAgfQorCisgICAgbXkgJHIgPSAwOworICAgICR0eXBlIGVxICJjb2wiIGFuZCBzaGlmdCBAcjsKKyAgICAkXyB8fD0gMCBmb3IgQHI7CisgICAgd2hpbGUgKG15ICRyb3cgPSAkc2VsZi0+Z2V0bGluZSAoJGlvKSkgeworICAgICAgICAkcisrOworICAgICAgICBpZiAoJHR5cGUgZXEgInJvdyIpIHsKKyAgICAgICAgICAgIGlmICgoJHIgPiAkI3IgJiYgJGVvZCkgfHwgJHJbJHJdKSB7CisgICAgICAgICAgICAgICAgcHVzaCBAYywgJHJvdzsKKyAgICAgICAgICAgICAgICBpZiAoQGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbXkgJWg7IEBoe0BofSA9IEB7JGNbLTFdfTsKKyAgICAgICAgICAgICAgICAgICAgJGNbLTFdID0gXCVoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHVzaCBAYywgWyBtYXAgeyAoJF8gPiAkI3IgJiYgJGVvZCkgfHwgJHJbJF9dID8gJHJvdy0+WyRfXSA6ICgpIH0gMC4uJCMkcm93IF07CisgICAgICAgIGlmIChAaCkgeworICAgICAgICAgICAgbXkgJWg7IEBoe0BofSA9IEB7JGNbLTFdfTsKKyAgICAgICAgICAgICRjWy0xXSA9IFwlaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcmV0dXJuIFxAYzsKKyAgICB9CisKK215ICRjc3ZfdXNhZ2UgPSBxe3VzYWdlOiBteSAkYW9hID0gY3N2IChpbiA9PiAkZmlsZSk7fTsKKworc3ViIF9jc3ZfYXR0ciB7CisgICAgbXkgJWF0dHIgPSAoQF8gPT0gMSAmJiByZWYgJF9bMF0gZXEgIkhBU0giID8gJXskX1swXX0gOiBAXykgb3IgY3JvYWs7CisKKyAgICAkYXR0cntiaW5hcnl9ID0gMTsKKworICAgIG15ICRlbmMgPSBkZWxldGUgJGF0dHJ7ZW5jfSB8fCBkZWxldGUgJGF0dHJ7ZW5jb2Rpbmd9IHx8ICIiOworICAgICRlbmMgZXEgImF1dG8iIGFuZCAoJGF0dHJ7ZGV0ZWN0X2JvbX0sICRlbmMpID0gKDEsICIiKTsKKyAgICAkZW5jID1+IG0vXlstXHcuXSskLyBhbmQgJGVuYyA9ICI6ZW5jb2RpbmcoJGVuYykiOworCisgICAgbXkgJGZoOworICAgIG15ICRjbHMgPSAwOyAgICAgICAgIyBJZiBJIG9wZW4gYSBmaWxlLCBJIGhhdmUgdG8gY2xvc2UgaXQKKyAgICBteSAkaW4gID0gZGVsZXRlICRhdHRye2lufSAgfHwgZGVsZXRlICRhdHRye2ZpbGV9IG9yIGNyb2FrICRjc3ZfdXNhZ2U7CisgICAgbXkgJG91dCA9IGRlbGV0ZSAkYXR0cntvdXR9IHx8IGRlbGV0ZSAkYXR0cntmaWxlfTsKKworICAgIHJlZiAkaW4gZXEgIkNPREUiIHx8IHJlZiAkaW4gZXEgIkFSUkFZIiBhbmQgJG91dCB8fD0gXCpTVERPVVQ7CisKKyAgICBpZiAoJG91dCkgeworICAgICAgICAkaW4gb3IgY3JvYWsgJGNzdl91c2FnZTsgICAgICAgICMgTm8gb3V0IHdpdGhvdXQgaW4KKyAgICAgICAgaWYgKChyZWYgJG91dCBhbmQgcmVmICRvdXQgbmUgIlNDQUxBUiIpIG9yICJHTE9CIiBlcSByZWYgXCRvdXQpIHsKKyAgICAgICAgICAgICRmaCA9ICRvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgb3BlbiAkZmgsICI+IiwgJG91dCBvciBjcm9hayAiJG91dDogJCEiOworICAgICAgICAgICAgJGNscyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICRlbmMgYW5kIGJpbm1vZGUgJGZoLCAkZW5jOworICAgICAgICB1bmxlc3MgKGRlZmluZWQgJGF0dHJ7ZW9sfSkgeworICAgICAgICAgICAgbXkgQGxheWVycyA9IGV2YWwgeyBQZXJsSU86OmdldF9sYXllcnMgKCRmaCkgfTsKKyAgICAgICAgICAgICRhdHRye2VvbH0gPSAoZ3JlcCBtL2NybGYvID0+IEBsYXllcnMpID8gIlxuIiA6ICJcclxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgaWYgKCAgIHJlZiAkaW4gZXEgIkNPREUiIG9yIHJlZiAkaW4gZXEgIkFSUkFZIikgeworICAgICAgICAjIEFsbCBkb25lCisgICAgICAgIH0KKyAgICBlbHNpZiAocmVmICRpbiBlcSAiU0NBTEFSIikgeworICAgICAgICAjIFN0cmluZ3Mgd2l0aCBjb2RlIHBvaW50cyBvdmVyIDB4RkYgbWF5IG5vdCBiZSBtYXBwZWQgaW50byBpbi1tZW1vcnkgZmlsZSBoYW5kbGVzCisgICAgICAgICMgIjwkZW5jIiBkb2VzIG5vdCBjaGFuZ2UgdGhhdCA6KAorICAgICAgICBvcGVuICRmaCwgIjwiLCAkaW4gb3IgY3JvYWsgIkNhbm5vdCBvcGVuIGZyb20gU0NBTEFSIHVzaW5nIFBlcmxJTyI7CisgICAgICAgICRjbHMgPSAxOworICAgICAgICB9CisgICAgZWxzaWYgKHJlZiAkaW4gb3IgIkdMT0IiIGVxIHJlZiBcJGluKSB7CisgICAgICAgIGlmICghcmVmICRpbiAmJiAkXSA8IDUuMDA4MDA1KSB7CisgICAgICAgICAgICAkZmggPSBcKiRpbjsgIyB1bmNvdmVyYWJsZSBzdGF0ZW1lbnQgYW5jaWVudCBwZXJsIHZlcnNpb24gcmVxdWlyZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkZmggPSAkaW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgb3BlbiAkZmgsICI8JGVuYyIsICRpbiBvciBjcm9hayAiJGluOiAkISI7CisgICAgICAgICRjbHMgPSAxOworICAgICAgICB9CisgICAgJGZoIG9yIGNyb2FrIHFxe05vIHZhbGlkIHNvdXJjZSBwYXNzZWQuICJpbiIgaXMgcmVxdWlyZWR9OworCisgICAgbXkgJGhkcnMgPSBkZWxldGUgJGF0dHJ7aGVhZGVyc307CisgICAgbXkgJGZyYWcgPSBkZWxldGUgJGF0dHJ7ZnJhZ21lbnR9OworICAgIG15ICRrZXkgID0gZGVsZXRlICRhdHRye2tleX07CisKKyAgICBteSAkY2JhaSA9IGRlbGV0ZSAkYXR0cntjYWxsYmFja3N9e2FmdGVyX2lufSAgICB8fAorICAgICAgICAgICAgICAgZGVsZXRlICRhdHRye2FmdGVyX2lufSAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICBkZWxldGUgJGF0dHJ7Y2FsbGJhY2tzfXthZnRlcl9wYXJzZX0gfHwKKyAgICAgICAgICAgICAgIGRlbGV0ZSAkYXR0cnthZnRlcl9wYXJzZX07CisgICAgbXkgJGNiYm8gPSBkZWxldGUgJGF0dHJ7Y2FsbGJhY2tzfXtiZWZvcmVfb3V0fSAgfHwKKyAgICAgICAgICAgICAgIGRlbGV0ZSAkYXR0cntiZWZvcmVfb3V0fTsKKyAgICBteSAkY2JvaSA9IGRlbGV0ZSAkYXR0cntjYWxsYmFja3N9e29uX2lufSAgICAgICB8fAorICAgICAgICAgICAgICAgZGVsZXRlICRhdHRye29uX2lufTsKKworICAgIG15ICRoZF9zID0gZGVsZXRlICRhdHRye3NlcF9zZXR9ICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICBkZWxldGUgJGF0dHJ7c2Vwc307CisgICAgbXkgJGhkX2IgPSBkZWxldGUgJGF0dHJ7ZGV0ZWN0X2JvbX0gICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgIGRlbGV0ZSAkYXR0cntib219OworICAgIG15ICRoZF9tID0gZGVsZXRlICRhdHRye211bmdlfSAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICBkZWxldGUgJGF0dHJ7bXVuZ2VfY29sdW1uX25hbWVzfTsKKyAgICBteSAkaGRfYyA9IGRlbGV0ZSAkYXR0cntzZXRfY29sdW1uX25hbWVzfTsKKworICAgIGZvciAoWyBxdW8gICAgPT4gInF1b3RlIiAgICAgICAgICAgICAgICBdLAorICAgICAgICAgWyBlc2MgICAgPT4gImVzY2FwZSIgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgIFsgZXNjYXBlID0+ICJlc2NhcGVfY2hhciIgICAgICAgIF0sCisgICAgICAgICApIHsKKyAgICAgICAgbXkgKCRmLCAkdCkgPSBAJF87CisgICAgICAgIGV4aXN0cyAkYXR0cnskZn0gYW5kICFleGlzdHMgJGF0dHJ7JHR9IGFuZCAkYXR0cnskdH0gPSBkZWxldGUgJGF0dHJ7JGZ9OworICAgICAgICB9CisKKyAgICBteSAkZmx0ciA9IGRlbGV0ZSAkYXR0cntmaWx0ZXJ9OworICAgIG15ICVmbHRyID0gKAorICAgICAgICBub3RfYmxhbmsgPT4gc3ViIHsgQHskX1sxXX0gPiAxIG9yIGRlZmluZWQgJF9bMV1bMF0gJiYgJF9bMV1bMF0gbmUgIiIgfSwKKyAgICAgICAgbm90X2VtcHR5ID0+IHN1YiB7IGdyZXAgeyBkZWZpbmVkICYmICRfIG5lICIiIH0gQHskX1sxXX0gfSwKKyAgICAgICAgZmlsbGVkICAgID0+IHN1YiB7IGdyZXAgeyBkZWZpbmVkICYmIG0vXFMvICAgIH0gQHskX1sxXX0gfSwKKyAgICAgICAgKTsKKyAgICBkZWZpbmVkICRmbHRyICYmICFyZWYgJGZsdHIgJiYgZXhpc3RzICRmbHRyeyRmbHRyfSBhbmQKKyAgICAgICAgJGZsdHIgPSB7IDAgPT4gJGZsdHJ7JGZsdHJ9IH07CisgICAgcmVmICRmbHRyIGVxICJIQVNIIiBvciAkZmx0ciA9IHVuZGVmOworCisgICAgZGVmaW5lZCAkYXR0cnthdXRvX2RpYWd9ICAgb3IgJGF0dHJ7YXV0b19kaWFnfSAgID0gMTsKKyAgICBkZWZpbmVkICRhdHRye2VzY2FwZV9udWxsfSBvciAkYXR0cntlc2NhcGVfbnVsbH0gPSAwOworICAgIG15ICRjc3YgPSBkZWxldGUgJGF0dHJ7Y3N2fSB8fCBUZXh0OjpDU1ZfUFAtPm5ldyAoXCVhdHRyKQorICAgICAgICBvciBjcm9hayAkbGFzdF9uZXdfZXJyb3I7CisKKyAgICByZXR1cm4geworICAgICAgICBjc3YgID0+ICRjc3YsCisgICAgICAgIGF0dHIgPT4geyAlYXR0ciB9LAorICAgICAgICBmaCAgID0+ICRmaCwKKyAgICAgICAgY2xzICA9PiAkY2xzLAorICAgICAgICBpbiAgID0+ICRpbiwKKyAgICAgICAgb3V0ICA9PiAkb3V0LAorICAgICAgICBlbmMgID0+ICRlbmMsCisgICAgICAgIGhkcnMgPT4gJGhkcnMsCisgICAgICAgIGtleSAgPT4gJGtleSwKKyAgICAgICAgZnJhZyA9PiAkZnJhZywKKyAgICAgICAgZmx0ciA9PiAkZmx0ciwKKyAgICAgICAgY2JhaSA9PiAkY2JhaSwKKyAgICAgICAgY2JibyA9PiAkY2JibywKKyAgICAgICAgY2JvaSA9PiAkY2JvaSwKKyAgICAgICAgaGRfcyA9PiAkaGRfcywKKyAgICAgICAgaGRfYiA9PiAkaGRfYiwKKyAgICAgICAgaGRfbSA9PiAkaGRfbSwKKyAgICAgICAgaGRfYyA9PiAkaGRfYywKKyAgICAgICAgfTsKKyAgICB9CisKK3N1YiBjc3YgeworICAgIEBfICYmIChyZWYgJF9bMF0gZXEgX19QQUNLQUdFX18gb3IgcmVmICRfWzBdIGVxICdUZXh0OjpDU1YnKSBhbmQgc3BsaWNlIEBfLCAwLCAwLCAiY3N2IjsKKyAgICBAXyBvciBjcm9hayAkY3N2X3VzYWdlOworCisgICAgbXkgJGMgPSBfY3N2X2F0dHIgKEBfKTsKKworICAgIG15ICgkY3N2LCAkaW4sICRmaCwgJGhkcnMpID0gQHskY317ImNzdiIsICJpbiIsICJmaCIsICJoZHJzIn07CisgICAgbXkgJWhkcjsKKyAgICBpZiAocmVmICRoZHJzIGVxICJIQVNIIikgeworICAgICAgICAlaGRyICA9ICUkaGRyczsKKyAgICAgICAgJGhkcnMgPSAiYXV0byI7CisgICAgICAgIH0KKworICAgIGlmICgkYy0+e291dH0pIHsKKyAgICAgICAgaWYgKHJlZiAkaW4gZXEgIkNPREUiKSB7CisgICAgICAgICAgICBteSAkaGRyID0gMTsKKyAgICAgICAgICAgIHdoaWxlIChteSAkcm93ID0gJGluLT4oJGNzdikpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVmICRyb3cgZXEgIkFSUkFZIikgeworICAgICAgICAgICAgICAgICAgICAkY3N2LT5wcmludCAoJGZoLCAkcm93KTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZWYgJHJvdyBlcSAiSEFTSCIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRoZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRoZHJzIHx8PSBbIG1hcCB7ICRoZHJ7JF99IHx8ICRfIH0ga2V5cyAlJHJvdyBdOworICAgICAgICAgICAgICAgICAgICAgICAgJGNzdi0+cHJpbnQgKCRmaCwgJGhkcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgJGhkciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICRjc3YtPnByaW50ICgkZmgsIFsgQHskcm93fXtAJGhkcnN9IF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBlbHNpZiAocmVmICRpbi0+WzBdIGVxICJBUlJBWSIpIHsgIyBhb2EKKyAgICAgICAgICAgIHJlZiAkaGRycyBhbmQgJGNzdi0+cHJpbnQgKCRmaCwgJGhkcnMpOworICAgICAgICAgICAgZm9yIChAeyRpbn0pIHsKKyAgICAgICAgICAgICAgICAkYy0+e2Nib2l9IGFuZCAkYy0+e2Nib2l9LT4oJGNzdiwgJF8pOworICAgICAgICAgICAgICAgICRjLT57Y2Jib30gYW5kICRjLT57Y2Jib30tPigkY3N2LCAkXyk7CisgICAgICAgICAgICAgICAgJGNzdi0+cHJpbnQgKCRmaCwgJF8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7ICMgYW9oCisgICAgICAgICAgICBteSBAaGRycyA9IHJlZiAkaGRycyA/IEB7JGhkcnN9IDoga2V5cyAleyRpbi0+WzBdfTsKKyAgICAgICAgICAgIGRlZmluZWQgJGhkcnMgb3IgJGhkcnMgPSAiYXV0byI7CisgICAgICAgICAgICByZWYgJGhkcnMgfHwgJGhkcnMgZXEgImF1dG8iIGFuZAorICAgICAgICAgICAgICAgICRjc3YtPnByaW50ICgkZmgsIFsgbWFwIHsgJGhkcnskX30gfHwgJF8gfSBAaGRycyBdKTsKKyAgICAgICAgICAgIGZvciAoQHskaW59KSB7CisgICAgICAgICAgICAgICAgbG9jYWwgJV87CisgICAgICAgICAgICAgICAgKl8gPSAkXzsKKyAgICAgICAgICAgICAgICAkYy0+e2Nib2l9IGFuZCAkYy0+e2Nib2l9LT4oJGNzdiwgJF8pOworICAgICAgICAgICAgICAgICRjLT57Y2Jib30gYW5kICRjLT57Y2Jib30tPigkY3N2LCAkXyk7CisgICAgICAgICAgICAgICAgJGNzdi0+cHJpbnQgKCRmaCwgWyBAeyRffXtAaGRyc30gXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICRjLT57Y2xzfSBhbmQgY2xvc2UgJGZoOworICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgaWYgKGRlZmluZWQgJGMtPntoZF9zfSB8fCBkZWZpbmVkICRjLT57aGRfYn0gfHwgZGVmaW5lZCAkYy0+e2hkX219IHx8IGRlZmluZWQgJGMtPntoZF9jfSkgeworICAgICAgICBteSAlaGFyZzsKKyAgICAgICAgZGVmaW5lZCAkYy0+e2hkX3N9IGFuZCAkaGFyZ3tzZXRfc2V0fSAgICAgICAgICAgID0gJGMtPntoZF9zfTsKKyAgICAgICAgZGVmaW5lZCAkYy0+e2hkX2R9IGFuZCAkaGFyZ3tkZXRlY3RfYm9tfSAgICAgICAgID0gJGMtPntoZF9ifTsKKyAgICAgICAgZGVmaW5lZCAkYy0+e2hkX219IGFuZCAkaGFyZ3ttdW5nZV9jb2x1bW5fbmFtZXN9ID0gJGhkcnMgPyAibm9uZSIgOiAkYy0+e2hkX219OworICAgICAgICBkZWZpbmVkICRjLT57aGRfY30gYW5kICRoYXJne3NldF9jb2x1bW5fbmFtZXN9ICAgPSAkaGRycyA/IDAgICAgICA6ICRjLT57aGRfY307CisgICAgICAgICRjc3YtPmhlYWRlciAoJGZoLCBcJWhhcmcpOworICAgICAgICBteSBAaGRyID0gJGNzdi0+Y29sdW1uX25hbWVzOworICAgICAgICBAaGRyIGFuZCAkaGRycyB8fD0gXEBoZHI7CisgICAgICAgIH0KKworICAgIG15ICRrZXkgPSAkYy0+e2tleX0gYW5kICRoZHJzIHx8PSAiYXV0byI7CisgICAgJGMtPntmbHRyfSAmJiBncmVwIG0vXEQvID0+IGtleXMgJXskYy0+e2ZsdHJ9fSBhbmQgJGhkcnMgfHw9ICJhdXRvIjsKKyAgICBpZiAoZGVmaW5lZCAkaGRycykgeworICAgICAgICBpZiAoIXJlZiAkaGRycykgeworICAgICAgICAgICAgaWYgKCRoZHJzIGVxICJza2lwIikgeworICAgICAgICAgICAgICAgICRjc3YtPmdldGxpbmUgKCRmaCk7ICMgZGlzY2FyZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJGhkcnMgZXEgImF1dG8iKSB7CisgICAgICAgICAgICAgICAgbXkgJGggPSAkY3N2LT5nZXRsaW5lICgkZmgpIG9yIHJldHVybjsKKyAgICAgICAgICAgICAgICAkaGRycyA9IFsgbWFwIHsgICAgICAkaGRyeyRffSB8fCAkXyB9IEAkaCBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkaGRycyBlcSAibGMiKSB7CisgICAgICAgICAgICAgICAgbXkgJGggPSAkY3N2LT5nZXRsaW5lICgkZmgpIG9yIHJldHVybjsKKyAgICAgICAgICAgICAgICAkaGRycyA9IFsgbWFwIHsgbGMgKCRoZHJ7JF99IHx8ICRfKSB9IEAkaCBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkaGRycyBlcSAidWMiKSB7CisgICAgICAgICAgICAgICAgbXkgJGggPSAkY3N2LT5nZXRsaW5lICgkZmgpIG9yIHJldHVybjsKKyAgICAgICAgICAgICAgICAkaGRycyA9IFsgbWFwIHsgdWMgKCRoZHJ7JF99IHx8ICRfKSB9IEAkaCBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKHJlZiAkaGRycyBlcSAiQ09ERSIpIHsKKyAgICAgICAgICAgIG15ICRoICA9ICRjc3YtPmdldGxpbmUgKCRmaCkgb3IgcmV0dXJuOworICAgICAgICAgICAgbXkgJGNyID0gJGhkcnM7CisgICAgICAgICAgICAkaGRycyAgPSBbIG1hcCB7ICAkY3ItPigkaGRyeyRffSB8fCAkXykgfSBAJGggXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgaWYgKCRjLT57Zmx0cn0pIHsKKyAgICAgICAgbXkgJWYgPSAleyRjLT57Zmx0cn19OworICAgICAgICAjIGNvbnZlcnQgaGVhZGVycyB0byBpbmRleAorICAgICAgICBteSBAaGRyOworICAgICAgICBpZiAocmVmICRoZHJzKSB7CisgICAgICAgICAgICBAaGRyID0gQHskaGRyc307CisgICAgICAgICAgICBmb3IgKDAgLi4gJCNoZHIpIHsKKyAgICAgICAgICAgICAgICBleGlzdHMgJGZ7JGhkclskX119IGFuZCAkZnskXyArIDF9ID0gZGVsZXRlICRmeyRoZHJbJF9dfTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICRjc3YtPmNhbGxiYWNrcyAoYWZ0ZXJfcGFyc2UgPT4gc3ViIHsKKyAgICAgICAgICAgIG15ICgkQ1NWLCAkUk9XKSA9IEBfOyAjIGxleGljYWwgc3ViLXZhcmlhYmxlcyBpbiBjYXBzCisgICAgICAgICAgICBmb3JlYWNoIG15ICRGTEQgKHNvcnQga2V5cyAlZikgeworICAgICAgICAgICAgICAgIGxvY2FsICRfID0gJFJPVy0+WyRGTEQgLSAxXTsKKyAgICAgICAgICAgICAgICBsb2NhbCAlXzsKKyAgICAgICAgICAgICAgICBAaGRyIGFuZCBAX3tAaGRyfSA9IEAkUk9XOworICAgICAgICAgICAgICAgICRmeyRGTER9LT4oJENTViwgJFJPVykgb3IgcmV0dXJuIFwic2tpcCI7CisgICAgICAgICAgICAgICAgJFJPVy0+WyRGTEQgLSAxXSA9ICRfOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICBteSAkZnJhZyA9ICRjLT57ZnJhZ307CisgICAgbXkgJHJlZiA9IHJlZiAkaGRycworICAgICAgICA/ICMgYW9oCisgICAgICAgICAgZG8geworICAgICAgICAgICAgJGNzdi0+Y29sdW1uX25hbWVzICgkaGRycyk7CisgICAgICAgICAgICAkZnJhZyA/ICRjc3YtPmZyYWdtZW50ICgkZmgsICRmcmFnKSA6CisgICAgICAgICAgICAka2V5ICA/IHsgbWFwIHsgJF8tPnska2V5fSA9PiAkXyB9IEB7JGNzdi0+Z2V0bGluZV9ocl9hbGwgKCRmaCl9IH0KKyAgICAgICAgICAgICAgICAgIDogJGNzdi0+Z2V0bGluZV9ocl9hbGwgKCRmaCk7CisgICAgICAgICAgICB9CisgICAgICAgIDogIyBhb2EKKyAgICAgICAgICAgICRmcmFnID8gJGNzdi0+ZnJhZ21lbnQgKCRmaCwgJGZyYWcpCisgICAgICAgICAgICAgICAgICA6ICRjc3YtPmdldGxpbmVfYWxsICgkZmgpOworICAgICRyZWYgb3IgVGV4dDo6Q1NWX1BQLT5hdXRvX2RpYWc7CisgICAgJGMtPntjbHN9IGFuZCBjbG9zZSAkZmg7CisgICAgaWYgKCRyZWYgYW5kICRjLT57Y2JhaX0gfHwgJGMtPntjYm9pfSkgeworICAgICAgICBmb3JlYWNoIG15ICRyIChAeyRyZWZ9KSB7CisgICAgICAgICAgICBsb2NhbCAlXzsKKyAgICAgICAgICAgIHJlZiAkciBlcSAiSEFTSCIgYW5kICpfID0gJHI7CisgICAgICAgICAgICAkYy0+e2NiYWl9IGFuZCAkYy0+e2NiYWl9LT4oJGNzdiwgJHIpOworICAgICAgICAgICAgJGMtPntjYm9pfSBhbmQgJGMtPntjYm9pfS0+KCRjc3YsICRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgZGVmaW5lZCB3YW50YXJyYXkgb3IKKyAgICAgICAgcmV0dXJuIGNzdiAoJXskYy0+e2F0dHJ9fSwgaW4gPT4gJHJlZiwgaGVhZGVycyA9PiAkaGRycywgJXskYy0+e2F0dHJ9fSk7CisKKyAgICByZXR1cm4gJHJlZjsKKyAgICB9CisKKyMgVGhlIGVuZCBvZiB0aGUgY29tbW9uIHB1cmUgcGVybCBwYXJ0LgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUaGUgZm9sbG93aW5nIGFyZSBtZXRob2RzIGltcGxlbWVudGVkIGluIFhTIGluIFRleHQ6OkNTVl9YUyBvcgorIyBoZWxwZXIgbWV0aG9kcyBmb3IgVGV4dDo6Q1NWX1BQIG9ubHkKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N1YiBfc2V0dXBfY3R4IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJGxhc3RfZXJyb3IgPSB1bmRlZjsKKworICAgIG15ICRjdHg7CisgICAgaWYgKCRzZWxmLT57X0NBQ0hFfSkgeworICAgICAgICAkY3R4ID0gJHNlbGYtPntfQ0FDSEV9OworICAgIH0gZWxzZSB7CisgICAgICAgICRjdHggfHw9IHt9OworICAgICAgICAjICRjdHgtPntzZWxmfSAgPSAkc2VsZjsKKyAgICAgICAgJGN0eC0+e3BzZWxmfSA9IHJlZiAkc2VsZiB8fCAkc2VsZjsKKworICAgICAgICAkY3R4LT57c2VwfSA9ICcsJzsKKyAgICAgICAgaWYgKGRlZmluZWQgJHNlbGYtPntzZXBfY2hhcn0pIHsKKyAgICAgICAgICAgICRjdHgtPntzZXB9ID0gJHNlbGYtPntzZXBfY2hhcn07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlZmluZWQgJHNlbGYtPntzZXB9IGFuZCAkc2VsZi0+e3NlcH0gbmUgJycpIHsKKyAgICAgICAgICAgIHVzZSBieXRlczsKKyAgICAgICAgICAgICRjdHgtPntzZXB9ID0gJHNlbGYtPntzZXB9OworICAgICAgICAgICAgbXkgJHNlcF9sZW4gPSBsZW5ndGgoJGN0eC0+e3NlcH0pOworICAgICAgICAgICAgJGN0eC0+e3NlcF9sZW59ID0gJHNlcF9sZW4gaWYgJHNlcF9sZW4gPiAxOworICAgICAgICB9CisKKyAgICAgICAgJGN0eC0+e3F1b30gPSAnIic7CisgICAgICAgIGlmIChleGlzdHMgJHNlbGYtPntxdW90ZV9jaGFyfSkgeworICAgICAgICAgICAgbXkgJHF1b3RlX2NoYXIgPSAkc2VsZi0+e3F1b3RlX2NoYXJ9OworICAgICAgICAgICAgaWYgKGRlZmluZWQgJHF1b3RlX2NoYXIgYW5kIGxlbmd0aCAkcXVvdGVfY2hhcikgeworICAgICAgICAgICAgICAgICRjdHgtPntxdW99ID0gJHF1b3RlX2NoYXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRjdHgtPntxdW99ID0gIlwwIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e3F1b3RlfSBhbmQgJHNlbGYtPntxdW90ZX0gbmUgJycpIHsKKyAgICAgICAgICAgIHVzZSBieXRlczsKKyAgICAgICAgICAgICRjdHgtPntxdW99ID0gJHNlbGYtPntxdW90ZX07CisgICAgICAgICAgICBteSAkcXVvdGVfbGVuID0gbGVuZ3RoKCRjdHgtPntxdW99KTsKKyAgICAgICAgICAgICRjdHgtPntxdW9fbGVufSA9ICRxdW90ZV9sZW4gaWYgJHF1b3RlX2xlbiA+IDE7CisgICAgICAgIH0KKworICAgICAgICAkY3R4LT57ZXNjYXBlX2NoYXJ9ID0gJyInOworICAgICAgICBpZiAoZXhpc3RzICRzZWxmLT57ZXNjYXBlX2NoYXJ9KSB7CisgICAgICAgICAgICBteSAkZXNjYXBlX2NoYXIgPSAkc2VsZi0+e2VzY2FwZV9jaGFyfTsKKyAgICAgICAgICAgIGlmIChkZWZpbmVkICRlc2NhcGVfY2hhciBhbmQgbGVuZ3RoICRlc2NhcGVfY2hhcikgeworICAgICAgICAgICAgICAgICRjdHgtPntlc2NhcGVfY2hhcn0gPSAkZXNjYXBlX2NoYXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRjdHgtPntlc2NhcGVfY2hhcn0gPSAiXDAiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlZmluZWQgJHNlbGYtPntlb2x9KSB7CisgICAgICAgICAgICBteSAkZW9sID0gJHNlbGYtPntlb2x9OworICAgICAgICAgICAgbXkgJGVvbF9sZW4gPSBsZW5ndGgoJGVvbCk7CisgICAgICAgICAgICAkY3R4LT57ZW9sfSA9ICRlb2w7CisgICAgICAgICAgICAkY3R4LT57ZW9sX2xlbn0gPSAkZW9sX2xlbjsKKyAgICAgICAgICAgIGlmICgkZW9sX2xlbiA9PSAxIGFuZCAkZW9sIGVxICJcMDE1IikgeworICAgICAgICAgICAgICAgICRjdHgtPntlb2xfaXNfY3J9ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWZpbmVkICRzZWxmLT57X3R5cGVzfSkgeworICAgICAgICAgICAgJGN0eC0+e3R5cGVzfSA9ICRzZWxmLT57X3R5cGVzfTsKKyAgICAgICAgICAgICRjdHgtPnt0eXBlc19sZW59ID0gbGVuZ3RoKCRjdHgtPnt0eXBlc30pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlZmluZWQgJHNlbGYtPntfaXNfYm91bmR9KSB7CisgICAgICAgICAgICAkY3R4LT57aXNfYm91bmR9ID0gJHNlbGYtPntfaXNfYm91bmR9OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlZmluZWQgJHNlbGYtPntjYWxsYmFja3N9KSB7CisgICAgICAgICAgICBteSAkY2IgPSAkc2VsZi0+e2NhbGxiYWNrc307CisgICAgICAgICAgICAkY3R4LT57aGFzX2hvb2tzfSA9IDA7CisgICAgICAgICAgICBpZiAoZGVmaW5lZCAkY2ItPnthZnRlcl9wYXJzZX0gYW5kIHJlZiAkY2ItPnthZnRlcl9wYXJzZX0gZXEgJ0NPREUnKSB7CisgICAgICAgICAgICAgICAgJGN0eC0+e2hhc19ob29rc30gfD0gSE9PS19BRlRFUl9QQVJTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZWZpbmVkICRjYi0+e2JlZm9yZV9wcmludH0gYW5kIHJlZiAkY2ItPntiZWZvcmVfcHJpbnR9IGVxICdDT0RFJykgeworICAgICAgICAgICAgICAgICRjdHgtPntoYXNfaG9va3N9IHw9IEhPT0tfQkVGT1JFX1BSSU5UOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChxdy8KKyAgICAgICAgICAgIGJpbmFyeSBkZWNvZGVfdXRmOCBhbHdheXNfcXVvdGUgc3RyaWN0IHF1b3RlX2VtcHR5CisgICAgICAgICAgICBhbGxvd19sb29zZV9xdW90ZXMgYWxsb3dfbG9vc2VfZXNjYXBlcworICAgICAgICAgICAgYWxsb3dfdW5xdW90ZWRfZXNjYXBlIGFsbG93X3doaXRlc3BhY2UgYmxhbmtfaXNfdW5kZWYKKyAgICAgICAgICAgIGVtcHR5X2lzX3VuZGVmIHZlcmJhdGltIGF1dG9fZGlhZyBkaWFnX3ZlcmJvc2UKKyAgICAgICAgICAgIGtlZXBfbWV0YV9pbmZvCisgICAgICAgIC8pIHsKKyAgICAgICAgICAgICRjdHgtPnskX30gPSBkZWZpbmVkICRzZWxmLT57JF99ID8gJHNlbGYtPnskX30gOiAwOworICAgICAgICB9CisgICAgICAgIGZvciAocXcvcXVvdGVfc3BhY2UgZXNjYXBlX251bGwgcXVvdGVfYmluYXJ5LykgeworICAgICAgICAgICAgJGN0eC0+eyRffSA9IGRlZmluZWQgJHNlbGYtPnskX30gPyAkc2VsZi0+eyRffSA6IDE7CisgICAgICAgIH0KKyAgICAgICAgIyBGSVhNRTogcmVhZG9ubHkKKyAgICAgICAgJHNlbGYtPntfQ0FDSEV9ID0gJGN0eDsKKyAgICB9CisKKyAgICAkY3R4LT57dXRmOH0gPSAwOworICAgICRjdHgtPntzaXplfSA9IDA7CisgICAgJGN0eC0+e3VzZWR9ID0gMDsKKworICAgIGlmICgkY3R4LT57aXNfYm91bmR9KSB7CisgICAgICAgIG15ICRib3VuZCA9ICRzZWxmLT57X0JPVU5EX0NPTFVNTlN9OworICAgICAgICBpZiAoJGJvdW5kIGFuZCByZWYgJGJvdW5kIGVxICdBUlJBWScpIHsKKyAgICAgICAgICAgICRjdHgtPntib3VuZH0gPSAkYm91bmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkY3R4LT57aXNfYm91bmR9ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICRjdHgtPntlb2xfcG9zfSA9IC0xOworICAgICRjdHgtPntlb2x4fSA9ICRjdHgtPntlb2xfbGVufQorICAgICAgICA/ICRjdHgtPnt2ZXJiYXRpbX0gfHwgJGN0eC0+e2VvbF9sZW59ID49IDIKKyAgICAgICAgICAgID8gMQorICAgICAgICAgICAgOiAkY3R4LT57ZW9sfSA9fiAvXEFbXDAxNXxcMDEyXS8gPyAwIDogMQorICAgICAgICA6IDA7CisKKyAgICBpZiAoJGN0eC0+e3NlcF9sZW59IGFuZCBfaXNfdmFsaWRfdXRmOCgkY3R4LT57c2VwfSkpIHsKKyAgICAgICAgJGN0eC0+e3V0Zjh9ID0gMTsKKyAgICB9CisgICAgaWYgKCRjdHgtPntxdW9fbGVufSBhbmQgX2lzX3ZhbGlkX3V0ZjgoJGN0eC0+e3F1b30pKSB7CisgICAgICAgICRjdHgtPnt1dGY4fSA9IDE7CisgICAgfQorCisgICAgJGN0eDsKK30KKworc3ViIF9jYWNoZV9zZXQgeworICAgIG15ICgkc2VsZiwgJGlkeCwgJHZhbHVlKSA9IEBfOworICAgIHJldHVybiB1bmxlc3MgZXhpc3RzICRzZWxmLT57X0NBQ0hFfTsKKyAgICBteSAkY2FjaGUgPSAkc2VsZi0+e19DQUNIRX07CisKKyAgICBteSAka2V5ID0gJF9yZXZlcnNlX2NhY2hlX2lkeyRpZHh9OworICAgIGlmICghZGVmaW5lZCAka2V5KSB7CisgICAgICAgIHdhcm4gKHNwcmludGYgIlVua25vd24gY2FjaGUgaW5kZXggJWQgaWdub3JlZFxuIiwgJGlkeCk7CisgICAgfSBlbHNpZiAoJGtleSBlcSAnc2VwX2NoYXInKSB7CisgICAgICAgICRjYWNoZS0+e3NlcH0gPSAkdmFsdWU7CisgICAgICAgICRjYWNoZS0+e3NlcF9sZW59ID0gMDsKKyAgICB9CisgICAgZWxzaWYgKCRrZXkgZXEgJ3F1b3RlX2NoYXInKSB7CisgICAgICAgICRjYWNoZS0+e3F1b30gPSAkdmFsdWU7CisgICAgICAgICRjYWNoZS0+e3F1b19sZW59ID0gMDsKKyAgICB9CisgICAgZWxzaWYgKCRrZXkgZXEgJ19oYXNfaG9va3MnKSB7CisgICAgICAgICRjYWNoZS0+e2hhc19ob29rc30gPSAkdmFsdWU7CisgICAgfQorICAgIGVsc2lmICgka2V5IGVxICdfaXNfYm91bmQnKSB7CisgICAgICAgICRjYWNoZS0+e2lzX2JvdW5kfSA9ICR2YWx1ZTsKKyAgICB9CisgICAgZWxzaWYgKCRrZXkgZXEgJ3NlcCcpIHsKKyAgICAgICAgdXNlIGJ5dGVzOworICAgICAgICBteSAkbGVuID0gYnl0ZXM6Omxlbmd0aCgkdmFsdWUpOworICAgICAgICAkY2FjaGUtPntzZXB9ID0gJHZhbHVlIGlmICRsZW47CisgICAgICAgICRjYWNoZS0+e3NlcF9sZW59ID0gJGxlbiA9PSAxID8gMCA6ICRsZW47CisgICAgfQorICAgIGVsc2lmICgka2V5IGVxICdxdW90ZScpIHsKKyAgICAgICAgdXNlIGJ5dGVzOworICAgICAgICBteSAkbGVuID0gYnl0ZXM6Omxlbmd0aCgkdmFsdWUpOworICAgICAgICAkY2FjaGUtPntxdW99ID0gJHZhbHVlIGlmICRsZW47CisgICAgICAgICRjYWNoZS0+e3F1b19sZW59ID0gJGxlbiA9PSAxID8gMCA6ICRsZW47CisgICAgfQorICAgIGVsc2lmICgka2V5IGVxICdlb2wnKSB7CisgICAgICAgICRjYWNoZS0+e2VvbH0gPSAkdmFsdWUgaWYgbGVuZ3RoKCR2YWx1ZSk7CisgICAgICAgICRjYWNoZS0+e2VvbF9pc19jcn0gPSAkdmFsdWUgZXEgIlwwMTUiID8gMSA6IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkY2FjaGUtPnska2V5fSA9ICR2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBfY2FjaGVfZGlhZyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICB1bmxlc3MgKGV4aXN0cyAkc2VsZi0+e19DQUNIRX0pIHsKKyAgICAgICAgd2FybiAoIkNBQ0hFOiBpbnZhbGlkXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG15ICRjYWNoZSA9ICRzZWxmLT57X0NBQ0hFfTsKKyAgICB3YXJuICgiQ0FDSEU6XG4iKTsKKyAgICAkc2VsZi0+X19jYWNoZV9zaG93X2NoYXIocXVvdGVfY2hhciA9PiAkY2FjaGUtPntxdW99KTsKKyAgICAkc2VsZi0+X19jYWNoZV9zaG93X2NoYXIoZXNjYXBlX2NoYXIgPT4gJGNhY2hlLT57ZXNjYXBlX2NoYXJ9KTsKKyAgICAkc2VsZi0+X19jYWNoZV9zaG93X2NoYXIoc2VwX2NoYXIgPT4gJGNhY2hlLT57c2VwfSk7CisgICAgZm9yIChxdy8KKyAgICAgICAgYmluYXJ5IGRlY29kZV91dGY4IGFsbG93X2xvb3NlX2VzY2FwZXMgYWxsb3dfbG9vc2VfcXVvdGVzCisgICAgICAgIGFsbG93X3doaXRlc3BhY2UgYWx3YXlzX3F1b3RlIHF1b3RlX2VtcHR5IHF1b3RlX3NwYWNlCisgICAgICAgIGVzY2FwZV9udWxsIHF1b3RlX2JpbmFyeSBhdXRvX2RpYWcgZGlhZ192ZXJib3NlIHN0cmljdAorICAgICAgICBoYXNfZXJyb3JfaW5wdXQgYmxhbmtfaXNfdW5kZWYgZW1wdHlfaXNfdW5kZWYgaGFzX2FoZWFkCisgICAgICAgIGtlZXBfbWV0YV9pbmZvIHZlcmJhdGltIGhhc19ob29rcyBlb2xfaXNfY3IgZW9sX2xlbgorICAgIC8pIHsKKyAgICAgICAgJHNlbGYtPl9fY2FjaGVfc2hvd19ieXRlKCRfID0+ICRjYWNoZS0+eyRffSk7CisgICAgfQorICAgICRzZWxmLT5fX2NhY2hlX3Nob3dfc3RyKGVvbCA9PiAkY2FjaGUtPntlb2xfbGVufSwgJGNhY2hlLT57ZW9sfSk7CisgICAgJHNlbGYtPl9fY2FjaGVfc2hvd19ieXRlKHNlcF9sZW4gPT4gJGNhY2hlLT57c2VwX2xlbn0pOworICAgIGlmICgkY2FjaGUtPntzZXBfbGVufSBhbmQgJGNhY2hlLT57c2VwX2xlbn0gPiAxKSB7CisgICAgICAgICRzZWxmLT5fX2NhY2hlX3Nob3dfc3RyKHNlcCA9PiAkY2FjaGUtPntzZXBfbGVufSwgJGNhY2hlLT57c2VwfSk7CisgICAgfQorICAgICRzZWxmLT5fX2NhY2hlX3Nob3dfYnl0ZShxdW9fbGVuID0+ICRjYWNoZS0+e3F1b19sZW59KTsKKyAgICBpZiAoJGNhY2hlLT57cXVvX2xlbn0gYW5kICRjYWNoZS0+e3F1b19sZW59ID4gMSkgeworICAgICAgICAkc2VsZi0+X19jYWNoZV9zaG93X3N0cihxdW90ZSA9PiAkY2FjaGUtPntxdW9fbGVufSwgJGNhY2hlLT57cXVvfSk7CisgICAgfQorfQorCitzdWIgX19jYWNoZV9zaG93X2J5dGUgeworICAgIG15ICgkc2VsZiwgJGtleSwgJHZhbHVlKSA9IEBfOworICAgIHdhcm4gKHNwcmludGYgIiAgJS0yMXMgJTAyeDolM2RcbiIsICRrZXksIGRlZmluZWQgJHZhbHVlID8gb3JkKCR2YWx1ZSkgOiAwLCBkZWZpbmVkICR2YWx1ZSA/ICR2YWx1ZSA6IDApOworfQorCitzdWIgX19jYWNoZV9zaG93X2NoYXIgeworICAgIG15ICgkc2VsZiwgJGtleSwgJHZhbHVlKSA9IEBfOworICAgIG15ICR2ID0gJHZhbHVlOworICAgIGlmIChkZWZpbmVkICR2YWx1ZSkgeworICAgICAgICBteSBAYiA9IHVucGFjayAiVTBDKiIsICR2YWx1ZTsKKyAgICAgICAgJHYgPSBwYWNrICJVKiIsICRiWzBdOworICAgIH0KKyAgICB3YXJuIChzcHJpbnRmICIgICUtMjFzICUwMng6JXNcbiIsICRrZXksIGRlZmluZWQgJHYgPyBvcmQoJHYpIDogMCwgJHNlbGYtPl9fcHJldHR5X3N0cigkdiwgMSkpOworfQorCitzdWIgX19jYWNoZV9zaG93X3N0ciB7CisgICAgbXkgKCRzZWxmLCAka2V5LCAkbGVuLCAkdmFsdWUpID0gQF87CisgICAgd2FybiAoc3ByaW50ZiAiICAlLTIxcyAlMDJkOiVzXG4iLCAka2V5LCAkbGVuLCAkc2VsZi0+X19wcmV0dHlfc3RyKCR2YWx1ZSwgJGxlbikpOworfQorCitzdWIgX19wcmV0dHlfc3RyIHsgIyBGSVhNRQorICAgIG15ICgkc2VsZiwgJHN0ciwgJGxlbikgPSBAXzsKKyAgICByZXR1cm4gJycgdW5sZXNzIGRlZmluZWQgJHN0cjsKKyAgICAkc3RyID0gc3Vic3RyKCRzdHIsIDAsICRsZW4pOworICAgICRzdHIgPX4gcy8iL1xcIi9nOworICAgICRzdHIgPX4gcy8oW15ceDA5XHgyMC1ceDdlXSkvc3ByaW50ZiAnXFx4eyV4fScsIG9yZCgkMSkvZWc7CisgICAgcXF7IiRzdHIifTsKK30KKworc3ViIF9ob29rIHsKKyAgICBteSAoJHNlbGYsICRuYW1lLCAkZmllbGRzKSA9IEBfOworICAgIHJldHVybiAwIHVubGVzcyAkc2VsZi0+e2NhbGxiYWNrc307CisKKyAgICBteSAkY2IgPSAkc2VsZi0+e2NhbGxiYWNrc317JG5hbWV9OworICAgIHJldHVybiAwIHVubGVzcyAkY2IgJiYgcmVmICRjYiBlcSAnQ09ERSc7CisKKyAgICBteSAoQHJlcykgPSAkY2ItPigkc2VsZiwgJGZpZWxkcyk7CisgICAgaWYgKEByZXMpIHsKKyAgICAgICAgcmV0dXJuIDAgaWYgcmVmICRyZXNbMF0gZXEgJ1NDQUxBUicgYW5kICR7JHJlc1swXX0gZXEgInNraXAiOworICAgIH0KKyAgICBzY2FsYXIgQHJlczsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbWV0aG9kcyBmb3IgY29tYmluZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3ViIF9fY29tYmluZSB7CisgICAgbXkgKCRzZWxmLCAkZHN0LCAkZmllbGRzLCAkdXNlSU8pID0gQF87CisKKyAgICBteSAkY3R4ID0gJHNlbGYtPl9zZXR1cF9jdHg7CisKKyAgICBteSAoJGJpbmFyeSwgJHF1b3QsICRzZXAsICRlc2MsICRxdW90ZV9zcGFjZSkgPSBAeyRjdHh9e3F3L2JpbmFyeSBxdW8gc2VwIGVzY2FwZV9jaGFyIHF1b3RlX3NwYWNlL307CisKKyAgICBpZighZGVmaW5lZCAkcXVvdCBvciAkcXVvdCBlcSAiXDAiKXsgJHF1b3QgPSAnJzsgfQorCisgICAgbXkgJHJlX2VzYzsKKyAgICBpZiAoJHF1b3QgbmUgJycpIHsKKyAgICAgICRyZV9lc2MgPSAkc2VsZi0+e19yZV9jb21iX2VzY2FwZX0tPnskcXVvdH0tPnskZXNjfSB8fD0gcXIvKFxRJHF1b3RcRXxcUSRlc2NcRSkvOworICAgIH0gZWxzZSB7CisgICAgICAkcmVfZXNjID0gJHNlbGYtPntfcmVfY29tYl9lc2NhcGV9LT57JHF1b3R9LT57JGVzY30gfHw9IHFyLyhcUSRlc2NcRSkvOworICAgIH0KKworICAgIG15ICRyZV9zcCAgPSAkc2VsZi0+e19yZV9jb21iX3NwfS0+eyRzZXB9LT57JHF1b3RlX3NwYWNlfSB8fD0gKCAkcXVvdGVfc3BhY2UgPyBxci9bXHNcUSRzZXBcRV0vIDogcXIvW1xRJHNlcFxFXS8gKTsKKworICAgIG15ICRib3VuZCA9IDA7CisgICAgbXkgJG4gPSBAJGZpZWxkcyAtIDE7CisgICAgaWYgKCRuIDwgMCBhbmQgJGN0eC0+e2lzX2JvdW5kfSkgeworICAgICAgICAkbiA9ICRjdHgtPntpc19ib3VuZH0gLSAxOworICAgICAgICAkYm91bmQgPSAxOworICAgIH0KKworICAgIG15ICRjaGVja19tZXRhID0gKCRjdHgtPntrZWVwX21ldGFfaW5mb30gPj0gMTAgYW5kIEB7JHNlbGYtPntfRkZMQUdTfSB8fCBbXX0gPj0gJG4pID8gMSA6IDA7CisKKyAgICBteSAkbXVzdF9iZV9xdW90ZWQ7CisgICAgbXkgQHJlc3VsdHM7CisgICAgZm9yKG15ICRpID0gMDsgJGkgPD0gJG47ICRpKyspIHsKKyAgICAgICAgbXkgJHZfcmVmOworICAgICAgICBpZiAoJGJvdW5kKSB7CisgICAgICAgICAgICAkdl9yZWYgPSAkc2VsZi0+X19ib3VuZF9maWVsZCgkY3R4LCAkaSwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoQCRmaWVsZHMgPiAkaSkgeworICAgICAgICAgICAgICAgICR2X3JlZiA9IFwoJGZpZWxkcy0+WyRpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbmV4dCB1bmxlc3MgJHZfcmVmOworCisgICAgICAgIG15ICR2YWx1ZSA9ICQkdl9yZWY7CisKKyAgICAgICAgdW5sZXNzIChkZWZpbmVkICR2YWx1ZSkgeworICAgICAgICAgICAgcHVzaCBAcmVzdWx0cywgJyc7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisgICAgICAgIGVsc2lmICggISRiaW5hcnkgKSB7CisgICAgICAgICAgICAkYmluYXJ5ID0gMSBpZiB1dGY4Ojppc191dGY4ICR2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghJGJpbmFyeSBhbmQgJHZhbHVlID1+IC9bXlx4MDlceDIwLVx4N0VdLykgeworICAgICAgICAgICAgIyBhbiBhcmd1bWVudCBjb250YWluZWQgYW4gaW52YWxpZCBjaGFyYWN0ZXIuLi4KKyAgICAgICAgICAgICRzZWxmLT57X0VSUk9SX0lOUFVUfSA9ICR2YWx1ZTsKKyAgICAgICAgICAgICRzZWxmLT5TZXREaWFnKDIxMTApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAkbXVzdF9iZV9xdW90ZWQgPSAwOworICAgICAgICBpZiAoJHZhbHVlIGVxICcnKSB7CisgICAgICAgICAgICAkbXVzdF9iZV9xdW90ZWQrKyBpZiAkY3R4LT57cXVvdGVfZW1wdHl9IG9yICgkY2hlY2tfbWV0YSAmJiAkc2VsZi0+aXNfcXVvdGVkKCRpKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZigkdmFsdWUgPX4gcy8kcmVfZXNjLyRlc2MkMS9nIGFuZCAkcXVvdCBuZSAnJyl7CisgICAgICAgICAgICAgICAgJG11c3RfYmVfcXVvdGVkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZigkdmFsdWUgPX4gLyRyZV9zcC8peworICAgICAgICAgICAgICAgICRtdXN0X2JlX3F1b3RlZCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggJGJpbmFyeSBhbmQgJGN0eC0+e2VzY2FwZV9udWxsfSApeworICAgICAgICAgICAgICAgIHVzZSBieXRlczsKKyAgICAgICAgICAgICAgICAkbXVzdF9iZV9xdW90ZWQrKyBpZiAoICR2YWx1ZSA9fiBzL1wwLyR7ZXNjfTAvZyB8fCAoJGN0eC0+e3F1b3RlX2JpbmFyeX0gJiYgJHZhbHVlID1+IC9bXHgwMC1ceDFmXHg3Zi1ceGEwXS8pICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZigkY3R4LT57YWx3YXlzX3F1b3RlfSBvciAkbXVzdF9iZV9xdW90ZWQgb3IgKCRjaGVja19tZXRhICYmICRzZWxmLT5pc19xdW90ZWQoJGkpKSl7CisgICAgICAgICAgICAkdmFsdWUgPSAkcXVvdCAuICR2YWx1ZSAuICRxdW90OworICAgICAgICB9CisgICAgICAgIHB1c2ggQHJlc3VsdHMsICR2YWx1ZTsKKyAgICB9CisKKyAgICAkJGRzdCA9IGpvaW4oJHNlcCwgQHJlc3VsdHMpIC4gKCBkZWZpbmVkICRjdHgtPntlb2x9ID8gJGN0eC0+e2VvbH0gOiAnJyApOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBwcmludCB7CisgICAgbXkgKCRzZWxmLCAkaW8sICRmaWVsZHMpID0gQF87CisKKyAgICByZXF1aXJlIElPOjpIYW5kbGU7CisKKyAgICBpZiAoIWRlZmluZWQgJGZpZWxkcykgeworICAgICAgICAkZmllbGRzID0gW107CisgICAgfSBlbHNpZihyZWYoJGZpZWxkcykgbmUgJ0FSUkFZJyl7CisgICAgICAgIENhcnA6OmNyb2FrKCJFeHBlY3RlZCBmaWVsZHMgdG8gYmUgYW4gYXJyYXkgcmVmIik7CisgICAgfQorCisgICAgJHNlbGYtPl9ob29rKGJlZm9yZV9wcmludCA9PiAkZmllbGRzKTsKKworICAgIG15ICRzdHIgPSAiIjsKKyAgICAkc2VsZi0+X19jb21iaW5lKFwkc3RyLCAkZmllbGRzLCAxKSBvciByZXR1cm4gJyc7CisKKyAgICBsb2NhbCAkXCA9ICcnOworCisgICAgJGlvLT5wcmludCggJHN0ciApIG9yICRzZWxmLT5fc2V0X2Vycm9yX2RpYWcoMjIwMCk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIG1ldGhvZHMgZm9yIHBhcnNlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK3N1YiBfX3BhcnNlIHsgIyBjeF94c1BhcnNlCisgICAgbXkgKCRzZWxmLCAkZmllbGRzLCAkZmZsYWdzLCAkc3JjLCAkdXNlSU8pID0gQF87CisKKyAgICBteSAkY3R4ID0gJHNlbGYtPl9zZXR1cF9jdHg7CisgICAgbXkgJHN0YXRlID0gJHNlbGYtPl9fX3BhcnNlKCRjdHgsICRmaWVsZHMsICRmZmxhZ3MsICRzcmMsICR1c2VJTyk7CisgICAgaWYgKCRzdGF0ZSBhbmQgKCRjdHgtPntoYXNfaG9va3N9IHx8IDApICYgSE9PS19BRlRFUl9QQVJTRSkgeworICAgICAgICAkc2VsZi0+X2hvb2soYWZ0ZXJfcGFyc2UgPT4gJGZpZWxkcyk7CisgICAgfQorICAgIHJldHVybiAkc3RhdGUgfHwgISRsYXN0X2Vycm9yOworfQorCitzdWIgX19fcGFyc2UgeyAjIGN4X2NfeHNQYXJzZQorICAgIG15ICgkc2VsZiwgJGN0eCwgJGZpZWxkcywgJGZmbGFncywgJHNyYywgJHVzZUlPKSA9IEBfOworCisgICAgbG9jYWwgJC8gPSAkY3R4LT57ZW9sfSBpZiAkY3R4LT57ZW9seH0gb3IgJGN0eC0+e2VvbF9pc19jcn07CisKKyAgICBpZiAoJGN0eC0+e3VzZUlPfSA9ICR1c2VJTykgeworICAgICAgICByZXF1aXJlIElPOjpIYW5kbGU7CisKKyAgICAgICAgJGN0eC0+e3RtcH0gPSB1bmRlZjsKKyAgICAgICAgaWYgKCRjdHgtPntoYXNfYWhlYWR9IGFuZCBkZWZpbmVkICRzZWxmLT57X0FIRUFEfSkgeworICAgICAgICAgICAgJGN0eC0+e3RtcH0gPSAkc2VsZi0+e19BSEVBRH07CisgICAgICAgICAgICAkY3R4LT57c2l6ZX0gPSBsZW5ndGggJGN0eC0+e3RtcH07CisgICAgICAgICAgICAkY3R4LT57dXNlZH0gPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgJGN0eC0+e3RtcH0gPSAkc3JjOworICAgICAgICAkY3R4LT57c2l6ZX0gPSBsZW5ndGggJHNyYzsKKyAgICAgICAgJGN0eC0+e3VzZWR9ID0gMDsKKyAgICAgICAgJGN0eC0+e3V0Zjh9ID0gdXRmODo6aXNfdXRmOCgkc3JjKTsKKyAgICB9CisgICAgaWYgKCRjdHgtPntoYXNfZXJyb3JfaW5wdXR9KSB7CisgICAgICAgICRzZWxmLT57X0VSUk9SX0lOUFVUfSA9IHVuZGVmOworICAgICAgICAkY3R4LT57aGFzX2Vycm9yX2lucHV0fSA9IDA7CisgICAgfQorCisgICAgbXkgJHJlc3VsdCA9ICRzZWxmLT5fX19fcGFyc2UoJGN0eCwgJHNyYywgJGZpZWxkcywgJGZmbGFncyk7CisgICAgJHNlbGYtPntfUkVDTk99ID0gKysoJGN0eC0+e3JlY25vfSk7CisgICAgJHNlbGYtPntfRU9GfSA9ICcnOworCisgICAgaWYgKCRjdHgtPntzdHJpY3R9KSB7CisgICAgICAgICRjdHgtPntzdHJpY3Rfbn0gfHw9ICRjdHgtPntmbGRfaWR4fTsKKyAgICAgICAgaWYgKCRjdHgtPntzdHJpY3Rfbn0gIT0gJGN0eC0+e2ZsZF9pZHh9KSB7CisgICAgICAgICAgICAkc2VsZi0+X19wYXJzZV9lcnJvcigkY3R4LCAyMDE0LCAkY3R4LT57dXNlZH0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCRjdHgtPnt1c2VJT30pIHsKKyAgICAgICAgaWYgKGRlZmluZWQgJGN0eC0+e3RtcH0gYW5kICRjdHgtPnt1c2VkfSA8ICRjdHgtPntzaXplfSBhbmQgJGN0eC0+e2hhc19haGVhZH0pIHsKKyAgICAgICAgICAgICRzZWxmLT57X0FIRUFEfSA9IHN1YnN0cigkY3R4LT57dG1wfSwgJGN0eC0+e3VzZWR9LCAkY3R4LT57c2l6ZX0gLSAkY3R4LT57dXNlZH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGN0eC0+e2hhc19haGVhZH0gPSAwOworICAgICAgICAgICAgaWYgKCRjdHgtPnt1c2VJT30gJiB1c2VJT19FT0YpIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+e19FT0Z9ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgkZmZsYWdzKSB7CisgICAgICAgICAgICBpZiAoJGN0eC0+e2tlZXBfbWV0YV9pbmZvfSkgeworICAgICAgICAgICAgICAgICRzZWxmLT57X0ZGTEFHU30gPSAkZmZsYWdzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1bmRlZiAkZmZsYWdzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCRyZXN1bHQgYW5kICRjdHgtPnt0eXBlc30pIHsKKyAgICAgICAgbXkgJGxlbiA9IEAkZmllbGRzOworICAgICAgICBmb3IobXkgJGkgPSAwOyAkaSA8PSAkbGVuICYmICRpIDw9ICRjdHgtPnt0eXBlc19sZW59OyAkaSsrKSB7CisgICAgICAgICAgICBteSAkdmFsdWUgPSAkZmllbGRzLT5bJGldOworICAgICAgICAgICAgbmV4dCB1bmxlc3MgZGVmaW5lZCAkdmFsdWU7CisgICAgICAgICAgICBteSAkdHlwZSA9IG9yZChzdWJzdHIoJGN0eC0+e3R5cGVzfSwgJGksIDEpKTsKKyAgICAgICAgICAgIGlmICgkdHlwZSA9PSBJVikgeworICAgICAgICAgICAgICAgICRmaWVsZHMtPlskaV0gPSBpbnQoJHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzaWYgKCR0eXBlID09IE5WKSB7CisgICAgICAgICAgICAgICAgJGZpZWxkcy0+WyRpXSA9ICR2YWx1ZSArIDAuMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICRyZXN1bHQ7Cit9CisKK3N1YiBfX19fcGFyc2UgeyAjIGN4X1BhcnNlCisgICAgbXkgKCRzZWxmLCAkY3R4LCAkc3JjLCAkZmllbGRzLCAkZmZsYWdzKSA9IEBfOworCisgICAgbXkgKCRxdW90LCAkc2VwLCAkZXNjLCAkZW9sKSA9IEB7JGN0eH17cXcvcXVvIHNlcCBlc2NhcGVfY2hhciBlb2wvfTsKKworICAgIHV0Zjg6OmVuY29kZSgkc2VwKSAgaWYgISRjdHgtPnt1dGY4fSBhbmQgJGN0eC0+e3NlcF9sZW59OworICAgIHV0Zjg6OmVuY29kZSgkcXVvdCkgaWYgISRjdHgtPnt1dGY4fSBhbmQgJGN0eC0+e3F1b19sZW59OworICAgIHV0Zjg6OmVuY29kZSgkZW9sKSAgaWYgISRjdHgtPnt1dGY4fSBhbmQgJGN0eC0+e2VvbF9sZW59OworCisgICAgbXkgJHNlZW5Tb21ldGhpbmcgPSAgMDsKKyAgICBteSAkd2FpdGluZ0ZvckZpZWxkID0gMTsKKyAgICBteSAoJHZhbHVlLCAkdl9yZWYpOworICAgICRjdHgtPntmbGRfaWR4fSA9IG15ICRmbnVtID0gMDsKKyAgICAkY3R4LT57ZmxhZ30gPSAwOworCisgICAgbXkgJHJlX3N0ciA9IGpvaW4gJ3wnLCBtYXAoeyRfIGVxICJcMCIgPyAnW1xcMF0nIDogcXVvdGVtZXRhKCRfKX0gc29ydCB7bGVuZ3RoICRiIDw9PiBsZW5ndGggJGF9IGdyZXAge2RlZmluZWQgJF8gYW5kICRfIG5lICcnfSAkc2VwLCAkcXVvdCwgJGVzYywgJGVvbCksICJcMDE1IiwgIlwwMTIiLCAiXHgwOSIsICIgIjsKKyAgICAkY3R4LT57X3JlfSA9IHFyLyRyZV9zdHIvOworICAgIG15ICRyZSA9IHFyLyRyZV9zdHJ8W15ceDA5XHgyMC1ceDdFXXwkLzsKKworTE9PUDoKKyAgICB3aGlsZSgkc2VsZi0+X19nZXRfZnJvbV9zcmMoJGN0eCwgJHNyYykpIHsKKyAgICAgICAgd2hpbGUoJGN0eC0+e3RtcH0gPX4gL1xHKC4qPykoJHJlKS9ncykgeworICAgICAgICAgICAgbXkgKCRoaXQsICRjKSA9ICgkMSwgJDIpOworICAgICAgICAgICAgJGN0eC0+e3VzZWR9ID0gcG9zKCRjdHgtPnt0bXB9KTsKKyAgICAgICAgICAgIGlmICghJHdhaXRpbmdGb3JGaWVsZCBhbmQgJGMgZXEgJycgYW5kICRoaXQgbmUgJycgYW5kICRjdHgtPnt1c2VJT30gYW5kICEoJGN0eC0+e3VzZUlPfSAmIHVzZUlPX0VPRikpIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+e19BSEVBRH0gPSAkaGl0OworICAgICAgICAgICAgICAgICRjdHgtPntoYXNfYWhlYWR9ID0gMTsKKyAgICAgICAgICAgICAgICAkY3R4LT57aGFzX2xlZnRvdmVyfSA9IDE7CisgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3QgaWYgJHNlZW5Tb21ldGhpbmcgYW5kICRoaXQgZXEgJycgYW5kICRjIGVxICcnOyAjIEVPRgorCisgICAgICAgICAgICAjIG5ldyBmaWVsZAorICAgICAgICAgICAgaWYgKCEkdl9yZWYpIHsKKyAgICAgICAgICAgICAgICBpZiAoJGN0eC0+e2lzX2JvdW5kfSkgeworICAgICAgICAgICAgICAgICAgICAkdl9yZWYgPSAkc2VsZi0+X19ib3VuZF9maWVsZCgkY3R4LCAkZm51bSsrLCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAnJzsKKyAgICAgICAgICAgICAgICAgICAgJHZfcmVmID0gXCR2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHVubGVzcyAkdl9yZWY7CisgICAgICAgICAgICAgICAgJGN0eC0+e2ZsYWd9ID0gMDsgICAgCisgICAgICAgICAgICAgICAgJGN0eC0+e2ZsZF9pZHh9Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRzZWVuU29tZXRoaW5nID0gMTsKKworICAgICAgICAgICAgaWYgKGRlZmluZWQgJGhpdCBhbmQgJGhpdCBuZSAnJykgeworICAgICAgICAgICAgICAgIGlmICgkd2FpdGluZ0ZvckZpZWxkKSB7CisgICAgICAgICAgICAgICAgICAgICR3YWl0aW5nRm9yRmllbGQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoJGhpdCA9fiAvW15ceDA5XHgyMC1ceDdFXS8pIHsKKyAgICAgICAgICAgICAgICAgICAgJGN0eC0+e2ZsYWd9IHw9IElTX0JJTkFSWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJCR2X3JlZiAuPSAkaGl0OworICAgICAgICAgICAgfQorCitSRVNUQVJUOgorICAgICAgICAgICAgaWYgKGRlZmluZWQgJGMgYW5kIGRlZmluZWQgJHNlcCBhbmQgJGMgZXEgJHNlcCkgeworICAgICAgICAgICAgICAgIGlmICgkd2FpdGluZ0ZvckZpZWxkKSB7CisgICAgICAgICAgICAgICAgICAgICMgLDEsImZvbywgMyIsLGJhciwKKyAgICAgICAgICAgICAgICAgICAgIyBeICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgIGlmICgkY3R4LT57YmxhbmtfaXNfdW5kZWZ9IG9yICRjdHgtPntlbXB0eV9pc191bmRlZn0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICQkdl9yZWYgPSB1bmRlZjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICQkdl9yZWYgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1bmxlc3MgKCRjdHgtPntpc19ib3VuZH0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQCRmaWVsZHMsICQkdl9yZWY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJHZfcmVmID0gdW5kZWY7CisgICAgICAgICAgICAgICAgICAgIGlmICgkY3R4LT57a2VlcF9tZXRhX2luZm99IGFuZCAkZmZsYWdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEAkZmZsYWdzLCAkY3R4LT57ZmxhZ307CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2lmICgkY3R4LT57ZmxhZ30gJiBJU19RVU9URUQpIHsKKyAgICAgICAgICAgICAgICAgICAgIyAsMSwiZm9vLCAzIiwsYmFyLAorICAgICAgICAgICAgICAgICAgICAjICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICQkdl9yZWYgLj0gJGM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIyAsMSwiZm9vLCAzIiwsYmFyLAorICAgICAgICAgICAgICAgICAgICAjICAgXiAgICAgICAgXiAgICBeCisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX3B1c2hfdmFsdWUoJGN0eCwgJHZfcmVmLCAkZmllbGRzLCAkZmZsYWdzLCAkY3R4LT57ZmxhZ30pOworICAgICAgICAgICAgICAgICAgICAkdl9yZWYgPSB1bmRlZjsKKyAgICAgICAgICAgICAgICAgICAgJHdhaXRpbmdGb3JGaWVsZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKGRlZmluZWQgJGMgYW5kIGRlZmluZWQgJHF1b3QgYW5kICRxdW90IG5lICJcMCIgYW5kICRjIGVxICRxdW90KSB7CisgICAgICAgICAgICAgICAgaWYgKCR3YWl0aW5nRm9yRmllbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgIyAsMSwiZm9vLCAzIiwsYmFyLFxyXG4KKyAgICAgICAgICAgICAgICAgICAgIyAgICBeCisgICAgICAgICAgICAgICAgICAgICRjdHgtPntmbGFnfSB8PSBJU19RVU9URUQ7CisgICAgICAgICAgICAgICAgICAgICR3YWl0aW5nRm9yRmllbGQgPSAwOworICAgICAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoJGN0eC0+e2ZsYWd9ICYgSVNfUVVPVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICMgLDEsImZvbywgMyIsLGJhcixcclxuCisgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgbXkgJHF1b2VzYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIG15ICRjMiA9ICRzZWxmLT5fX2dldCgkY3R4KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoJGN0eC0+e2FsbG93X3doaXRlc3BhY2V9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAjICwgMSAsICJmb28sIDMiICwgLCBiYXIgLCBcclxuCisgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgXgorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoJHNlbGYtPl9faXNfd2hpdGVzcGFjZSgkY3R4LCAkYzIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjdHgtPnthbGxvd19sb29zZV9xdW90ZXN9IGFuZCAhKGRlZmluZWQgJGVzYyBhbmQgJGMyIGVxICRlc2MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkdl9yZWYgLj0gJGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjID0gJGMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYzIgPSAkc2VsZi0+X19nZXQoJGN0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIWRlZmluZWQgJGMyKSB7ICMgRU9GCisgICAgICAgICAgICAgICAgICAgICAgICAjICwxLCJmb28sIDMiCisgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgXgorICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPl9fcHVzaF92YWx1ZSgkY3R4LCAkdl9yZWYsICRmaWVsZHMsICRmZmxhZ3MsICRjdHgtPntmbGFnfSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChkZWZpbmVkICRjMiBhbmQgZGVmaW5lZCAkc2VwIGFuZCAkYzIgZXEgJHNlcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIyAsMSwiZm9vLCAzIiwsYmFyLFxyXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X19wdXNoX3ZhbHVlKCRjdHgsICR2X3JlZiwgJGZpZWxkcywgJGZmbGFncywgJGN0eC0+e2ZsYWd9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR2X3JlZiA9IHVuZGVmOworICAgICAgICAgICAgICAgICAgICAgICAgJHdhaXRpbmdGb3JGaWVsZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWZpbmVkICRjMiBhbmQgKCRjMiBlcSAiXDAxMiIgb3IgKGRlZmluZWQgJGVvbCBhbmQgJGMyIGVxICRlb2wpKSkgeyAjIEZJWE1FOiBFT0xYCisgICAgICAgICAgICAgICAgICAgICAgICAjICwxLCJmb28sIDMiLCwiYmFyIlxuCisgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX3B1c2hfdmFsdWUoJGN0eCwgJHZfcmVmLCAkZmllbGRzLCAkZmZsYWdzLCAkY3R4LT57ZmxhZ30pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCAkZXNjIGFuZCAkYyBlcSAkZXNjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkcXVvZXNjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZpbmVkICRjMiBhbmQgJGMyIGVxICcwJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLDEsImZvbywgMyIwNTYiLCxiYXIsXHJcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCR2X3JlZiAuPSAiXDAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCAkYzIgYW5kIGRlZmluZWQgJHF1b3QgYW5kICRjMiBlcSAkcXVvdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLDEsImZvbywgMyIiNTYiLCxiYXIsXHJcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjdHgtPnt1dGY4fSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY3R4LT57ZmxhZ30gfD0gSVNfQklOQVJZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJHZfcmVmIC49ICRjMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjdHgtPnthbGxvd19sb29zZV9lc2NhcGVzfSBhbmQgZGVmaW5lZCAkYzIgYW5kICRjMiBuZSAiXDAxNSIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICwxLCJmb28sIDMiNTYiLCxiYXIsXHJcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCR2X3JlZiAuPSAkYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYyA9ICRjMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIFJFU1RBUlQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmluZWQgJGMyIGFuZCAkYzIgZXEgIlwwMTUiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGN0eC0+e2VvbF9pc19jcn0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICwxLCJmb28sIDMiXHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX3B1c2hfdmFsdWUoJGN0eCwgJHZfcmVmLCAkZmllbGRzLCAkZmZsYWdzLCAkY3R4LT57ZmxhZ30pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBteSAkYzMgPSAkc2VsZi0+X19nZXQoJGN0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCAkYzMgYW5kICRjMyBlcSAiXDAxMiIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICwxLCJmb28sIDMiXHJcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X19wdXNoX3ZhbHVlKCRjdHgsICR2X3JlZiwgJGZpZWxkcywgJGZmbGFncywgJGN0eC0+e2ZsYWd9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjdHgtPnt1c2VJT30gYW5kICEkY3R4LT57ZW9sX2xlbn0gYW5kICRjMyAhfiAvW15ceDA5XHgyMC1ceDdFXS8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICwxLCJmb29cbiAzIiwsImJhciJccgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYmF6LDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X19zZXRfZW9sX2lzX2NyKCRjdHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPnt1c2VkfS0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPntoYXNfYWhlYWR9ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X19wdXNoX3ZhbHVlKCRjdHgsICR2X3JlZiwgJGZpZWxkcywgJGZmbGFncywgJGN0eC0+e2ZsYWd9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPl9fcGFyc2VfZXJyb3IoJGN0eCwgJHF1b2VzYyA/IDIwMjMgOiAyMDEwLCAkY3R4LT57dXNlZH0gLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgkY3R4LT57YWxsb3dfbG9vc2VfcXVvdGVzfSBhbmQgISRxdW9lc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICMgLDEsImZvbywgMyI0NTYiLCxiYXIsXHJcbgorICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICQkdl9yZWYgLj0gJGM7CisgICAgICAgICAgICAgICAgICAgICAgICAkYyA9ICRjMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gUkVTVEFSVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjIDEsImZvbyIgIiwzCisgICAgICAgICAgICAgICAgICAgICMgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCRxdW9lc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPnt1c2VkfS0tOworICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPl9fZXJyb3JfaW5zaWRlX3F1b3RlcygkY3R4LCAyMDIzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X19lcnJvcl9pbnNpZGVfcXVvdGVzKCRjdHgsIDIwMTEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICMgIXdhaXRpbmdGb3JGaWVsZCwgIUluc2lkZVF1b3RlcworICAgICAgICAgICAgICAgIGlmICgkY3R4LT57YWxsb3dfbG9vc2VfcXVvdGVzfSkgeyAjIDEsZm9vICJib28iIGQndWgsMQorICAgICAgICAgICAgICAgICAgICAkY3R4LT57ZmxhZ30gfD0gSVNfRVJST1I7CisgICAgICAgICAgICAgICAgICAgICQkdl9yZWYgLj0gJGM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPl9fZXJyb3JfaW5zaWRlX2ZpZWxkKCRjdHgsIDIwMzQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKGRlZmluZWQgJGMgYW5kIGRlZmluZWQgJGVzYyBhbmQgJGVzYyBuZSAiXDAiIGFuZCAkYyBlcSAkZXNjKSB7CisgICAgICAgICAgICAgICAgIyBUaGlzIG1lYW5zIHF1b3RlX2NoYXIgIT0gZXNjYXBlX2NoYXIKKyAgICAgICAgICAgICAgICBpZiAoJHdhaXRpbmdGb3JGaWVsZCkgeworICAgICAgICAgICAgICAgICAgICAkd2FpdGluZ0ZvckZpZWxkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRjdHgtPnthbGxvd191bnF1b3RlZF9lc2NhcGV9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBlc2NhcGUgY2hhcmFjdGVyIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgdW5xdW90ZWQgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgLi4uIGdldCBhbmQgc3RvcmUgbmV4dCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICRjMiA9ICRzZWxmLT5fX2dldCgkY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICQkdl9yZWYgPSAiIjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRjMikgeyAjIEVPRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPnt1c2VkfS0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX2Vycm9yX2luc2lkZV9maWVsZCgkY3R4LCAyMDM1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGMyIGVxICcwJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkdl9yZWYgLj0gIlwwIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmaW5lZCAkcXVvdCBhbmQgJGMyIGVxICRxdW90KSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZpbmVkICRzZXAgYW5kICRjMiBlcSAkc2VwKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZpbmVkICRlc2MgYW5kICRjMiBlcSAkZXNjKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPnthbGxvd19sb29zZV9lc2NhcGVzfQorICAgICAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjdHgtPnt1dGY4fSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY3R4LT57ZmxhZ30gfD0gSVNfQklOQVJZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJHZfcmVmIC49ICRjMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPl9fcGFyc2VfaW5zaWRlX3F1b3RlcygkY3R4LCAyMDI1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCRjdHgtPntmbGFnfSAmIElTX1FVT1RFRCkgeworICAgICAgICAgICAgICAgICAgICBteSAkYzIgPSAkc2VsZi0+X19nZXQoJGN0eCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGVmaW5lZCAkYzIpIHsgIyBFT0YKKyAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPnt1c2VkfS0tOworICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPl9fZXJyb3JfaW5zaWRlX3F1b3RlcygkY3R4LCAyMDI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoJGMyIGVxICcwJykgeworICAgICAgICAgICAgICAgICAgICAgICAgJCR2X3JlZiAuPSAiXDAiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2lmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZWZpbmVkICRxdW90IGFuZCAkYzIgZXEgJHF1b3QpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAoZGVmaW5lZCAkc2VwIGFuZCAkYzIgZXEgJHNlcCkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZWZpbmVkICRlc2MgYW5kICRjMiBlcSAkZXNjKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgJGN0eC0+e2FsbG93X2xvb3NlX2VzY2FwZXN9CisgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjdHgtPnt1dGY4fSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPntmbGFnfSB8PSBJU19CSU5BUlk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAkJHZfcmVmIC49ICRjMjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPnt1c2VkfS0tOworICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPl9fZXJyb3JfaW5zaWRlX3F1b3RlcygkY3R4LCAyMDI1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoJHZfcmVmKSB7CisgICAgICAgICAgICAgICAgICAgIG15ICRjMiA9ICRzZWxmLT5fX2dldCgkY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRjMikgeyAjIEVPRgorICAgICAgICAgICAgICAgICAgICAgICAgJGN0eC0+e3VzZWR9LS07CisgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X19lcnJvcl9pbnNpZGVfZmllbGQoJGN0eCwgMjAzNSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJCR2X3JlZiAuPSAkYzI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X19lcnJvcl9pbnNpZGVfZmllbGQoJGN0eCwgMjAzNik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoZGVmaW5lZCAkYyBhbmQgKCRjIGVxICJcMDEyIiBvciAkYyBlcSAnJyBvciAoZGVmaW5lZCAkZW9sIGFuZCAkYyBlcSAkZW9sIGFuZCAkZW9sIG5lICJcMDE1IikpKSB7ICMgRU9MCisgICAgRU9MWDoKKyAgICAgICAgICAgICAgICBpZiAoJHdhaXRpbmdGb3JGaWVsZCkgeworICAgICAgICAgICAgICAgICAgICAjICwxLCJmb28sIDMiLCxiYXIsCisgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgIGlmICgkY3R4LT57YmxhbmtfaXNfdW5kZWZ9IG9yICRjdHgtPntlbXB0eV9pc191bmRlZn0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICQkdl9yZWYgPSB1bmRlZjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICQkdl9yZWYgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1bmxlc3MgKCRjdHgtPntpc19ib3VuZH0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQCRmaWVsZHMsICQkdl9yZWY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCRjdHgtPntrZWVwX21ldGFfaW5mb30gYW5kICRmZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQCRmZmxhZ3MsICRjdHgtPntmbGFnfTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCRjdHgtPntmbGFnfSAmIElTX1FVT1RFRCkgeworICAgICAgICAgICAgICAgICAgICAjICwxLCJmb29cbiAzIiwsYmFyLAorICAgICAgICAgICAgICAgICAgICAjICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICRjdHgtPntmbGFnfSB8PSBJU19CSU5BUlk7CisgICAgICAgICAgICAgICAgICAgIHVubGVzcyAoJGN0eC0+e2JpbmFyeX0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX2Vycm9yX2luc2lkZV9xdW90ZXMoJGN0eCwgMjAyMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJCR2X3JlZiAuPSAkYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCRjdHgtPnt2ZXJiYXRpbX0pIHsKKyAgICAgICAgICAgICAgICAgICAgIyAsMSxmb29cbiAzLCxiYXIsCisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBmZWF0dXJlIHNob3VsZCBiZSBkZXByZWNhdGVkCisgICAgICAgICAgICAgICAgICAgICRjdHgtPntmbGFnfSB8PSBJU19CSU5BUlk7CisgICAgICAgICAgICAgICAgICAgIHVubGVzcyAoJGN0eC0+e2JpbmFyeX0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX2Vycm9yX2luc2lkZV9maWVsZCgkY3R4LCAyMDMwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAkJHZfcmVmIC49ICRjIHVubGVzcyAkY3R4LT57ZW9sfSBlcSAkYyBhbmQgJGN0eC0+e3VzZUlPfTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICMgc2VwPSwKKyAgICAgICAgICAgICAgICAgICAgIyAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEkY3R4LT57cmVjbm99IGFuZCAkY3R4LT57ZmxkX2lkeH0gPT0gMSBhbmQgJGN0eC0+e3VzZUlPfSBhbmQgJGhpdCA9fiAvXnNlcD0oLnsxLDE2fSkkL2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPntzZXB9ID0gJDE7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2UgYnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBteSAkbGVuID0gbGVuZ3RoICRjdHgtPntzZXB9OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZW4gPD0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY3R4LT57c2VwX2xlbn0gPSAkbGVuID09IDEgPyAwIDogJGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNlbGYtPl9fX19wYXJzZSgkY3R4LCAkc3JjLCAkZmllbGRzLCAkZmZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICMgLDEsImZvb1xuIDMiLCxiYXIKKyAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPl9fcHVzaF92YWx1ZSgkY3R4LCAkdl9yZWYsICRmaWVsZHMsICRmZmxhZ3MsICRjdHgtPntmbGFnfSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmIChkZWZpbmVkICRjIGFuZCAkYyBlcSAiXDAxNSIgYW5kICEkY3R4LT57dmVyYmF0aW19KSB7CisgICAgICAgICAgICAgICAgaWYgKCR3YWl0aW5nRm9yRmllbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgJHdhaXRpbmdGb3JGaWVsZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICgkY3R4LT57ZW9sX2lzX2NyfSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIyAsMSwiZm9vXG4gMyIsLGJhcixccgorICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICAgICAkYyA9ICJcMDEyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gUkVTVEFSVDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG15ICRjMiA9ICRzZWxmLT5fX2dldCgkY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRjMikgeyAjIEVPRgorICAgICAgICAgICAgICAgICAgICAgICAgIyAsMSwiZm9vXG4gMyIsLGJhcixccgorICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICRjID0gdW5kZWY7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIFJFU1RBUlQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCRjMiBlcSAiXDAxMiIpIHsgIyBcciBpcyBub3Qgb3B0aW9uYWwgYmVmb3JlIEVPTFghCisgICAgICAgICAgICAgICAgICAgICAgICAjICwxLCJmb29cbiAzIiwsYmFyLFxyXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICAgICAkYyA9ICRjMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gUkVTVEFSVDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgkY3R4LT57dXNlSU99IGFuZCAhJGN0eC0+e2VvbF9sZW59IGFuZCAkYzIgIX4gL1teXHgwOVx4MjAtXHg3RV0vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAjICwxLCJmb29cbiAzIiwsYmFyLFxyCisgICAgICAgICAgICAgICAgICAgICAgICAjIGJheiw0CisgICAgICAgICAgICAgICAgICAgICAgICAjIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX3NldF9lb2xfaXNfY3IoJGN0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkY3R4LT57dXNlZH0tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPntoYXNfYWhlYWR9ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX3B1c2hfdmFsdWUoJGN0eCwgJHZfcmVmLCAkZmllbGRzLCAkZmZsYWdzLCAkY3R4LT57ZmxhZ30pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAjICwxLCJmb29cbiAzIiwsYmFyLFxyXHQKKyAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgJGN0eC0+e3VzZWR9LS07CisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX2Vycm9yX2luc2lkZV9maWVsZCgkY3R4LCAyMDMxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoJGN0eC0+e2ZsYWd9ICYgSVNfUVVPVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICMgLDEsImZvb1xyIDMiLCxiYXIsXHJcdAorICAgICAgICAgICAgICAgICAgICAjICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICRjdHgtPntmbGFnfSB8PSBJU19CSU5BUlk7CisgICAgICAgICAgICAgICAgICAgIHVubGVzcyAoJGN0eC0+e2JpbmFyeX0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX2Vycm9yX2luc2lkZV9xdW90ZXMoJGN0eCwgMjAyMik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJCR2X3JlZiAuPSAkYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgkY3R4LT57ZW9sX2lzX2NyfSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIyAsMSwiZm9vXG4gMyIsLGJhclxyCisgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgXgorICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPl9fcHVzaF92YWx1ZSgkY3R4LCAkdl9yZWYsICRmaWVsZHMsICRmZmxhZ3MsICRjdHgtPntmbGFnfSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG15ICRjMiA9ICRzZWxmLT5fX2dldCgkY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmluZWQgJGMyIGFuZCAkYzIgZXEgIlwwMTIiKSB7ICMgXHIgaXMgbm90IG9wdGlvbmFsIGJlZm9yZSBFT0xYIQorICAgICAgICAgICAgICAgICAgICAgICAgIyAsMSwiZm9vXG4gMyIsLGJhclxyXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX3B1c2hfdmFsdWUoJGN0eCwgJHZfcmVmLCAkZmllbGRzLCAkZmZsYWdzLCAkY3R4LT57ZmxhZ30pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoJGN0eC0+e3VzZUlPfSBhbmQgISRjdHgtPntlb2xfbGVufSBhbmQgJGMyICF+IC9bXlx4MDlceDIwLVx4N0VdLykgeworICAgICAgICAgICAgICAgICAgICAgICAgIyAsMSwiZm9vXG4gMyIsLGJhclxyCisgICAgICAgICAgICAgICAgICAgICAgICAjIGJheiw0CisgICAgICAgICAgICAgICAgICAgICAgICAjIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX3NldF9lb2xfaXNfY3IoJGN0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkY3R4LT57dXNlZH0tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPntoYXNfYWhlYWR9ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX3B1c2hfdmFsdWUoJGN0eCwgJHZfcmVmLCAkZmllbGRzLCAkZmZsYWdzLCAkY3R4LT57ZmxhZ30pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAjICwxLCJmb29cbiAzIiwsYmFyXHJcdAorICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX2Vycm9yX2luc2lkZV9maWVsZCgkY3R4LCAyMDMyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgkY3R4LT57ZW9seH0gYW5kICRjIGVxICRlb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgJGMgPSAnJzsKKyAgICAgICAgICAgICAgICAgICAgZ290byBFT0xYOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgkd2FpdGluZ0ZvckZpZWxkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgkY3R4LT57YWxsb3dfd2hpdGVzcGFjZX0gYW5kICRzZWxmLT5fX2lzX3doaXRlc3BhY2UoJGN0eCwgJGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGMgPSAkc2VsZi0+X19nZXQoJGN0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBpZiAhZGVmaW5lZCAkYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgJHNlbGYtPl9faXNfd2hpdGVzcGFjZSgkY3R4LCAkYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIFJFU1RBUlQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJHdhaXRpbmdGb3JGaWVsZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gUkVTVEFSVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCRjdHgtPntmbGFnfSAmIElTX1FVT1RFRCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWRlZmluZWQgJGMgb3IgJGMgPX4gL1teXHgwOVx4MjAtXHg3RV0vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkY3R4LT57ZmxhZ30gfD0gSVNfQklOQVJZOworICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzICgkY3R4LT57YmluYXJ5fSBvciAkY3R4LT57dXRmOH0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X19lcnJvcl9pbnNpZGVfcXVvdGVzKCRjdHgsIDIwMjYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAkJHZfcmVmIC49ICRjOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGVmaW5lZCAkYyBvciAkYyA9fiAvW15ceDA5XHgyMC1ceDdFXS8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRjdHgtPntmbGFnfSB8PSBJU19CSU5BUlk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmxlc3MgKCRjdHgtPntiaW5hcnl9IG9yICRjdHgtPnt1dGY4fSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5fX2Vycm9yX2luc2lkZV9maWVsZCgkY3R4LCAyMDM3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJCR2X3JlZiAuPSAkYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0IExPT1AgaWYgJGN0eC0+e3VzZUlPfSBhbmQgJGN0eC0+e3ZlcmJhdGltfSBhbmQgJGN0eC0+e3VzZWR9ID09ICRjdHgtPntzaXplfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgkd2FpdGluZ0ZvckZpZWxkKSB7CisgICAgICAgIGlmICgkc2VlblNvbWV0aGluZyBvciAhJGN0eC0+e3VzZUlPfSkgeworICAgICAgICAgICAgIyBuZXcgZmllbGQKKyAgICAgICAgICAgIGlmICghJHZfcmVmKSB7CisgICAgICAgICAgICAgICAgaWYgKCRjdHgtPntpc19ib3VuZH0pIHsKKyAgICAgICAgICAgICAgICAgICAgJHZfcmVmID0gJHNlbGYtPl9fYm91bmRfZmllbGQoJGN0eCwgJGZudW0rKywgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJyc7CisgICAgICAgICAgICAgICAgICAgICR2X3JlZiA9IFwkdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJHZfcmVmOworICAgICAgICAgICAgICAgICRjdHgtPntmbGFnfSA9IDA7CisgICAgICAgICAgICAgICAgJGN0eC0+e2ZsZF9pZHh9Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJGN0eC0+e2JsYW5rX2lzX3VuZGVmfSBvciAkY3R4LT57ZW1wdHlfaXNfdW5kZWZ9KSB7CisgICAgICAgICAgICAgICAgJCR2X3JlZiA9IHVuZGVmOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkJHZfcmVmID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bmxlc3MgKCRjdHgtPntpc19ib3VuZH0pIHsKKyAgICAgICAgICAgICAgICBwdXNoIEAkZmllbGRzLCAkJHZfcmVmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRjdHgtPntrZWVwX21ldGFfaW5mb30gYW5kICRmZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBwdXNoIEAkZmZsYWdzLCAkY3R4LT57ZmxhZ307CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICAkc2VsZi0+U2V0RGlhZygyMDEyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgkY3R4LT57ZmxhZ30gJiBJU19RVU9URUQpIHsKKyAgICAgICAgJHNlbGYtPl9fZXJyb3JfaW5zaWRlX3F1b3RlcygkY3R4LCAyMDI3KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgkdl9yZWYpIHsKKyAgICAgICAgJHNlbGYtPl9fcHVzaF92YWx1ZSgkY3R4LCAkdl9yZWYsICRmaWVsZHMsICRmZmxhZ3MsICRjdHgtPntmbGFnfSk7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdWIgX19nZXRfZnJvbV9zcmMgeworICAgIG15ICgkc2VsZiwgJGN0eCwgJHNyYykgPSBAXzsKKyAgICByZXR1cm4gMSBpZiBkZWZpbmVkICRjdHgtPnt0bXB9IGFuZCAkY3R4LT57dXNlZH0gPD0gMDsKKyAgICByZXR1cm4gMSBpZiAkY3R4LT57dXNlZH0gPCAkY3R4LT57c2l6ZX07CisgICAgcmV0dXJuIHVubGVzcyAkY3R4LT57dXNlSU99OworICAgIG15ICRyZXMgPSAkc3JjLT5nZXRsaW5lOworICAgIGlmIChkZWZpbmVkICRyZXMpIHsKKyAgICAgICAgaWYgKCRjdHgtPntoYXNfYWhlYWR9KSB7CisgICAgICAgICAgICAkY3R4LT57dG1wfSA9ICRzZWxmLT57X0FIRUFEfTsKKyAgICAgICAgICAgICRjdHgtPnt0bXB9IC49ICRjdHgtPntlb2x9IGlmICRjdHgtPntlb2xfbGVufTsKKyAgICAgICAgICAgICRjdHgtPnt0bXB9IC49ICRyZXM7CisgICAgICAgICAgICAkY3R4LT57aGFzX2FoZWFkfSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkY3R4LT57dG1wfSA9ICRyZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRjdHgtPntzaXplfSA9IGxlbmd0aCAkY3R4LT57dG1wfSkgeworICAgICAgICAgICAgJGN0eC0+e3VzZWR9ID0gLTE7CisgICAgICAgICAgICAkY3R4LT57dXRmOH0gPSAxIGlmIHV0Zjg6OmlzX3V0ZjgoJGN0eC0+e3RtcH0pOworICAgICAgICAgICAgcG9zKCRjdHgtPnt0bXB9KSA9IDA7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0gZWxzaWYgKGRlbGV0ZSAkY3R4LT57aGFzX2xlZnRvdmVyfSkgeworICAgICAgICAkY3R4LT57dG1wfSA9ICRzZWxmLT57X0FIRUFEfTsKKyAgICAgICAgJGN0eC0+e2hhc19haGVhZH0gPSAwOworICAgICAgICAkY3R4LT57dXNlSU99IHw9IHVzZUlPX0VPRjsKKyAgICAgICAgaWYgKCRjdHgtPntzaXplfSA9IGxlbmd0aCAkY3R4LT57dG1wfSkgeworICAgICAgICAgICAgJGN0eC0+e3VzZWR9ID0gLTE7CisgICAgICAgICAgICAkY3R4LT57dXRmOH0gPSAxIGlmIHV0Zjg6OmlzX3V0ZjgoJGN0eC0+e3RtcH0pOworICAgICAgICAgICAgcG9zKCRjdHgtPnt0bXB9KSA9IDA7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAkY3R4LT57dG1wfSA9ICcnIHVubGVzcyBkZWZpbmVkICRjdHgtPnt0bXB9OworICAgICRjdHgtPnt1c2VJT30gfD0gdXNlSU9fRU9GOworICAgIHJldHVybjsKK30KKworc3ViIF9fc2V0X2VvbF9pc19jciB7CisgICAgbXkgKCRzZWxmLCAkY3R4KSA9IEBfOworICAgICRjdHgtPntlb2x9ID0gIlwwMTUiOworICAgICRjdHgtPntlb2xfaXNfY3J9ID0gMTsKKyAgICAkY3R4LT57ZW9sX2xlbn0gPSAxOworCisgICAgJHNlbGYtPntlb2x9ID0gJGN0eC0+e2VvbH07Cit9CisKK3N1YiBfX2JvdW5kX2ZpZWxkIHsKKyAgICBteSAoJHNlbGYsICRjdHgsICRpLCAka2VlcCkgPSBAXzsKKyAgICBpZiAoJGkgPj0gJGN0eC0+e2lzX2JvdW5kfSkgeworICAgICAgICAkc2VsZi0+U2V0RGlhZygzMDA2KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocmVmICRjdHgtPntib3VuZH0gZXEgJ0FSUkFZJykgeworICAgICAgICBteSAkcmVmID0gJGN0eC0+e2JvdW5kfVskaV07CisgICAgICAgIGlmIChyZWYgJHJlZikgeworICAgICAgICAgICAgaWYgKCRrZWVwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICRyZWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bmxlc3MgKFNjYWxhcjo6VXRpbDo6cmVhZG9ubHkoJCRyZWYpKSB7CisgICAgICAgICAgICAgICAgJCRyZWYgPSAiIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAkc2VsZi0+U2V0RGlhZygzMDA4KTsKKyAgICByZXR1cm47Cit9CisKK3N1YiBfX2dldCB7CisgICAgbXkgKCRzZWxmLCAkY3R4KSA9IEBfOworICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkY3R4LT57dXNlZH07CisgICAgcmV0dXJuIGlmICRjdHgtPnt1c2VkfSA+PSAkY3R4LT57c2l6ZX07CisgICAgbXkgJHBvcyA9IHBvcygkY3R4LT57dG1wfSk7CisgICAgaWYgKCRjdHgtPnt0bXB9ID1+IC9cRygkY3R4LT57X3JlfXwuKS9ncykgeworICAgICAgICBteSAkYyA9ICQxOworICAgICAgICBpZiAoJGMgPX4gL1teXHgwOVx4MjAtXHg3ZV0vKSB7CisgICAgICAgICAgICAkY3R4LT57ZmxhZ30gfD0gSVNfQklOQVJZOworICAgICAgICB9CisgICAgICAgICRjdHgtPnt1c2VkfSA9IHBvcygkY3R4LT57dG1wfSk7CisgICAgICAgIHJldHVybiAkYzsKKyAgICB9IGVsc2UgeworICAgICAgICBwb3MoJGN0eC0+e3RtcH0pID0gJHBvczsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworc3ViIF9fZXJyb3JfaW5zaWRlX3F1b3RlcyB7CisgICAgbXkgKCRzZWxmLCAkY3R4LCAkZXJyb3IpID0gQF87CisgICAgJHNlbGYtPl9fcGFyc2VfZXJyb3IoJGN0eCwgJGVycm9yLCAkY3R4LT57dXNlZH0gLSAxKTsKK30KKworc3ViIF9fZXJyb3JfaW5zaWRlX2ZpZWxkIHsKKyAgICBteSAoJHNlbGYsICRjdHgsICRlcnJvcikgPSBAXzsKKyAgICAkc2VsZi0+X19wYXJzZV9lcnJvcigkY3R4LCAkZXJyb3IsICRjdHgtPnt1c2VkfSAtIDEpOworfQorCitzdWIgX19wYXJzZV9lcnJvciB7CisgICAgbXkgKCRzZWxmLCAkY3R4LCAkZXJyb3IsICRwb3MpID0gQF87CisgICAgJHNlbGYtPntfRVJST1JfUE9TfSA9ICRwb3M7CisgICAgJHNlbGYtPntfRVJST1JfRkxEfSA9ICRjdHgtPntmbGRfaWR4fTsKKyAgICAkc2VsZi0+e19FUlJPUl9JTlBVVH0gPSAkY3R4LT57dG1wfSBpZiAkY3R4LT57dG1wfTsKKyAgICAkc2VsZi0+U2V0RGlhZygkZXJyb3IpOworICAgIHJldHVybjsKK30KKworc3ViIF9faXNfd2hpdGVzcGFjZSB7CisgICAgbXkgKCRzZWxmLCAkY3R4LCAkYykgPSBAXzsKKyAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGM7CisgICAgcmV0dXJuICgKKyAgICAgICAgKCFkZWZpbmVkICRjdHgtPntzZXB9IG9yICRjIG5lICRjdHgtPntzZXB9KSAmJgorICAgICAgICAoIWRlZmluZWQgJGN0eC0+e3F1b30gb3IgJGMgbmUgJGN0eC0+e3F1b30pICYmCisgICAgICAgICghZGVmaW5lZCAkY3R4LT57ZXNjYXBlX2NoYXJ9IG9yICRjIG5lICRjdHgtPntlc2NhcGVfY2hhcn0pICYmCisgICAgICAgICgkYyBlcSAiICIgb3IgJGMgZXEgIlx0IikKKyAgICApOworfQorCitzdWIgX19wdXNoX3ZhbHVlIHsgIyBBVl9QVVNIIChwYXJ0IG9mKQorICAgIG15ICgkc2VsZiwgJGN0eCwgJHZfcmVmLCAkZmllbGRzLCAkZmZsYWdzLCAkZmxhZykgPSBAXzsKKyAgICB1dGY4OjplbmNvZGUoJCR2X3JlZikgaWYgJGN0eC0+e3V0Zjh9OworICAgIGlmICgKKyAgICAgICAgKCFkZWZpbmVkICQkdl9yZWYgb3IgJCR2X3JlZiBlcSAnJykgYW5kCisgICAgICAgICgkY3R4LT57ZW1wdHlfaXNfdW5kZWZ9IG9yICghKCRmbGFnICYgSVNfUVVPVEVEKSBhbmQgJGN0eC0+e2JsYW5rX2lzX3VuZGVmfSkpCisgICAgKSB7CisgICAgICAgICQkdl9yZWYgPSB1bmRlZjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoJGN0eC0+e2FsbG93X3doaXRlc3BhY2V9ICYmICEoJGZsYWcgJiBJU19RVU9URUQpKSB7CisgICAgICAgICAgICAkJHZfcmVmID1+IHMvWyBcdF0rJC8vOworICAgICAgICB9CisgICAgICAgIGlmICgkZmxhZyAmIElTX0JJTkFSWSBhbmQgJGN0eC0+e2RlY29kZV91dGY4fSBhbmQgKCRjdHgtPnt1dGY4fSB8fCBfaXNfdmFsaWRfdXRmOCgkJHZfcmVmKSkpIHsKKyAgICAgICAgICAgIHV0Zjg6OmRlY29kZSgkJHZfcmVmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1bmxlc3MgKCRjdHgtPntpc19ib3VuZH0pIHsKKyAgICAgICAgcHVzaCBAJGZpZWxkcywgJCR2X3JlZjsKKyAgICB9CisgICAgaWYgKCRjdHgtPntrZWVwX21ldGFfaW5mb30gYW5kICRmZmxhZ3MpIHsKKyAgICAgICAgcHVzaCBAJGZmbGFncywgJGZsYWc7CisgICAgfQorfQorCitzdWIgZ2V0bGluZSB7CisgICAgbXkgKCRzZWxmLCAkaW8pID0gQF87CisKKyAgICBteSAoQGZpZWxkcywgQGZmbGFncyk7CisgICAgbXkgJHJlcyA9ICRzZWxmLT5fX3BhcnNlKFxAZmllbGRzLCBcQGZmbGFncywgJGlvLCAxKTsKKyAgICAkcmVzID8gXEBmaWVsZHMgOiB1bmRlZjsKK30KKworc3ViIGdldGxpbmVfYWxsIHsKKyAgICBteSAoICRzZWxmLCAkaW8sICRvZmZzZXQsICRsZW4gKSA9IEBfOworCisgICAgbXkgJGN0eCA9ICRzZWxmLT5fc2V0dXBfY3R4OworCisgICAgbXkgJHRhaWwgPSAwOworICAgIG15ICRuID0gMDsKKyAgICAkb2Zmc2V0IHx8PSAwOworCisgICAgaWYgKCAkb2Zmc2V0IDwgMCApIHsKKyAgICAgICAgJHRhaWwgPSAtJG9mZnNldDsKKyAgICAgICAgJG9mZnNldCA9IC0xOworICAgIH0KKworICAgIG15IChAcm93LCBAbGlzdCk7CisgICAgd2hpbGUgKCRzZWxmLT5fX19wYXJzZSgkY3R4LCBcQHJvdywgdW5kZWYsICRpbywgMSkpIHsKKyAgICAgICAgJGN0eCA9ICRzZWxmLT5fc2V0dXBfY3R4OworCisgICAgICAgIGlmICgkb2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgJG9mZnNldC0tOworICAgICAgICAgICAgQHJvdyA9ICgpOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAoJG4rKyA+PSAkdGFpbCBhbmQgJHRhaWwpIHsKKyAgICAgICAgICAgIHNoaWZ0IEBsaXN0OworICAgICAgICAgICAgJG4tLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCRjdHgtPntoYXNfaG9va3N9IHx8IDApICYgSE9PS19BRlRFUl9QQVJTRSkgeworICAgICAgICAgICAgdW5sZXNzICgkc2VsZi0+X2hvb2soYWZ0ZXJfcGFyc2UgPT4gXEByb3cpKSB7CisgICAgICAgICAgICAgICAgQHJvdyA9ICgpOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVzaCBAbGlzdCwgW0Byb3ddOworICAgICAgICBAcm93ID0gKCk7CisKKyAgICAgICAgbGFzdCBpZiBkZWZpbmVkICRsZW4gJiYgJG4gPj0gJGxlbiBhbmQgJG9mZnNldCA+PSAwOyAgICMgZXhjZWVkcyBsaW1pdCBzaXplCisgICAgfQorCisgICAgaWYgKCBkZWZpbmVkICRsZW4gJiYgJG4gPiAkbGVuICkgeworICAgICAgICBAbGlzdCA9IHNwbGljZSggQGxpc3QsIDAsICRsZW4pOworICAgIH0KKworICAgIHJldHVybiBcQGxpc3Q7Cit9CisKK3N1YiBfaXNfdmFsaWRfdXRmOCB7CisgICAgcmV0dXJuICggJF9bMF0gPX4gL14oPzoKKyAgICAgICAgIFtceDAwLVx4N0ZdCisgICAgICAgIHxbXHhDMi1ceERGXVtceDgwLVx4QkZdCisgICAgICAgIHxbXHhFMF1bXHhBMC1ceEJGXVtceDgwLVx4QkZdCisgICAgICAgIHxbXHhFMS1ceEVDXVtceDgwLVx4QkZdW1x4ODAtXHhCRl0KKyAgICAgICAgfFtceEVEXVtceDgwLVx4OUZdW1x4ODAtXHhCRl0KKyAgICAgICAgfFtceEVFLVx4RUZdW1x4ODAtXHhCRl1bXHg4MC1ceEJGXQorICAgICAgICB8W1x4RjBdW1x4OTAtXHhCRl1bXHg4MC1ceEJGXVtceDgwLVx4QkZdCisgICAgICAgIHxbXHhGMS1ceEYzXVtceDgwLVx4QkZdW1x4ODAtXHhCRl1bXHg4MC1ceEJGXQorICAgICAgICB8W1x4RjRdW1x4ODAtXHg4Rl1bXHg4MC1ceEJGXVtceDgwLVx4QkZdCisgICAgKSskL3ggKSAgPyAxIDogMDsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbWV0aG9kcyBmb3IgZXJyb3JzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzdWIgX3NldF9lcnJvcl9kaWFnIHsKKyAgICBteSAoICRzZWxmLCAkZXJyb3IsICRwb3MgKSA9IEBfOworCisgICAgJHNlbGYtPlNldERpYWcoJGVycm9yKTsKKworICAgIGlmIChkZWZpbmVkICRwb3MpIHsKKyAgICAgICAgJF9bMF0tPntfRVJST1JfUE9TfSA9ICRwb3M7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdWIgZXJyb3JfaW5wdXQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgaWYgKCRzZWxmIGFuZCAoKFNjYWxhcjo6VXRpbDo6cmVmdHlwZSgkc2VsZikgfHwgJycpIGVxICdIQVNIJyBvciAocmVmICRzZWxmKSA9fiAvXlRleHQ6OkNTVi8pKSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+e19FUlJPUl9JTlBVVH07CisgICAgfQorICAgIHJldHVybjsKK30KKworc3ViIF9zdl9kaWFnIHsKKyAgICBteSAoJHNlbGYsICRlcnJvcikgPSBAXzsKKyAgICBibGVzcyBbJGVycm9yLCAkRVJST1JTLT57JGVycm9yfV0sICdUZXh0OjpDU1Y6OkVycm9yRGlhZyc7Cit9CisKK3N1YiBfc2V0X2RpYWcgeworICAgIG15ICgkc2VsZiwgJGN0eCwgJGVycm9yKSA9IEBfOworCisgICAgJGxhc3RfZXJyb3IgPSAkc2VsZi0+X3N2X2RpYWcoJGVycm9yKTsKKyAgICAkc2VsZi0+e19FUlJPUl9ESUFHfSA9ICRsYXN0X2Vycm9yOworICAgIGlmICgkZXJyb3IgPT0gMCkgeworICAgICAgICAkc2VsZi0+e19FUlJPUl9QT1N9ID0gMDsKKyAgICAgICAgJHNlbGYtPntfRVJST1JfRkxEfSA9IDA7CisgICAgICAgICRzZWxmLT57X0VSUk9SX0lOUFVUfSA9IHVuZGVmOworICAgICAgICAkY3R4LT57aGFzX2Vycm9yX2lucHV0fSA9IDA7CisgICAgfQorICAgIGlmICgkZXJyb3IgPT0gMjAxMikgeyAjIEVPRgorICAgICAgICAkc2VsZi0+e19FT0Z9ID0gMTsKKyAgICB9CisgICAgaWYgKCRjdHgtPnthdXRvX2RpYWd9KSB7CisgICAgICAgICRzZWxmLT5lcnJvcl9kaWFnOworICAgIH0KKyAgICByZXR1cm4gJGxhc3RfZXJyb3I7Cit9CisKK3N1YiBTZXREaWFnIHsKKyAgICBteSAoJHNlbGYsICRlcnJvciwgJGVycnN0cikgPSBAXzsKKyAgICBteSAkcmVzOworICAgIGlmIChyZWYgJHNlbGYpIHsKKyAgICAgICAgbXkgJGN0eCA9ICRzZWxmLT5fc2V0dXBfY3R4OworICAgICAgICAkcmVzID0gJHNlbGYtPl9zZXRfZGlhZygkY3R4LCAkZXJyb3IpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgJHJlcyA9ICRzZWxmLT5fc3ZfZGlhZygkZXJyb3IpOworICAgIH0KKyAgICBpZiAoZGVmaW5lZCAkZXJyc3RyKSB7CisgICAgICAgICRyZXMtPlsxXSA9ICRlcnJzdHI7CisgICAgfQorICAgICRyZXM7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitwYWNrYWdlIFRleHQ6OkNTVjo6RXJyb3JEaWFnOworCit1c2Ugc3RyaWN0OwordXNlIG92ZXJsb2FkICgKKyAgICAnIiInID0+IFwmc3RyaW5naWZ5LAorICAgICcrJyAgPT4gXCZudW1lcmljLAorICAgICctJyAgPT4gXCZudW1lcmljLAorICAgICcqJyAgPT4gXCZudW1lcmljLAorICAgICcvJyAgPT4gXCZudW1lcmljLAorICAgIGZhbGxiYWNrID0+IDEsCispOworCisKK3N1YiBudW1lcmljIHsKKyAgICBteSAoJGxlZnQsICRyaWdodCkgPSBAXzsKKyAgICByZXR1cm4gcmVmICRsZWZ0ID8gJGxlZnQtPlswXSA6ICRyaWdodC0+WzBdOworfQorCisKK3N1YiBzdHJpbmdpZnkgeworICAgICRfWzBdLT5bMV07Cit9CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworMTsKK19fRU5EX18KKworPWhlYWQxIE5BTUUKKworVGV4dDo6Q1NWX1BQIC0gVGV4dDo6Q1NWX1hTIGNvbXBhdGlibGUgcHVyZS1QZXJsIG1vZHVsZQorCisKKz1oZWFkMSBTWU5PUFNJUworCisgdXNlIFRleHQ6OkNTVl9QUDsKKworICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldygpOyAgICAgIyBjcmVhdGUgYSBuZXcgb2JqZWN0CisgIyBJZiB5b3Ugd2FudCB0byBoYW5kbGUgbm9uLWFzY2lpIGNoYXIuCisgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3KHtiaW5hcnkgPT4gMX0pOworCisgJHN0YXR1cyA9ICRjc3YtPmNvbWJpbmUoQGNvbHVtbnMpOyAgICAjIGNvbWJpbmUgY29sdW1ucyBpbnRvIGEgc3RyaW5nCisgJGxpbmUgICA9ICRjc3YtPnN0cmluZygpOyAgICAgICAgICAgICAjIGdldCB0aGUgY29tYmluZWQgc3RyaW5nCisKKyAkc3RhdHVzICA9ICRjc3YtPnBhcnNlKCRsaW5lKTsgICAgICAgICMgcGFyc2UgYSBDU1Ygc3RyaW5nIGludG8gZmllbGRzCisgQGNvbHVtbnMgPSAkY3N2LT5maWVsZHMoKTsgICAgICAgICAgICAjIGdldCB0aGUgcGFyc2VkIGZpZWxkcworCisgJHN0YXR1cyAgICAgICA9ICRjc3YtPnN0YXR1cyAoKTsgICAgICAjIGdldCB0aGUgbW9zdCByZWNlbnQgc3RhdHVzCisgJGJhZF9hcmd1bWVudCA9ICRjc3YtPmVycm9yX2lucHV0ICgpOyAjIGdldCB0aGUgbW9zdCByZWNlbnQgYmFkIGFyZ3VtZW50CisgJGRpYWcgICAgICAgICA9ICRjc3YtPmVycm9yX2RpYWcgKCk7ICAjIGlmIGFuIGVycm9yIG9jY3VycmVkLCBleHBsYWlucyBXSFkKKworICRzdGF0dXMgPSAkY3N2LT5wcmludCAoJGlvLCAkY29scmVmKTsgIyBXcml0ZSBhbiBhcnJheSBvZiBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgdG8gYSBmaWxlICRpbworICRjb2xyZWYgPSAkY3N2LT5nZXRsaW5lICgkaW8pOyAgICAgICAgIyBSZWFkIGEgbGluZSBmcm9tIGZpbGUgJGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXJzZSBpdCBhbmQgcmV0dXJuIGFuIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlZiBvZiBmaWVsZHMKKyAkY3N2LT5jb2x1bW5fbmFtZXMgKEBuYW1lcyk7ICAgICAgICAgICMgU2V0IGNvbHVtbiBuYW1lcyBmb3IgZ2V0bGluZV9ociAoKQorICRyZWYgPSAkY3N2LT5nZXRsaW5lX2hyICgkaW8pOyAgICAgICAgIyBnZXRsaW5lICgpLCBidXQgcmV0dXJucyBhIGhhc2hyZWYKKyAkZW9mID0gJGNzdi0+ZW9mICgpOyAgICAgICAgICAgICAgICAgICMgSW5kaWNhdGUgaWYgbGFzdCBwYXJzZSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXRsaW5lICgpIGhpdCBFbmQgT2YgRmlsZQorCisgJGNzdi0+dHlwZXMoXEB0X2FycmF5KTsgICAgICAgICAgICAgICAjIFNldCBjb2x1bW4gdHlwZXMKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RleHQ6OkNTVl9QUCBpcyBhIHB1cmUtcGVybCBtb2R1bGUgdGhhdCBwcm92aWRlcyBmYWNpbGl0aWVzIGZvciB0aGUKK2NvbXBvc2l0aW9uIGFuZCBkZWNvbXBvc2l0aW9uIG9mIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMuIFRoaXMgaXMKKyhhbG1vc3QpIGNvbXBhdGlibGUgd2l0aCBtdWNoIGZhc3RlciBMPFRleHQ6OkNTVl9YUz4sIGFuZCBtYWlubHkKK3VzZWQgYXMgaXRzIGZhbGxiYWNrIG1vZHVsZSB3aGVuIHlvdSB1c2UgTDxUZXh0OjpDU1Y+IG1vZHVsZSB3aXRob3V0CitoYXZpbmcgaW5zdGFsbGVkIFRleHQ6OkNTVl9YUy4gSWYgeW91IGRvbid0IGhhdmUgYW55IHJlYXNvbiB0byB1c2UKK3RoaXMgbW9kdWxlIGRpcmVjdGx5LCB1c2UgVGV4dDo6Q1NWIGZvciBzcGVlZCBib29zdCBhbmQgcG9ydGFiaWxpdHkKKyhvciBtYXliZSBUZXh0OjpDU1ZfWFMgd2hlbiB5b3Ugd3JpdGUgYW4gb25lLW9mZiBzY3JpcHQgYW5kIGRvbid0IG5lZWQKK3RvIGNhcmUgYWJvdXQgcG9ydGFiaWxpdHkpLgorCitUaGUgZm9sbG93aW5nIGNhdmVhdHMgYXJlIHRha2VuIGZyb20gdGhlIGRvYyBvZiBUZXh0OjpDU1ZfWFMuCisKKz1oZWFkMiBFbWJlZGRlZCBuZXdsaW5lcworCitCPEltcG9ydGFudCBOb3RlPjogIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGFjY2VwdCBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMKK2luIHRoZSByYW5nZSBmcm9tIEM8MHgyMD4gKHNwYWNlKSB0byBDPDB4N0U+ICh0aWxkZSkuICAgVGhpcyBtZWFucyB0aGF0IHRoZQorZmllbGRzIGNhbiBub3QgY29udGFpbiBuZXdsaW5lcy4gSWYgeW91ciBkYXRhIGNvbnRhaW5zIG5ld2xpbmVzIGVtYmVkZGVkIGluCitmaWVsZHMsIG9yIGNoYXJhY3RlcnMgYWJvdmUgQzwweDdFPiAodGlsZGUpLCBvciBiaW5hcnkgZGF0YSwgeW91IEI8STxtdXN0Pj4KK3NldCBDPDwgYmluYXJ5ID0+IDEgPj4gaW4gdGhlIGNhbGwgdG8gTDwvbmV3Pi4gVG8gY292ZXIgdGhlIHdpZGVzdCByYW5nZSBvZgorcGFyc2luZyBvcHRpb25zLCB5b3Ugd2lsbCBhbHdheXMgd2FudCB0byBzZXQgYmluYXJ5LgorCitCdXQgeW91IHN0aWxsIGhhdmUgdGhlIHByb2JsZW0gIHRoYXQgeW91IGhhdmUgdG8gcGFzcyBhIGNvcnJlY3QgbGluZSB0byB0aGUKK0w8L3BhcnNlPiBtZXRob2QsIHdoaWNoIGlzIG1vcmUgY29tcGxpY2F0ZWQgZnJvbSB0aGUgdXN1YWwgcG9pbnQgb2YgdXNhZ2U6CisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgYmluYXJ5ID0+IDEsIGVvbCA9PiAkLyB9KTsKKyB3aGlsZSAoPD4pIHsJCSMgIFdST05HIQorICAgICAkY3N2LT5wYXJzZSAoJF8pOworICAgICBteSBAZmllbGRzID0gJGNzdi0+ZmllbGRzICgpOworICAgICB9CisKK3RoaXMgd2lsbCBicmVhaywgYXMgdGhlIEM8d2hpbGU+IG1pZ2h0IHJlYWQgYnJva2VuIGxpbmVzOiAgaXQgZG9lcyBub3QgY2FyZQorYWJvdXQgdGhlIHF1b3RpbmcuIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgZW1iZWRkZWQgbmV3bGluZXMsICB0aGUgd2F5IHRvIGdvCitpcyB0byAgQjxub3Q+ICBwYXNzIEw8Qzxlb2w+fC9lb2w+IGluIHRoZSBwYXJzZXIgIChpdCBhY2NlcHRzIEM8XG4+LCBDPFxyPiwKK0I8YW5kPiBDPFxyXG4+IGJ5IGRlZmF1bHQpIGFuZCB0aGVuCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgYmluYXJ5ID0+IDEgfSk7Cisgb3BlbiBteSAkaW8sICI8IiwgJGZpbGUgb3IgZGllICIkZmlsZTogJCEiOworIHdoaWxlIChteSAkcm93ID0gJGNzdi0+Z2V0bGluZSAoJGlvKSkgeworICAgICBteSBAZmllbGRzID0gQCRyb3c7CisgICAgIH0KKworVGhlIG9sZChlcikgd2F5IG9mIHVzaW5nIGdsb2JhbCBmaWxlIGhhbmRsZXMgaXMgc3RpbGwgc3VwcG9ydGVkCisKKyB3aGlsZSAobXkgJHJvdyA9ICRjc3YtPmdldGxpbmUgKCpBUkdWKSkgeyAuLi4gfQorCis9aGVhZDIgVW5pY29kZQorCitVbmljb2RlIGlzIG9ubHkgdGVzdGVkIHRvIHdvcmsgd2l0aCBwZXJsLTUuOC4yIGFuZCB1cC4KKworVGhlIHNpbXBsZXN0IHdheSB0byBlbnN1cmUgdGhlIGNvcnJlY3QgZW5jb2RpbmcgaXMgdXNlZCBmb3IgIGluLSBhbmQgb3V0cHV0CitpcyBieSBlaXRoZXIgc2V0dGluZyBsYXllcnMgb24gdGhlIGZpbGVoYW5kbGVzLCBvciBzZXR0aW5nIHRoZSBMPC9lbmNvZGluZz4KK2FyZ3VtZW50IGZvciBMPC9jc3Y+LgorCisgb3BlbiBteSAkZmgsICI8OmVuY29kaW5nKFVURi04KSIsICJpbi5jc3YiICBvciBkaWUgImluLmNzdjogJCEiOworb3IKKyBteSAkYW9hID0gY3N2IChpbiA9PiAiaW4uY3N2IiwgICAgIGVuY29kaW5nID0+ICJVVEYtOCIpOworCisgb3BlbiBteSAkZmgsICI+OmVuY29kaW5nKFVURi04KSIsICJvdXQuY3N2IiBvciBkaWUgIm91dC5jc3Y6ICQhIjsKK29yCisgY3N2IChpbiA9PiAkYW9hLCBvdXQgPT4gIm91dC5jc3YiLCBlbmNvZGluZyA9PiAiVVRGLTgiKTsKKworT24gcGFyc2luZyAoYm90aCBmb3IgIEw8L2dldGxpbmU+IGFuZCAgTDwvcGFyc2U+KSwgIGlmIHRoZSBzb3VyY2UgaXMgbWFya2VkCitiZWluZyBVVEY4LCB0aGVuIGFsbCBmaWVsZHMgdGhhdCBhcmUgbWFya2VkIGJpbmFyeSB3aWxsIGFsc28gYmUgbWFya2VkIFVURjguCisKK09uIGNvbWJpbmluZyAoTDwvcHJpbnQ+ICBhbmQgIEw8L2NvbWJpbmU+KTogIGlmIGFueSBvZiB0aGUgY29tYmluaW5nIGZpZWxkcword2FzIG1hcmtlZCBVVEY4LCB0aGUgcmVzdWx0aW5nIHN0cmluZyB3aWxsIGJlIG1hcmtlZCBhcyBVVEY4LiAgTm90ZSBob3dldmVyCit0aGF0IGFsbCBmaWVsZHMgIEk8YmVmb3JlPiAgdGhlIGZpcnN0IGZpZWxkIG1hcmtlZCBVVEY4IGFuZCBjb250YWluZWQgOC1iaXQKK2NoYXJhY3RlcnMgdGhhdCB3ZXJlIG5vdCB1cGdyYWRlZCB0byBVVEY4LCAgdGhlc2Ugd2lsbCBiZSAgQzxieXRlcz4gIGluIHRoZQorcmVzdWx0aW5nIHN0cmluZyB0b28sIHBvc3NpYmx5IGNhdXNpbmcgdW5leHBlY3RlZCBlcnJvcnMuICBJZiB5b3UgcGFzcyBkYXRhCitvZiBkaWZmZXJlbnQgZW5jb2RpbmcsICBvciB5b3UgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyAgZGlmZmVyZW50ICBlbmNvZGluZywKK2ZvcmNlIGl0IHRvIGJlIHVwZ3JhZGVkIGJlZm9yZSB5b3UgcGFzcyB0aGVtIG9uOgorCisgJGNzdi0+cHJpbnQgKCRmaCwgWyBtYXAgeyB1dGY4Ojp1cGdyYWRlIChteSAkeCA9ICRfKTsgJHggfSBAZGF0YSBdKTsKKworRm9yIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciBlbmNvZGluZywgcGxlYXNlIHVzZSBMPFRleHQ6OkNTVjo6RW5jb2RlZD46CisKKyB1c2UgVGV4dDo6Q1NWOjpFbmNvZGVkOworIG15ICRjc3YgPSBUZXh0OjpDU1Y6OkVuY29kZWQtPm5ldyAoeworICAgICBlbmNvZGluZ19pbiAgPT4gImlzby04ODU5LTEiLCAjIHRoZSBlbmNvZGluZyBjb21lcyBpbnRvICAgUGVybAorICAgICBlbmNvZGluZ19vdXQgPT4gImNwMTI1MiIsICAgICAjIHRoZSBlbmNvZGluZyBjb21lcyBvdXQgb2YgUGVybAorICAgICB9KTsKKworICRjc3YgPSBUZXh0OjpDU1Y6OkVuY29kZWQtPm5ldyAoeyBlbmNvZGluZyAgPT4gInV0ZjgiIH0pOworICMgY29tYmluZSAoKSBhbmQgcHJpbnQgKCkgYWNjZXB0ICpsaXRlcmFsbHkqIHV0ZjggZW5jb2RlZCBkYXRhCisgIyBwYXJzZSAoKSBhbmQgZ2V0bGluZSAoKSByZXR1cm4gKmxpdGVyYWxseSogdXRmOCBlbmNvZGVkIGRhdGEKKworICRjc3YgPSBUZXh0OjpDU1Y6OkVuY29kZWQtPm5ldyAoeyBlbmNvZGluZyAgPT4gdW5kZWYgfSk7ICMgZGVmYXVsdAorICMgY29tYmluZSAoKSBhbmQgcHJpbnQgKCkgYWNjZXB0IFVURjggbWFya2VkIGRhdGEKKyAjIHBhcnNlICgpIGFuZCBnZXRsaW5lICgpIHJldHVybiBVVEY4IG1hcmtlZCBkYXRhCisKKz1oZWFkMSBNRVRIT0RTCisKK1RoaXMgd2hvbGUgc2VjdGlvbiBpcyBhbHNvIHRha2VuIGZyb20gVGV4dDo6Q1NWX1hTLgorCis9aGVhZDIgdmVyc2lvbiAoKQorCisoQ2xhc3MgbWV0aG9kKSBSZXR1cm5zIHRoZSBjdXJyZW50IG1vZHVsZSB2ZXJzaW9uLgorCis9aGVhZDIgbmV3IChcJWF0dHIpCisKKyhDbGFzcyBtZXRob2QpIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgVGV4dDo6Q1NWX1BQLiBUaGUgYXR0cmlidXRlcworYXJlIGRlc2NyaWJlZCBieSB0aGUgKG9wdGlvbmFsKSBoYXNoIHJlZiBDPFwlYXR0cj4uCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgYXR0cmlidXRlcyAuLi4gfSk7CisKK1RoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlOgorCis9aGVhZDMgZW9sCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgZW9sID0+ICQvIH0pOworICAgICAgICAgICAkY3N2LT5lb2wgKHVuZGVmKTsKKyBteSAkZW9sID0gJGNzdi0+ZW9sOworCitUaGUgZW5kLW9mLWxpbmUgc3RyaW5nIHRvIGFkZCB0byByb3dzIGZvciBMPC9wcmludD4gb3IgdGhlIHJlY29yZCBzZXBhcmF0b3IKK2ZvciBMPC9nZXRsaW5lPi4KKworV2hlbiBub3QgcGFzc2VkIGluIGEgQjxwYXJzZXI+IGluc3RhbmNlLCAgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gYWNjZXB0CitDPFxuPiwgQzxccj4sIGFuZCBDPFxyXG4+LCBzbyBpdCBpcyBwcm9iYWJseSBzYWZlciB0byBub3Qgc3BlY2lmeSBDPGVvbD4gYXQKK2FsbC4gUGFzc2luZyBDPHVuZGVmPiBvciB0aGUgZW1wdHkgc3RyaW5nIGJlaGF2ZSB0aGUgc2FtZS4KKworV2hlbiBub3QgcGFzc2VkIGluIGEgQjxnZW5lcmF0aW5nPiBpbnN0YW5jZSwgIHJlY29yZHMgYXJlIG5vdCB0ZXJtaW5hdGVkIGF0CithbGwsIHNvIGl0IGlzIHByb2JhYmx5IHdpc2UgdG8gcGFzcyBzb21ldGhpbmcgeW91IGV4cGVjdC4gQSBzYWZlIGNob2ljZSBmb3IKK0M8ZW9sPiBvbiBvdXRwdXQgaXMgZWl0aGVyIEM8JC8+IG9yIEM8XHJcbj4uCisKK0NvbW1vbiB2YWx1ZXMgZm9yIEM8ZW9sPiBhcmUgQzwiXDAxMiI+IChDPFxuPiBvciBMaW5lIEZlZWQpLCAgQzwiXDAxNVwwMTIiPgorKEM8XHJcbj4gb3IgQ2FycmlhZ2UgUmV0dXJuLCBMaW5lIEZlZWQpLCAgYW5kIEM8IlwwMTUiPiAgKEM8XHI+IG9yIENhcnJpYWdlCitSZXR1cm4pLiBUaGUgTDxDPGVvbD58L2VvbD4gYXR0cmlidXRlIGNhbm5vdCBleGNlZWQgNyAoQVNDSUkpIGNoYXJhY3RlcnMuCisKK0lmIGJvdGggQzwkLz4gYW5kIEw8Qzxlb2w+fC9lb2w+IGVxdWFsIEM8IlwwMTUiPiwgcGFyc2luZyBsaW5lcyB0aGF0IGVuZCBvbgorb25seSBhIENhcnJpYWdlIFJldHVybiB3aXRob3V0IExpbmUgRmVlZCwgd2lsbCBiZSBMPC9wYXJzZT5kIGNvcnJlY3QuCisKKz1oZWFkMyBzZXBfY2hhcgorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IHNlcF9jaGFyID0+ICI7IiB9KTsKKyAgICAgICAgICRjc3YtPnNlcF9jaGFyICgiOyIpOworIG15ICRjID0gJGNzdi0+c2VwX2NoYXI7CisKK1RoZSBjaGFyIHVzZWQgdG8gc2VwYXJhdGUgZmllbGRzLCBieSBkZWZhdWx0IGEgY29tbWEuIChDPCw+KS4gIExpbWl0ZWQgdG8gYQorc2luZ2xlLWJ5dGUgY2hhcmFjdGVyLCB1c3VhbGx5IGluIHRoZSByYW5nZSBmcm9tIEM8MHgyMD4gKHNwYWNlKSB0byBDPDB4N0U+CisodGlsZGUpLiBXaGVuIGxvbmdlciBzZXF1ZW5jZXMgYXJlIHJlcXVpcmVkLCB1c2UgTDxDPHNlcD58L3NlcD4uCisKK1RoZSBzZXBhcmF0aW9uIGNoYXJhY3RlciBjYW4gbm90IGJlIGVxdWFsIHRvIHRoZSBxdW90ZSBjaGFyYWN0ZXIgIG9yIHRvIHRoZQorZXNjYXBlIGNoYXJhY3Rlci4KKworPWhlYWQzIHNlcAorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IHNlcCA9PiAiXE57RlVMTFdJRFRIIENPTU1BfSIgfSk7CisgICAgICAgICAgICRjc3YtPnNlcCAoIjsiKTsKKyBteSAkc2VwID0gJGNzdi0+c2VwOworCitUaGUgY2hhcnMgdXNlZCB0byBzZXBhcmF0ZSBmaWVsZHMsIGJ5IGRlZmF1bHQgdW5kZWZpbmVkLiBMaW1pdGVkIHRvIDggYnl0ZXMuCisKK1doZW4gc2V0LCBvdmVycnVsZXMgTDxDPHNlcF9jaGFyPnwvc2VwX2NoYXI+LiAgSWYgaXRzIGxlbmd0aCBpcyBvbmUgYnl0ZSBpdAorYWN0cyBhcyBhbiBhbGlhcyB0byBMPEM8c2VwX2NoYXI+fC9zZXBfY2hhcj4uCisKKz1oZWFkMyBxdW90ZV9jaGFyCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgcXVvdGVfY2hhciA9PiAiJyIgfSk7CisgICAgICAgICAkY3N2LT5xdW90ZV9jaGFyICh1bmRlZik7CisgbXkgJGMgPSAkY3N2LT5xdW90ZV9jaGFyOworCitUaGUgY2hhcmFjdGVyIHRvIHF1b3RlIGZpZWxkcyBjb250YWluaW5nIGJsYW5rcyBvciBiaW5hcnkgZGF0YSwgIGJ5IGRlZmF1bHQKK3RoZSBkb3VibGUgcXVvdGUgY2hhcmFjdGVyIChDPCI+KS4gIEEgdmFsdWUgb2YgdW5kZWYgc3VwcHJlc3NlcyBxdW90ZSBjaGFycworKGZvciBzaW1wbGUgY2FzZXMgb25seSkuIExpbWl0ZWQgdG8gYSBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXIsIHVzdWFsbHkgaW4gdGhlCityYW5nZSBmcm9tICBDPDB4MjA+IChzcGFjZSkgdG8gIEM8MHg3RT4gKHRpbGRlKS4gIFdoZW4gbG9uZ2VyIHNlcXVlbmNlcyBhcmUKK3JlcXVpcmVkLCB1c2UgTDxDPHF1b3RlPnwvcXVvdGU+LgorCitDPHF1b3RlX2NoYXI+IGNhbiBub3QgYmUgZXF1YWwgdG8gTDxDPHNlcF9jaGFyPnwvc2VwX2NoYXI+LgorCis9aGVhZDMgcXVvdGUKKworIG15ICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldyAoeyBxdW90ZSA9PiAiXE57RlVMTFdJRFRIIFFVT1RBVElPTiBNQVJLfSIgfSk7CisgICAgICAgICAgICAgJGNzdi0+cXVvdGUgKCInIik7CisgbXkgJHF1b3RlID0gJGNzdi0+cXVvdGU7CisKK1RoZSBjaGFycyB1c2VkIHRvIHF1b3RlIGZpZWxkcywgYnkgZGVmYXVsdCB1bmRlZmluZWQuIExpbWl0ZWQgdG8gOCBieXRlcy4KKworV2hlbiBzZXQsIG92ZXJydWxlcyBMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+LiBJZiBpdHMgbGVuZ3RoIGlzIG9uZSBieXRlCitpdCBhY3RzIGFzIGFuIGFsaWFzIHRvIEw8QzxxdW90ZV9jaGFyPnwvcXVvdGVfY2hhcj4uCisKKz1oZWFkMyBlc2NhcGVfY2hhcgorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IGVzY2FwZV9jaGFyID0+ICJcXCIgfSk7CisgICAgICAgICAkY3N2LT5lc2NhcGVfY2hhciAodW5kZWYpOworIG15ICRjID0gJGNzdi0+ZXNjYXBlX2NoYXI7CisKK1RoZSBjaGFyYWN0ZXIgdG8gIGVzY2FwZSAgY2VydGFpbiBjaGFyYWN0ZXJzIGluc2lkZSBxdW90ZWQgZmllbGRzLiAgVGhpcyBpcworbGltaXRlZCB0byBhICBzaW5nbGUtYnl0ZSAgY2hhcmFjdGVyLCAgdXN1YWxseSAgaW4gdGhlICByYW5nZSBmcm9tICBDPDB4MjA+Cisoc3BhY2UpIHRvIEM8MHg3RT4gKHRpbGRlKS4KKworVGhlIEM8ZXNjYXBlX2NoYXI+IGRlZmF1bHRzIHRvIGJlaW5nIHRoZSBkb3VibGUtcXVvdGUgbWFyayAoQzwiPikuIEluIG90aGVyCit3b3JkcyB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCBMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+LiBUaGlzIG1lYW5zIHRoYXQKK2RvdWJsaW5nIHRoZSBxdW90ZSBtYXJrIGluIGEgZmllbGQgZXNjYXBlcyBpdDoKKworICJmb28iLCJiYXIiLCJFc2NhcGUgIiJxdW90ZSBtYXJrIiIgd2l0aCB0d28gIiJxdW90ZSBtYXJrcyIiIiwiYmF6IgorCitJZiAgeW91ICBjaGFuZ2UgIHRoZSAgIEw8QzxxdW90ZV9jaGFyPnwvcXVvdGVfY2hhcj4gIHdpdGhvdXQgIGNoYW5naW5nICB0aGUKK0M8ZXNjYXBlX2NoYXI+LCAgdGhlICBDPGVzY2FwZV9jaGFyPiB3aWxsIHN0aWxsIGJlIHRoZSBkb3VibGUtcXVvdGUgKEM8Ij4pLgorSWYgaW5zdGVhZCB5b3Ugd2FudCB0byBlc2NhcGUgdGhlICBMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+IGJ5IGRvdWJsaW5nCitpdCB5b3Ugd2lsbCBuZWVkIHRvIGFsc28gY2hhbmdlIHRoZSAgQzxlc2NhcGVfY2hhcj4gIHRvIGJlIHRoZSBzYW1lIGFzIHdoYXQKK3lvdSBoYXZlIGNoYW5nZWQgdGhlIEw8QzxxdW90ZV9jaGFyPnwvcXVvdGVfY2hhcj4gdG8uCisKK1RoZSBlc2NhcGUgY2hhcmFjdGVyIGNhbiBub3QgYmUgZXF1YWwgdG8gdGhlIHNlcGFyYXRpb24gY2hhcmFjdGVyLgorCis9aGVhZDMgYmluYXJ5CisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgYmluYXJ5ID0+IDEgfSk7CisgICAgICAgICAkY3N2LT5iaW5hcnkgKDApOworIG15ICRmID0gJGNzdi0+YmluYXJ5OworCitJZiB0aGlzIGF0dHJpYnV0ZSBpcyBDPDE+LCAgeW91IG1heSB1c2UgYmluYXJ5IGNoYXJhY3RlcnMgaW4gcXVvdGVkIGZpZWxkcywKK2luY2x1ZGluZyBsaW5lIGZlZWRzLCBjYXJyaWFnZSByZXR1cm5zIGFuZCBDPE5VTEw+IGJ5dGVzLiAoVGhlIGxhdHRlciBjb3VsZAorYmUgZXNjYXBlZCBhcyBDPCIwPi4pIEJ5IGRlZmF1bHQgdGhpcyBmZWF0dXJlIGlzIG9mZi4KKworSWYgYSBzdHJpbmcgaXMgbWFya2VkIFVURjgsICBDPGJpbmFyeT4gd2lsbCBiZSB0dXJuZWQgb24gYXV0b21hdGljYWxseSB3aGVuCitiaW5hcnkgY2hhcmFjdGVycyBvdGhlciB0aGFuIEM8Q1I+IGFuZCBDPE5MPiBhcmUgZW5jb3VudGVyZWQuICAgTm90ZSB0aGF0IGEKK3NpbXBsZSBzdHJpbmcgbGlrZSBDPCJceHswMGEwfSI+IG1pZ2h0IHN0aWxsIGJlIGJpbmFyeSwgYnV0IG5vdCBtYXJrZWQgVVRGOCwKK3NvIHNldHRpbmcgQzw8IHsgYmluYXJ5ID0+IDEgfSA+PiBpcyBzdGlsbCBhIHdpc2Ugb3B0aW9uLgorCis9aGVhZDMgc3RyaWN0CisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgc3RyaWN0ID0+IDEgfSk7CisgICAgICAgICAkY3N2LT5zdHJpY3QgKDApOworIG15ICRmID0gJGNzdi0+c3RyaWN0OworCitJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gQzwxPiwgYW55IHJvdyB0aGF0IHBhcnNlcyB0byBhIGRpZmZlcmVudCBudW1iZXIKK29mIGZpZWxkcyB0aGFuIHRoZSBwcmV2aW91cyByb3cgd2lsbCBjYXVzZSB0aGUgcGFyc2VyIHRvIHRocm93IGVycm9yIDIwMTQuCisKKz1oZWFkMyBkZWNvZGVfdXRmOAorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IGRlY29kZV91dGY4ID0+IDEgfSk7CisgICAgICAgICAkY3N2LT5kZWNvZGVfdXRmOCAoMCk7CisgbXkgJGYgPSAkY3N2LT5kZWNvZGVfdXRmODsKKworVGhpcyBhdHRyaWJ1dGVzIGRlZmF1bHRzIHRvIFRSVUUuCisKK1doaWxlIEk8cGFyc2luZz4sICBmaWVsZHMgdGhhdCBhcmUgdmFsaWQgVVRGLTgsIGFyZSBhdXRvbWF0aWNhbGx5IHNldCB0byBiZQorVVRGLTgsIHNvIHRoYXQKKworICAkY3N2LT5wYXJzZSAoIlx4QzRceEE4XG4iKTsKKworcmVzdWx0cyBpbgorCisgIFBWKCJcMzA0XDI1MCJcMCkgW1VURjggIlx4ezEyOH0iXQorCitTb21ldGltZXMgaXQgbWlnaHQgbm90IGJlIGEgZGVzaXJlZCBhY3Rpb24uICBUbyBwcmV2ZW50IHRob3NlIHVwZ3JhZGVzLCBzZXQKK3RoaXMgYXR0cmlidXRlIHRvIGZhbHNlLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlCisKKyAgUFYoIlwzMDRcMjUwIlwwKQorCis9aGVhZDMgYXV0b19kaWFnCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgYXV0b19kaWFnID0+IDEgfSk7CisgICAgICAgICAkY3N2LT5hdXRvX2RpYWcgKDIpOworIG15ICRsID0gJGNzdi0+YXV0b19kaWFnOworCitTZXQgdGhpcyBhdHRyaWJ1dGUgdG8gYSBudW1iZXIgYmV0d2VlbiBDPDE+IGFuZCBDPDk+IGNhdXNlcyAgTDwvZXJyb3JfZGlhZz4KK3RvIGJlIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGluIHZvaWQgY29udGV4dCB1cG9uIGVycm9ycy4KKworSW4gY2FzZSBvZiBlcnJvciBDPDIwMTIgLSBFT0Y+LCB0aGlzIGNhbGwgd2lsbCBiZSB2b2lkLgorCitJZiBDPGF1dG9fZGlhZz4gaXMgc2V0IHRvIGEgbnVtZXJpYyB2YWx1ZSBncmVhdGVyIHRoYW4gQzwxPiwgaXQgd2lsbCBDPGRpZT4KK29uIGVycm9ycyBpbnN0ZWFkIG9mIEM8d2Fybj4uICBJZiBzZXQgdG8gYW55dGhpbmcgdW5yZWNvZ25pemVkLCAgaXQgd2lsbCBiZQorc2lsZW50bHkgaWdub3JlZC4KKworRnV0dXJlIGV4dGVuc2lvbnMgdG8gdGhpcyBmZWF0dXJlIHdpbGwgaW5jbHVkZSBtb3JlIHJlbGlhYmxlIGF1dG8tZGV0ZWN0aW9uCitvZiAgQzxhdXRvZGllPiAgYmVpbmcgYWN0aXZlIGluIHRoZSBzY29wZSBvZiB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQgd2hpY2gKK3dpbGwgaW5jcmVtZW50IHRoZSB2YWx1ZSBvZiBDPGF1dG9fZGlhZz4gd2l0aCAgQzwxPiB0aGUgbW9tZW50IHRoZSBlcnJvciBpcworZGV0ZWN0ZWQuCisKKz1oZWFkMyBkaWFnX3ZlcmJvc2UKKworIG15ICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldyAoeyBkaWFnX3ZlcmJvc2UgPT4gMSB9KTsKKyAgICAgICAgICRjc3YtPmRpYWdfdmVyYm9zZSAoMik7CisgbXkgJGwgPSAkY3N2LT5kaWFnX3ZlcmJvc2U7CisKK1NldCB0aGUgdmVyYm9zaXR5IG9mIHRoZSBvdXRwdXQgdHJpZ2dlcmVkIGJ5IEM8YXV0b19kaWFnPi4gICBDdXJyZW50bHkgb25seQorYWRkcyB0aGUgY3VycmVudCAgaW5wdXQtcmVjb3JkLW51bWJlciAgKGlmIGtub3duKSAgdG8gdGhlIGRpYWdub3N0aWMgb3V0cHV0Cit3aXRoIGFuIGluZGljYXRpb24gb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBlcnJvci4KKworPWhlYWQzIGJsYW5rX2lzX3VuZGVmCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgYmxhbmtfaXNfdW5kZWYgPT4gMSB9KTsKKyAgICAgICAgICRjc3YtPmJsYW5rX2lzX3VuZGVmICgwKTsKKyBteSAkZiA9ICRjc3YtPmJsYW5rX2lzX3VuZGVmOworCitVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgQzxDU1Y+IGRhdGEgbWFrZXMgbm8gZGlzdGluY3Rpb24gYmV0d2VlbiBxdW90ZWQtCithbmQgdW5xdW90ZWQgZW1wdHkgZmllbGRzLiAgVGhlc2UgYm90aCBlbmQgdXAgaW4gYW4gZW1wdHkgc3RyaW5nIGZpZWxkIG9uY2UKK3JlYWQsIHRodXMKKworIDEsIiIsLCIgIiwyCisKK2lzIHJlYWQgYXMKKworICgiMSIsICIiLCAiIiwgIiAiLCAiMiIpCisKK1doZW4gSTx3cml0aW5nPiAgQzxDU1Y+IGZpbGVzIHdpdGggZWl0aGVyICBMPEM8YWx3YXlzX3F1b3RlPnwvYWx3YXlzX3F1b3RlPgorb3IgIEw8QzxxdW90ZV9lbXB0eT58L3F1b3RlX2VtcHR5PiBzZXQsIHRoZSB1bnF1b3RlZCAgSTxlbXB0eT4gZmllbGQgaXMgdGhlCityZXN1bHQgb2YgYW4gdW5kZWZpbmVkIHZhbHVlLiAgIFRvIGVuYWJsZSB0aGlzIGRpc3RpbmN0aW9uIHdoZW4gIEk8cmVhZGluZz4KK0M8Q1NWPiAgZGF0YSwgIHRoZSAgQzxibGFua19pc191bmRlZj4gIGF0dHJpYnV0ZSB3aWxsIGNhdXNlICB1bnF1b3RlZCBlbXB0eQorZmllbGRzIHRvIGJlIHNldCB0byBDPHVuZGVmPiwgY2F1c2luZyB0aGUgYWJvdmUgdG8gYmUgcGFyc2VkIGFzCisKKyAoIjEiLCAiIiwgdW5kZWYsICIgIiwgIjIiKQorCitub3RlIHRoYXQgdGhpcyBpcyBzcGVjaWZpY2FsbHkgaW1wb3J0YW50IHdoZW4gbG9hZGluZyAgQzxDU1Y+IGZpZWxkcyBpbnRvIGEKK2RhdGFiYXNlIHRoYXQgYWxsb3dzIEM8TlVMTD4gdmFsdWVzLCAgYXMgdGhlIHBlcmwgZXF1aXZhbGVudCBmb3IgQzxOVUxMPiBpcworQzx1bmRlZj4gaW4gTDxEQkk+IGxhbmQuCisKKz1oZWFkMyBlbXB0eV9pc191bmRlZgorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IGVtcHR5X2lzX3VuZGVmID0+IDEgfSk7CisgICAgICAgICAkY3N2LT5lbXB0eV9pc191bmRlZiAoMCk7CisgbXkgJGYgPSAkY3N2LT5lbXB0eV9pc191bmRlZjsKKworR29pbmcgb25lICBzdGVwICBmdXJ0aGVyICB0aGFuICBMPEM8YmxhbmtfaXNfdW5kZWY+fC9ibGFua19pc191bmRlZj4sICB0aGlzCithdHRyaWJ1dGUgY29udmVydHMgYWxsIGVtcHR5IGZpZWxkcyB0byBDPHVuZGVmPiwgc28KKworIDEsIiIsLCIgIiwyCisKK2lzIHJlYWQgYXMKKworICgxLCB1bmRlZiwgdW5kZWYsICIgIiwgMikKKworTm90ZSB0aGF0IHRoaXMgZWZmZWN0cyBvbmx5IGZpZWxkcyB0aGF0IGFyZSAgb3JpZ2luYWxseSAgZW1wdHksICBub3QgZmllbGRzCit0aGF0IGFyZSBlbXB0eSBhZnRlciBzdHJpcHBpbmcgYWxsb3dlZCB3aGl0ZXNwYWNlLiBZTU1WLgorCis9aGVhZDMgYWxsb3dfd2hpdGVzcGFjZQorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IGFsbG93X3doaXRlc3BhY2UgPT4gMSB9KTsKKyAgICAgICAgICRjc3YtPmFsbG93X3doaXRlc3BhY2UgKDApOworIG15ICRmID0gJGNzdi0+YWxsb3dfd2hpdGVzcGFjZTsKKworV2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSwgIHRoZSB3aGl0ZXNwYWNlICAoQzxUQUI+J3MgYW5kIEM8U1BBQ0U+J3MpCitzdXJyb3VuZGluZyAgdGhlICBzZXBhcmF0aW9uIGNoYXJhY3RlciAgaXMgcmVtb3ZlZCB3aGVuIHBhcnNpbmcuICBJZiBlaXRoZXIKK0M8VEFCPiBvciBDPFNQQUNFPiBpcyBvbmUgb2YgdGhlIHRocmVlIGNoYXJhY3RlcnMgTDxDPHNlcF9jaGFyPnwvc2VwX2NoYXI+LAorTDxDPHF1b3RlX2NoYXI+fC9xdW90ZV9jaGFyPiwgb3IgTDxDPGVzY2FwZV9jaGFyPnwvZXNjYXBlX2NoYXI+IGl0IHdpbGwgbm90CitiZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UuCisKK05vdyBsaW5lcyBsaWtlOgorCisgMSAsICJmb28iICwgYmFyICwgMyAsIHphcHAKKworYXJlIHBhcnNlZCBhcyB2YWxpZCBDPENTVj4sIGV2ZW4gdGhvdWdoIGl0IHZpb2xhdGVzIHRoZSBDPENTVj4gc3BlY3MuCisKK05vdGUgdGhhdCAgQjxhbGw+ICB3aGl0ZXNwYWNlIGlzIHN0cmlwcGVkIGZyb20gYm90aCAgc3RhcnQgYW5kICBlbmQgb2YgZWFjaAorZmllbGQuICBUaGF0IHdvdWxkIG1ha2UgaXQgIEk8bW9yZT4gdGhhbiBhIEk8ZmVhdHVyZT4gdG8gZW5hYmxlIHBhcnNpbmcgYmFkCitDPENTVj4gbGluZXMsIGFzCisKKyAxLCAgIDIuMCwgIDMsICAgYXBlICAsIG1vbmtleQorCit3aWxsIG5vdyBiZSBwYXJzZWQgYXMKKworICgiMSIsICIyLjAiLCAiMyIsICJhcGUiLCAibW9ua2V5IikKKworZXZlbiBpZiB0aGUgb3JpZ2luYWwgbGluZSB3YXMgcGVyZmVjdGx5IGFjY2VwdGFibGUgQzxDU1Y+LgorCis9aGVhZDMgYWxsb3dfbG9vc2VfcXVvdGVzCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgYWxsb3dfbG9vc2VfcXVvdGVzID0+IDEgfSk7CisgICAgICAgICAkY3N2LT5hbGxvd19sb29zZV9xdW90ZXMgKDApOworIG15ICRmID0gJGNzdi0+YWxsb3dfbG9vc2VfcXVvdGVzOworCitCeSBkZWZhdWx0LCBwYXJzaW5nIHVucXVvdGVkIGZpZWxkcyBjb250YWluaW5nIEw8QzxxdW90ZV9jaGFyPnwvcXVvdGVfY2hhcj4KK2NoYXJhY3RlcnMgbGlrZQorCisgMSxmb28gImJhciIgYmF6LDQyCisKK3dvdWxkIHJlc3VsdCBpbiBwYXJzZSBlcnJvciAyMDM0LiAgVGhvdWdoIGl0IGlzIHN0aWxsIGJhZCBwcmFjdGljZSB0byBhbGxvdwordGhpcyBmb3JtYXQsICB3ZSAgY2Fubm90ICBoZWxwICB0aGUgIGZhY3QgIHRoYXQgIHNvbWUgIHZlbmRvcnMgIG1ha2UgIHRoZWlyCithcHBsaWNhdGlvbnMgc3BpdCBvdXQgbGluZXMgc3R5bGVkIHRoaXMgd2F5LgorCitJZiB0aGVyZSBpcyBCPHJlYWxseT4gYmFkIEM8Q1NWPiBkYXRhLCBsaWtlCisKKyAxLCJmb28gImJhciIgYmF6Iiw0MgorCitvcgorCisgMSwiImZvbyBiYXIgYmF6IiIsNDIKKwordGhlcmUgaXMgYSB3YXkgdG8gZ2V0IHRoaXMgZGF0YS1saW5lIHBhcnNlZCBhbmQgbGVhdmUgdGhlIHF1b3RlcyBpbnNpZGUgdGhlCitxdW90ZWQgZmllbGQgYXMtaXMuICBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSBzZXR0aW5nICBDPGFsbG93X2xvb3NlX3F1b3Rlcz4KK0I8QU5EPiBtYWtpbmcgc3VyZSB0aGF0IHRoZSBMPEM8ZXNjYXBlX2NoYXI+fC9lc2NhcGVfY2hhcj4gaXMgIEk8bm90PiBlcXVhbAordG8gTDxDPHF1b3RlX2NoYXI+fC9xdW90ZV9jaGFyPi4KKworPWhlYWQzIGFsbG93X2xvb3NlX2VzY2FwZXMKKworIG15ICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldyAoeyBhbGxvd19sb29zZV9lc2NhcGVzID0+IDEgfSk7CisgICAgICAgICAkY3N2LT5hbGxvd19sb29zZV9lc2NhcGVzICgwKTsKKyBteSAkZiA9ICRjc3YtPmFsbG93X2xvb3NlX2VzY2FwZXM7CisKK1BhcnNpbmcgZmllbGRzICB0aGF0ICBoYXZlICBMPEM8ZXNjYXBlX2NoYXI+fC9lc2NhcGVfY2hhcj4gIGNoYXJhY3RlcnMgdGhhdAorZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBkbyBub3QgbmVlZCB0byBiZSBlc2NhcGVkLCBsaWtlOgorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IGVzY2FwZV9jaGFyID0+ICJcXCIgfSk7CisgJGNzdi0+cGFyc2UgKHFxezEsIm15IGJhclwncyIsYmF6LDQyfSk7CisKK3dvdWxkIHJlc3VsdCBpbiBwYXJzZSBlcnJvciAyMDI1LiAgIFRob3VnaCBpdCBpcyBiYWQgcHJhY3RpY2UgdG8gYWxsb3cgdGhpcworZm9ybWF0LCAgdGhpcyBhdHRyaWJ1dGUgZW5hYmxlcyB5b3UgdG8gdHJlYXQgYWxsIGVzY2FwZSBjaGFyYWN0ZXIgc2VxdWVuY2VzCitlcXVhbC4KKworPWhlYWQzIGFsbG93X3VucXVvdGVkX2VzY2FwZQorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IGFsbG93X3VucXVvdGVkX2VzY2FwZSA9PiAxIH0pOworICAgICAgICAgJGNzdi0+YWxsb3dfdW5xdW90ZWRfZXNjYXBlICgwKTsKKyBteSAkZiA9ICRjc3YtPmFsbG93X3VucXVvdGVkX2VzY2FwZTsKKworQSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzc3VlIHdoZXJlIEw8Qzxlc2NhcGVfY2hhcj58L2VzY2FwZV9jaGFyPiBkaWZmZXJzCitmcm9tIEw8QzxxdW90ZV9jaGFyPnwvcXVvdGVfY2hhcj4gIHByZXZlbnRzICBMPEM8ZXNjYXBlX2NoYXI+fC9lc2NhcGVfY2hhcj4KK3RvIGJlIGluIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiBhIGZpZWxkLiAgSWYgTDxDPHF1b3RlX2NoYXI+fC9xdW90ZV9jaGFyPiBpcworZXF1YWwgdG8gdGhlIGRlZmF1bHQgQzwiPiBhbmQgTDxDPGVzY2FwZV9jaGFyPnwvZXNjYXBlX2NoYXI+IGlzIHNldCB0byBDPFw+LAordGhpcyB3b3VsZCBiZSBpbGxlZ2FsOgorCisgMSxcMCwyCisKK1NldHRpbmcgdGhpcyBhdHRyaWJ1dGUgdG8gQzwxPiAgbWlnaHQgaGVscCB0byBvdmVyY29tZSBpc3N1ZXMgd2l0aCBiYWNrd2FyZAorY29tcGF0aWJpbGl0eSBhbmQgYWxsb3cgdGhpcyBzdHlsZS4KKworPWhlYWQzIGFsd2F5c19xdW90ZQorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IGFsd2F5c19xdW90ZSA9PiAxIH0pOworICAgICAgICAgJGNzdi0+YWx3YXlzX3F1b3RlICgwKTsKKyBteSAkZiA9ICRjc3YtPmFsd2F5c19xdW90ZTsKKworQnkgZGVmYXVsdCB0aGUgZ2VuZXJhdGVkIGZpZWxkcyBhcmUgcXVvdGVkIG9ubHkgaWYgdGhleSBJPG5lZWQ+IHRvIGJlLiAgRm9yCitleGFtcGxlLCBpZiB0aGV5IGNvbnRhaW4gdGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIuIElmIHlvdSBzZXQgdGhpcyBhdHRyaWJ1dGUKK3RvIEM8MT4gdGhlbiBJPGFsbD4gZGVmaW5lZCBmaWVsZHMgd2lsbCBiZSBxdW90ZWQuIChDPHVuZGVmPiBmaWVsZHMgYXJlIG5vdAorcXVvdGVkLCBzZWUgTDwvYmxhbmtfaXNfdW5kZWY+KS4gVGhpcyBtYWtlcyBpdCBxdWl0ZSBvZnRlbiBlYXNpZXIgdG8gaGFuZGxlCitleHBvcnRlZCBkYXRhIGluIGV4dGVybmFsIGFwcGxpY2F0aW9ucy4KKworPWhlYWQzIHF1b3RlX3NwYWNlCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgcXVvdGVfc3BhY2UgPT4gMSB9KTsKKyAgICAgICAgICRjc3YtPnF1b3RlX3NwYWNlICgwKTsKKyBteSAkZiA9ICRjc3YtPnF1b3RlX3NwYWNlOworCitCeSBkZWZhdWx0LCAgYSBzcGFjZSBpbiBhIGZpZWxkIHdvdWxkIHRyaWdnZXIgcXVvdGF0aW9uLiAgQXMgbm8gcnVsZSBleGlzdHMKK3RoaXMgdG8gYmUgZm9yY2VkIGluIEM8Q1NWPiwgIG5vciBhbnkgZm9yIHRoZSBvcHBvc2l0ZSwgdGhlIGRlZmF1bHQgaXMgdHJ1ZQorZm9yIHNhZmV0eS4gICBZb3UgY2FuIGV4Y2x1ZGUgdGhlIHNwYWNlICBmcm9tIHRoaXMgdHJpZ2dlciAgYnkgc2V0dGluZyB0aGlzCithdHRyaWJ1dGUgdG8gMC4KKworPWhlYWQzIHF1b3RlX2VtcHR5CisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgcXVvdGVfZW1wdHkgPT4gMSB9KTsKKyAgICAgICAgICRjc3YtPnF1b3RlX2VtcHR5ICgwKTsKKyBteSAkZiA9ICRjc3YtPnF1b3RlX2VtcHR5OworCitCeSBkZWZhdWx0IHRoZSBnZW5lcmF0ZWQgZmllbGRzIGFyZSBxdW90ZWQgb25seSBpZiB0aGV5IEk8bmVlZD4gdG8gYmUuICAgQW4KK2VtcHR5IChkZWZpbmVkKSBmaWVsZCBkb2VzIG5vdCBuZWVkIHF1b3RhdGlvbi4gSWYgeW91IHNldCB0aGlzIGF0dHJpYnV0ZSB0bworQzwxPiB0aGVuIEk8ZW1wdHk+IGRlZmluZWQgZmllbGRzIHdpbGwgYmUgcXVvdGVkLiAgKEM8dW5kZWY+IGZpZWxkcyBhcmUgbm90CitxdW90ZWQsIHNlZSBMPC9ibGFua19pc191bmRlZj4pLiBTZWUgYWxzbyBMPEM8YWx3YXlzX3F1b3RlPnwvYWx3YXlzX3F1b3RlPi4KKworPWhlYWQzIHF1b3RlX2JpbmFyeQorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IHF1b3RlX2JpbmFyeSA9PiAxIH0pOworICAgICAgICAgJGNzdi0+cXVvdGVfYmluYXJ5ICgwKTsKKyBteSAkZiA9ICRjc3YtPnF1b3RlX2JpbmFyeTsKKworQnkgZGVmYXVsdCwgIGFsbCAidW5zYWZlIiBieXRlcyBpbnNpZGUgYSBzdHJpbmcgY2F1c2UgdGhlIGNvbWJpbmVkIGZpZWxkIHRvCitiZSBxdW90ZWQuICBCeSBzZXR0aW5nIHRoaXMgYXR0cmlidXRlIHRvIEM8MD4sIHlvdSBjYW4gZGlzYWJsZSB0aGF0IHRyaWdnZXIKK2ZvciBieXRlcyA+PSBDPDB4N0Y+LgorCis9aGVhZDMgZXNjYXBlX251bGwgb3IgcXVvdGVfbnVsbCAoZGVwcmVjYXRlZCkKKworIG15ICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldyAoeyBlc2NhcGVfbnVsbCA9PiAxIH0pOworICAgICAgICAgJGNzdi0+ZXNjYXBlX251bGwgKDApOworIG15ICRmID0gJGNzdi0+ZXNjYXBlX251bGw7CisKK0J5IGRlZmF1bHQsIGEgQzxOVUxMPiBieXRlIGluIGEgZmllbGQgd291bGQgYmUgZXNjYXBlZC4gVGhpcyBvcHRpb24gZW5hYmxlcworeW91IHRvIHRyZWF0IHRoZSAgQzxOVUxMPiAgYnl0ZSBhcyBhIHNpbXBsZSBiaW5hcnkgY2hhcmFjdGVyIGluIGJpbmFyeSBtb2RlCisodGhlIEM8PCB7IGJpbmFyeSA9PiAxIH0gPj4gaXMgc2V0KS4gIFRoZSBkZWZhdWx0IGlzIHRydWUuICBZb3UgY2FuIHByZXZlbnQKK0M8TlVMTD4gZXNjYXBlcyBieSBzZXR0aW5nIHRoaXMgYXR0cmlidXRlIHRvIEM8MD4uCisKK1RoZSBkZWZhdWx0IHdoZW4gdXNpbmcgdGhlIEM8Y3N2PiBmdW5jdGlvbiBpcyBDPGZhbHNlPi4KKworPWhlYWQzIGtlZXBfbWV0YV9pbmZvCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsga2VlcF9tZXRhX2luZm8gPT4gMSB9KTsKKyAgICAgICAgICRjc3YtPmtlZXBfbWV0YV9pbmZvICgwKTsKKyBteSAkZiA9ICRjc3YtPmtlZXBfbWV0YV9pbmZvOworCitCeSBkZWZhdWx0LCB0aGUgcGFyc2luZyBvZiBpbnB1dCByZWNvcmRzIGlzIGFzIHNpbXBsZSBhbmQgZmFzdCBhcyBwb3NzaWJsZS4KK0hvd2V2ZXIsICBzb21lIHBhcnNpbmcgaW5mb3JtYXRpb24gLSBsaWtlIHF1b3RhdGlvbiBvZiB0aGUgb3JpZ2luYWwgZmllbGQgLQoraXMgbG9zdCBpbiB0aGF0IHByb2Nlc3MuICBTZXR0aW5nIHRoaXMgZmxhZyB0byB0cnVlIGVuYWJsZXMgcmV0cmlldmluZyB0aGF0CitpbmZvcm1hdGlvbiBhZnRlciBwYXJzaW5nIHdpdGggIHRoZSBtZXRob2RzICBMPC9tZXRhX2luZm8+LCAgTDwvaXNfcXVvdGVkPiwKK2FuZCBMPC9pc19iaW5hcnk+IGRlc2NyaWJlZCBiZWxvdy4gIERlZmF1bHQgaXMgZmFsc2UgZm9yIHBlcmZvcm1hbmNlLgorCitJZiB5b3Ugc2V0IHRoaXMgYXR0cmlidXRlIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDksICAgdGhhbiB5b3UgY2FuIGNvbnRyb2wKK291dHB1dCBxdW90YXRpb24gc3R5bGUgbGlrZSBpdCB3YXMgdXNlZCBpbiB0aGUgaW5wdXQgb2YgdGhlIHRoZSBsYXN0IHBhcnNlZAorcmVjb3JkICh1bmxlc3MgcXVvdGF0aW9uIHdhcyBhZGRlZCBiZWNhdXNlIG9mIG90aGVyIHJlYXNvbnMpLgorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7CisgICAgYmluYXJ5ICAgICAgICAgPT4gMSwKKyAgICBrZWVwX21ldGFfaW5mbyA9PiAxLAorICAgIHF1b3RlX3NwYWNlICAgID0+IDAsCisgICAgfSk7CisKKyBteSAkcm93ID0gJGNzdi0+cGFyc2UgKHF7MSwsIiIsICwiICIsZiwiZyIsImgiImgiLGhlbHAsImhlbHAifSk7CisKKyAkY3N2LT5wcmludCAoKlNURE9VVCwgXEByb3cpOworICMgMSwsLCAsICxmLGcsImgiImgiLGhlbHAsaGVscAorICRjc3YtPmtlZXBfbWV0YV9pbmZvICgxMSk7CisgJGNzdi0+cHJpbnQgKCpTVERPVVQsIFxAcm93KTsKKyAjIDEsLCIiLCAsIiAiLGYsImciLCJoIiJoIixoZWxwLCJoZWxwIgorCis9aGVhZDMgdmVyYmF0aW0KKworIG15ICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldyAoeyB2ZXJiYXRpbSA9PiAxIH0pOworICAgICAgICAgJGNzdi0+dmVyYmF0aW0gKDApOworIG15ICRmID0gJGNzdi0+dmVyYmF0aW07CisKK1RoaXMgaXMgYSBxdWl0ZSBjb250cm92ZXJzaWFsIGF0dHJpYnV0ZSB0byBzZXQsICBidXQgbWFrZXMgc29tZSBoYXJkIHRoaW5ncworcG9zc2libGUuCisKK1RoZSByYXRpb25hbGUgYmVoaW5kIHRoaXMgYXR0cmlidXRlIGlzIHRvIHRlbGwgdGhlIHBhcnNlciB0aGF0IHRoZSBub3JtYWxseQorc3BlY2lhbCBjaGFyYWN0ZXJzIG5ld2xpbmUgKEM8Tkw+KSBhbmQgQ2FycmlhZ2UgUmV0dXJuIChDPENSPikgIHdpbGwgbm90IGJlCitzcGVjaWFsIHdoZW4gdGhpcyBmbGFnIGlzIHNldCwgIGFuZCBiZSBkZWFsdCB3aXRoICBhcyBiZWluZyBvcmRpbmFyeSBiaW5hcnkKK2NoYXJhY3RlcnMuIFRoaXMgd2lsbCBlYXNlIHdvcmtpbmcgd2l0aCBkYXRhIHdpdGggZW1iZWRkZWQgbmV3bGluZXMuCisKK1doZW4gIEM8dmVyYmF0aW0+ICBpcyB1c2VkIHdpdGggIEw8L2dldGxpbmU+LCAgTDwvZ2V0bGluZT4gIGF1dG8tQzxjaG9tcD4ncworZXZlcnkgbGluZS4KKworSW1hZ2luZSBhIGZpbGUgZm9ybWF0IGxpa2UKKworIE1eXkhhbnNeSmFuc3Nlbl5LbGFzIDJcbjJBXkphXjExLTA2LTIwMDcjXHJcbgorCit3aGVyZSwgdGhlIGxpbmUgZW5kaW5nIGlzIGEgdmVyeSBzcGVjaWZpYyBDPCIjXHJcbiI+LCBhbmQgdGhlIHNlcF9jaGFyIGlzIGEKK0M8Xj4gKGNhcmV0KS4gICBOb25lIG9mIHRoZSBmaWVsZHMgaXMgcXVvdGVkLCAgIGJ1dCBlbWJlZGRlZCBiaW5hcnkgZGF0YSBpcworbGlrZWx5IHRvIGJlIHByZXNlbnQuIFdpdGggdGhlIHNwZWNpZmljIGxpbmUgZW5kaW5nLCB0aGlzIHNob3VsZCBub3QgYmUgdG9vCitoYXJkIHRvIGRldGVjdC4KKworQnkgZGVmYXVsdCwgIFRleHQ6OkNTVl9QUCcgIHBhcnNlIGZ1bmN0aW9uIGlzIGluc3RydWN0ZWQgdG8gb25seSBrbm93IGFib3V0CitDPCJcbiI+IGFuZCBDPCJcciI+ICB0byBiZSBsZWdhbCBsaW5lIGVuZGluZ3MsICBhbmQgc28gaGFzIHRvIGRlYWwgd2l0aCB0aGUKK2VtYmVkZGVkIG5ld2xpbmUgYXMgYSByZWFsIEM8ZW5kLW9mLWxpbmU+LCAgc28gaXQgY2FuIHNjYW4gdGhlIG5leHQgbGluZSBpZgorYmluYXJ5IGlzIHRydWUsIGFuZCB0aGUgbmV3bGluZSBpcyBpbnNpZGUgYSBxdW90ZWQgZmllbGQuIFdpdGggdGhpcyBvcHRpb24sCit3ZSB0ZWxsIEw8L3BhcnNlPiB0byBwYXJzZSB0aGUgbGluZSBhcyBpZiBDPCJcbiI+IGlzIGp1c3Qgbm90aGluZyBtb3JlIHRoYW4KK2EgYmluYXJ5IGNoYXJhY3Rlci4KKworRm9yIEw8L3BhcnNlPiB0aGlzIG1lYW5zIHRoYXQgdGhlIHBhcnNlciBoYXMgbm8gbW9yZSBpZGVhIGFib3V0IGxpbmUgZW5kaW5nCithbmQgTDwvZ2V0bGluZT4gQzxjaG9tcD5zIGxpbmUgZW5kaW5ncyBvbiByZWFkaW5nLgorCis9aGVhZDMgdHlwZXMKKworQSBzZXQgb2YgY29sdW1uIHR5cGVzOyB0aGUgYXR0cmlidXRlIGlzIGltbWVkaWF0ZWx5IHBhc3NlZCB0byB0aGUgTDwvdHlwZXM+CittZXRob2QuCisKKz1oZWFkMyBjYWxsYmFja3MKKworU2VlIHRoZSBMPC9DYWxsYmFja3M+IHNlY3Rpb24gYmVsb3cuCisKKz1oZWFkMyBhY2Nlc3NvcnMKKworVG8gc3VtIGl0IHVwLAorCisgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICgpOworCitpcyBlcXVpdmFsZW50IHRvCisKKyAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsKKyAgICAgZW9sICAgICAgICAgICAgICAgICAgID0+IHVuZGVmLCAjIFxyLCBcbiwgb3IgXHJcbgorICAgICBzZXBfY2hhciAgICAgICAgICAgICAgPT4gJywnLAorICAgICBzZXAgICAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCisgICAgIHF1b3RlX2NoYXIgICAgICAgICAgICA9PiAnIicsCisgICAgIHF1b3RlICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKKyAgICAgZXNjYXBlX2NoYXIgICAgICAgICAgID0+ICciJywKKyAgICAgYmluYXJ5ICAgICAgICAgICAgICAgID0+IDAsCisgICAgIGRlY29kZV91dGY4ICAgICAgICAgICA9PiAxLAorICAgICBhdXRvX2RpYWcgICAgICAgICAgICAgPT4gMCwKKyAgICAgZGlhZ192ZXJib3NlICAgICAgICAgID0+IDAsCisgICAgIGJsYW5rX2lzX3VuZGVmICAgICAgICA9PiAwLAorICAgICBlbXB0eV9pc191bmRlZiAgICAgICAgPT4gMCwKKyAgICAgYWxsb3dfd2hpdGVzcGFjZSAgICAgID0+IDAsCisgICAgIGFsbG93X2xvb3NlX3F1b3RlcyAgICA9PiAwLAorICAgICBhbGxvd19sb29zZV9lc2NhcGVzICAgPT4gMCwKKyAgICAgYWxsb3dfdW5xdW90ZWRfZXNjYXBlID0+IDAsCisgICAgIGFsd2F5c19xdW90ZSAgICAgICAgICA9PiAwLAorICAgICBxdW90ZV9lbXB0eSAgICAgICAgICAgPT4gMCwKKyAgICAgcXVvdGVfc3BhY2UgICAgICAgICAgID0+IDEsCisgICAgIGVzY2FwZV9udWxsICAgICAgICAgICA9PiAxLAorICAgICBxdW90ZV9iaW5hcnkgICAgICAgICAgPT4gMSwKKyAgICAga2VlcF9tZXRhX2luZm8gICAgICAgID0+IDAsCisgICAgIHZlcmJhdGltICAgICAgICAgICAgICA9PiAwLAorICAgICB0eXBlcyAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCisgICAgIGNhbGxiYWNrcyAgICAgICAgICAgICA9PiB1bmRlZiwKKyAgICAgfSk7CisKK0ZvciBhbGwgb2YgdGhlIGFib3ZlIG1lbnRpb25lZCBmbGFncywgYW4gYWNjZXNzb3IgbWV0aG9kIGlzIGF2YWlsYWJsZSB3aGVyZQoreW91IGNhbiBpbnF1aXJlIHRoZSBjdXJyZW50IHZhbHVlLCBvciBjaGFuZ2UgdGhlIHZhbHVlCisKKyBteSAkcXVvdGUgPSAkY3N2LT5xdW90ZV9jaGFyOworICRjc3YtPmJpbmFyeSAoMSk7CisKK0l0IGlzIG5vdCB3aXNlIHRvIGNoYW5nZSB0aGVzZSBzZXR0aW5ncyBoYWxmd2F5IHRocm91Z2ggd3JpdGluZyBDPENTVj4gZGF0YQordG8gYSBzdHJlYW0uIElmIGhvd2V2ZXIgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IHN0cmVhbSB1c2luZyB0aGUgYXZhaWxhYmxlCitDPENTVj4gb2JqZWN0LCB0aGVyZSBpcyBubyBoYXJtIGluIGNoYW5naW5nIHRoZW0uCisKK0lmIHRoZSBMPC9uZXc+IGNvbnN0cnVjdG9yIGNhbGwgZmFpbHMsICBpdCByZXR1cm5zIEM8dW5kZWY+LCAgYW5kIG1ha2VzIHRoZQorZmFpbCByZWFzb24gYXZhaWxhYmxlIHRocm91Z2ggdGhlIEw8L2Vycm9yX2RpYWc+IG1ldGhvZC4KKworICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldyAoeyBlY3NfY2hhciA9PiAxIH0pIG9yCisgICAgIGRpZSAiIi5UZXh0OjpDU1ZfUFAtPmVycm9yX2RpYWcgKCk7CisKK0w8L2Vycm9yX2RpYWc+IHdpbGwgcmV0dXJuIGEgc3RyaW5nIGxpa2UKKworICJJTkkgLSBVbmtub3duIGF0dHJpYnV0ZSAnZWNzX2NoYXInIgorCis9aGVhZDIga25vd25fYXR0cmlidXRlcworCisgQGF0dHIgPSBUZXh0OjpDU1ZfUFAtPmtub3duX2F0dHJpYnV0ZXM7CisgQGF0dHIgPSBUZXh0OjpDU1ZfUFA6Omtub3duX2F0dHJpYnV0ZXM7CisgQGF0dHIgPSAkY3N2LT5rbm93bl9hdHRyaWJ1dGVzOworCitUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbiBvcmRlcmVkIGxpc3Qgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgIGF0dHJpYnV0ZXMgYXMKK2Rlc2NyaWJlZCBhYm92ZS4gICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGtub3dpbmcgd2hhdCBhdHRyaWJ1dGVzIGFyZSB2YWxpZAoraW4gY2xhc3NlcyB0aGF0IHVzZSBvciBleHRlbmQgVGV4dDo6Q1NWX1BQLgorCis9aGVhZDIgcHJpbnQKKworICRzdGF0dXMgPSAkY3N2LT5wcmludCAoJGlvLCAkY29scmVmKTsKKworU2ltaWxhciB0byAgTDwvY29tYmluZT4gKyBMPC9zdHJpbmc+ICsgTDwvcHJpbnQ+LCAgYnV0IG11Y2ggbW9yZSBlZmZpY2llbnQuCitJdCBleHBlY3RzIGFuIGFycmF5IHJlZiBhcyBpbnB1dCAgKG5vdCBhbiBhcnJheSEpICBhbmQgdGhlIHJlc3VsdGluZyBzdHJpbmcKK2lzIG5vdCByZWFsbHkgIGNyZWF0ZWQsICBidXQgIGltbWVkaWF0ZWx5ICB3cml0dGVuICB0byB0aGUgIEM8JGlvPiAgb2JqZWN0LAordHlwaWNhbGx5IGFuIElPIGhhbmRsZSBvciBhbnkgb3RoZXIgb2JqZWN0IHRoYXQgb2ZmZXJzIGEgTDwvcHJpbnQ+IG1ldGhvZC4KKworRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgIEM8cHJpbnQ+ICBkb2VzIG5vdCBjcmVhdGUgYSByZXN1bHQgc3RyaW5nLCAgc28gYWxsCitMPC9zdHJpbmc+LCBMPC9zdGF0dXM+LCBMPC9maWVsZHM+LCBhbmQgTDwvZXJyb3JfaW5wdXQ+IG1ldGhvZHMgd2lsbCByZXR1cm4KK3VuZGVmaW5lZCBpbmZvcm1hdGlvbiBhZnRlciBleGVjdXRpbmcgdGhpcyBtZXRob2QuCisKK0lmIEM8JGNvbHJlZj4gaXMgQzx1bmRlZj4gIChleHBsaWNpdCwgIG5vdCB0aHJvdWdoIGEgdmFyaWFibGUgYXJndW1lbnQpIGFuZAorTDwvYmluZF9jb2x1bW5zPiAgd2FzIHVzZWQgdG8gc3BlY2lmeSBmaWVsZHMgdG8gYmUgcHJpbnRlZCwgIGl0IGlzIHBvc3NpYmxlCit0byBtYWtlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cywgYXMgb3RoZXJ3aXNlIGRhdGEgd291bGQgaGF2ZSB0byBiZSBjb3BpZWQKK2FzIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGNhbGw6CisKKyAkY3N2LT5iaW5kX2NvbHVtbnMgKFwoJGZvbywgJGJhcikpOworICRzdGF0dXMgPSAkY3N2LT5wcmludCAoJGZoLCB1bmRlZik7CisKKz1oZWFkMiBzYXkKKworICRzdGF0dXMgPSAkY3N2LT5zYXkgKCRpbywgJGNvbHJlZik7CisKK0xpa2UgTDxDPHByaW50PnwvcHJpbnQ+LCBidXQgTDxDPGVvbD58L2VvbD4gZGVmYXVsdHMgdG8gQzwkXD4uCisKKz1oZWFkMiBwcmludF9ocgorCisgJGNzdi0+cHJpbnRfaHIgKCRpbywgJHJlZik7CisKK1Byb3ZpZGVzIGFuIGVhc3kgd2F5ICB0byBwcmludCBhICBDPCRyZWY+ICAoYXMgZmV0Y2hlZCB3aXRoIEw8L2dldGxpbmVfaHI+KQorcHJvdmlkZWQgdGhlIGNvbHVtbiBuYW1lcyBhcmUgc2V0IHdpdGggTDwvY29sdW1uX25hbWVzPi4KKworSXQgaXMganVzdCBhIHdyYXBwZXIgbWV0aG9kIHdpdGggYmFzaWMgcGFyYW1ldGVyIGNoZWNrcyBvdmVyCisKKyAkY3N2LT5wcmludCAoJGlvLCBbIG1hcCB7ICRyZWYtPnskX30gfSAkY3N2LT5jb2x1bW5fbmFtZXMgXSk7CisKKz1oZWFkMiBjb21iaW5lCisKKyAkc3RhdHVzID0gJGNzdi0+Y29tYmluZSAoQGZpZWxkcyk7CisKK1RoaXMgbWV0aG9kIGNvbnN0cnVjdHMgYSBDPENTVj4gcmVjb3JkIGZyb20gIEM8QGZpZWxkcz4sICByZXR1cm5pbmcgc3VjY2Vzcworb3IgZmFpbHVyZS4gICBGYWlsdXJlIGNhbiByZXN1bHQgZnJvbSBsYWNrIG9mIGFyZ3VtZW50cyBvciBhbiBhcmd1bWVudCB0aGF0Citjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3Rlci4gICBVcG9uIHN1Y2Nlc3MsICBMPC9zdHJpbmc+IGNhbiBiZSBjYWxsZWQgdG8KK3JldHJpZXZlIHRoZSByZXN1bHRhbnQgQzxDU1Y+IHN0cmluZy4gIFVwb24gZmFpbHVyZSwgIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorTDwvc3RyaW5nPiBpcyB1bmRlZmluZWQgYW5kIEw8L2Vycm9yX2lucHV0PiBjb3VsZCBiZSBjYWxsZWQgdG8gcmV0cmlldmUgdGhlCitpbnZhbGlkIGFyZ3VtZW50LgorCis9aGVhZDIgc3RyaW5nCisKKyAkbGluZSA9ICRjc3YtPnN0cmluZyAoKTsKKworVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5wdXQgdG8gIEw8L3BhcnNlPiAgb3IgdGhlIHJlc3VsdGFudCBDPENTVj4gc3RyaW5nCitvZiBMPC9jb21iaW5lPiwgd2hpY2hldmVyIHdhcyBjYWxsZWQgbW9yZSByZWNlbnRseS4KKworPWhlYWQyIGdldGxpbmUKKworICRjb2xyZWYgPSAkY3N2LT5nZXRsaW5lICgkaW8pOworCitUaGlzIGlzIHRoZSBjb3VudGVycGFydCB0byAgTDwvcHJpbnQ+LCAgYXMgTDwvcGFyc2U+ICBpcyB0aGUgY291bnRlcnBhcnQgdG8KK0w8L2NvbWJpbmU+OiAgaXQgcGFyc2VzIGEgcm93IGZyb20gdGhlIEM8JGlvPiAgaGFuZGxlIHVzaW5nIHRoZSBMPC9nZXRsaW5lPgorbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBDPCRpbz4gIGFuZCBwYXJzZXMgdGhpcyByb3cgaW50byBhbiBhcnJheSByZWYuICBUaGlzCithcnJheSByZWYgaXMgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uIG9yIEM8dW5kZWY+IGZvciBmYWlsdXJlLiAgV2hlbiBDPCRpbz4KK2RvZXMgbm90IHN1cHBvcnQgQzxnZXRsaW5lPiwgeW91IGFyZSBsaWtlbHkgdG8gaGl0IGVycm9ycy4KKworV2hlbiBmaWVsZHMgYXJlIGJvdW5kIHdpdGggTDwvYmluZF9jb2x1bW5zPiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgcmVmZXJlbmNlCit0byBhbiBlbXB0eSBsaXN0LgorCitUaGUgTDwvc3RyaW5nPiwgTDwvZmllbGRzPiwgYW5kIEw8L3N0YXR1cz4gbWV0aG9kcyBhcmUgbWVhbmluZ2xlc3MgYWdhaW4uCisKKz1oZWFkMiBnZXRsaW5lX2FsbAorCisgJGFycmF5cmVmID0gJGNzdi0+Z2V0bGluZV9hbGwgKCRpbyk7CisgJGFycmF5cmVmID0gJGNzdi0+Z2V0bGluZV9hbGwgKCRpbywgJG9mZnNldCk7CisgJGFycmF5cmVmID0gJGNzdi0+Z2V0bGluZV9hbGwgKCRpbywgJG9mZnNldCwgJGxlbmd0aCk7CisKK1RoaXMgd2lsbCByZXR1cm4gYSByZWZlcmVuY2UgdG8gYSBsaXN0IG9mIEw8Z2V0bGluZSAoJGlvKXwvZ2V0bGluZT4gcmVzdWx0cy4KK0luIHRoaXMgY2FsbCwgQzxrZWVwX21ldGFfaW5mbz4gaXMgZGlzYWJsZWQuICBJZiBDPCRvZmZzZXQ+IGlzIG5lZ2F0aXZlLCBhcword2l0aCBDPHNwbGljZT4sIG9ubHkgdGhlIGxhc3QgIEM8YWJzICgkb2Zmc2V0KT4gcmVjb3JkcyBvZiBDPCRpbz4gYXJlIHRha2VuCitpbnRvIGNvbnNpZGVyYXRpb24uCisKK0dpdmVuIGEgQ1NWIGZpbGUgd2l0aCAxMCBsaW5lczoKKworIGxpbmVzIGNhbGwKKyAtLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAwLi45ICAkY3N2LT5nZXRsaW5lX2FsbCAoJGlvKSAgICAgICAgICMgYWxsCisgMC4uOSAgJGNzdi0+Z2V0bGluZV9hbGwgKCRpbywgIDApICAgICAjIGFsbAorIDguLjkgICRjc3YtPmdldGxpbmVfYWxsICgkaW8sICA4KSAgICAgIyBzdGFydCBhdCA4CisgLSAgICAgJGNzdi0+Z2V0bGluZV9hbGwgKCRpbywgIDAsICAwKSAjIHN0YXJ0IGF0IDAgZmlyc3QgMCByb3dzCisgMC4uNCAgJGNzdi0+Z2V0bGluZV9hbGwgKCRpbywgIDAsICA1KSAjIHN0YXJ0IGF0IDAgZmlyc3QgNSByb3dzCisgNC4uNSAgJGNzdi0+Z2V0bGluZV9hbGwgKCRpbywgIDQsICAyKSAjIHN0YXJ0IGF0IDQgZmlyc3QgMiByb3dzCisgOC4uOSAgJGNzdi0+Z2V0bGluZV9hbGwgKCRpbywgLTIpICAgICAjIGxhc3QgMiByb3dzCisgNi4uNyAgJGNzdi0+Z2V0bGluZV9hbGwgKCRpbywgLTQsICAyKSAjIGZpcnN0IDIgb2YgbGFzdCAgNCByb3dzCisKKz1oZWFkMiBnZXRsaW5lX2hyCisKK1RoZSBMPC9nZXRsaW5lX2hyPiBhbmQgTDwvY29sdW1uX25hbWVzPiBtZXRob2RzIHdvcmsgdG9nZXRoZXIgIHRvIGFsbG93IHlvdQordG8gaGF2ZSByb3dzIHJldHVybmVkIGFzIGhhc2hyZWZzLiAgWW91IG11c3QgY2FsbCBMPC9jb2x1bW5fbmFtZXM+IGZpcnN0IHRvCitkZWNsYXJlIHlvdXIgY29sdW1uIG5hbWVzLgorCisgJGNzdi0+Y29sdW1uX25hbWVzIChxdyggY29kZSBuYW1lIHByaWNlIGRlc2NyaXB0aW9uICkpOworICRociA9ICRjc3YtPmdldGxpbmVfaHIgKCRpbyk7CisgcHJpbnQgIlByaWNlIGZvciAkaHItPntuYW1lfSBpcyAkaHItPntwcmljZX0gRVVSXG4iOworCitMPC9nZXRsaW5lX2hyPiB3aWxsIGNyb2FrIGlmIGNhbGxlZCBiZWZvcmUgTDwvY29sdW1uX25hbWVzPi4KKworTm90ZSB0aGF0ICBMPC9nZXRsaW5lX2hyPiAgY3JlYXRlcyBhIGhhc2hyZWYgZm9yIGV2ZXJ5IHJvdyBhbmQgd2lsbCBiZSBtdWNoCitzbG93ZXIgdGhhbiB0aGUgY29tYmluZWQgdXNlIG9mIEw8L2JpbmRfY29sdW1ucz4gIGFuZCBMPC9nZXRsaW5lPiBidXQgc3RpbGwKK29mZmVyaW5nIHRoZSBzYW1lIGVhc2Ugb2YgdXNlIGhhc2hyZWYgaW5zaWRlIHRoZSBsb29wOgorCisgbXkgQGNvbHMgPSBAeyRjc3YtPmdldGxpbmUgKCRpbyl9OworICRjc3YtPmNvbHVtbl9uYW1lcyAoQGNvbHMpOworIHdoaWxlIChteSAkcm93ID0gJGNzdi0+Z2V0bGluZV9ociAoJGlvKSkgeworICAgICBwcmludCAkcm93LT57cHJpY2V9OworICAgICB9CisKK0NvdWxkIGVhc2lseSBiZSByZXdyaXR0ZW4gdG8gdGhlIG11Y2ggZmFzdGVyOgorCisgbXkgQGNvbHMgPSBAeyRjc3YtPmdldGxpbmUgKCRpbyl9OworIG15ICRyb3cgPSB7fTsKKyAkY3N2LT5iaW5kX2NvbHVtbnMgKFxAeyRyb3d9e0Bjb2xzfSk7Cisgd2hpbGUgKCRjc3YtPmdldGxpbmUgKCRpbykpIHsKKyAgICAgcHJpbnQgJHJvdy0+e3ByaWNlfTsKKyAgICAgfQorCitZb3VyIG1pbGVhZ2UgbWF5IHZhcnkgZm9yIHRoZSBzaXplIG9mIHRoZSBkYXRhIGFuZCB0aGUgbnVtYmVyIG9mIHJvd3MuCisKKz1oZWFkMiBnZXRsaW5lX2hyX2FsbAorCisgJGFycmF5cmVmID0gJGNzdi0+Z2V0bGluZV9ocl9hbGwgKCRpbyk7CisgJGFycmF5cmVmID0gJGNzdi0+Z2V0bGluZV9ocl9hbGwgKCRpbywgJG9mZnNldCk7CisgJGFycmF5cmVmID0gJGNzdi0+Z2V0bGluZV9ocl9hbGwgKCRpbywgJG9mZnNldCwgJGxlbmd0aCk7CisKK1RoaXMgd2lsbCByZXR1cm4gYSByZWZlcmVuY2UgdG8gYSBsaXN0IG9mICAgTDxnZXRsaW5lX2hyICgkaW8pfC9nZXRsaW5lX2hyPgorcmVzdWx0cy4gIEluIHRoaXMgY2FsbCwgTDxDPGtlZXBfbWV0YV9pbmZvPnwva2VlcF9tZXRhX2luZm8+IGlzIGRpc2FibGVkLgorCis9aGVhZDIgcGFyc2UKKworICRzdGF0dXMgPSAkY3N2LT5wYXJzZSAoJGxpbmUpOworCitUaGlzIG1ldGhvZCBkZWNvbXBvc2VzIGEgIEM8Q1NWPiAgc3RyaW5nIGludG8gZmllbGRzLCAgcmV0dXJuaW5nIHN1Y2Nlc3Mgb3IKK2ZhaWx1cmUuICAgRmFpbHVyZSBjYW4gcmVzdWx0IGZyb20gYSBsYWNrIG9mIGFyZ3VtZW50ICBvciB0aGUgZ2l2ZW4gIEM8Q1NWPgorc3RyaW5nIGlzIGltcHJvcGVybHkgZm9ybWF0dGVkLiAgIFVwb24gc3VjY2VzcywgTDwvZmllbGRzPiBjYW4gYmUgY2FsbGVkIHRvCityZXRyaWV2ZSB0aGUgZGVjb21wb3NlZCBmaWVsZHMuIFVwb24gZmFpbHVyZSBjYWxsaW5nIEw8L2ZpZWxkcz4gd2lsbCByZXR1cm4KK3VuZGVmaW5lZCBkYXRhIGFuZCAgTDwvZXJyb3JfaW5wdXQ+ICBjYW4gYmUgY2FsbGVkIHRvIHJldHJpZXZlICB0aGUgaW52YWxpZAorYXJndW1lbnQuCisKK1lvdSBtYXkgdXNlIHRoZSBMPC90eXBlcz4gIG1ldGhvZCBmb3Igc2V0dGluZyBjb2x1bW4gdHlwZXMuICBTZWUgTDwvdHlwZXM+JworZGVzY3JpcHRpb24gYmVsb3cuCisKK1RoZSBDPCRsaW5lPiBhcmd1bWVudCBpcyBzdXBwb3NlZCB0byBiZSBhIHNpbXBsZSBzY2FsYXIuIEV2ZXJ5dGhpbmcgZWxzZSBpcworc3VwcG9zZWQgdG8gY3JvYWsgYW5kIHNldCBlcnJvciAxNTAwLgorCis9aGVhZDIgZnJhZ21lbnQKKworVGhpcyBmdW5jdGlvbiB0cmllcyB0byBpbXBsZW1lbnQgUkZDNzExMSAgKFVSSSBGcmFnbWVudCBJZGVudGlmaWVycyBmb3IgdGhlCit0ZXh0L2NzdiBNZWRpYSBUeXBlKSAtIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcxMTEKKworIG15ICRBb0EgPSAkY3N2LT5mcmFnbWVudCAoJGlvLCAkc3BlYyk7CisKK0luIHNwZWNpZmljYXRpb25zLCAgQzwqPiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIEk8bGFzdD4gaXRlbSwgYSBkYXNoIChDPC0+KQordG8gaW5kaWNhdGUgYSByYW5nZS4gICBBbGwgaW5kaWNlcyBhcmUgQzwxPi1iYXNlZDogIHRoZSBmaXJzdCByb3cgb3IgY29sdW1uCitoYXMgaW5kZXggQzwxPi4gU2VsZWN0aW9ucyBjYW4gYmUgY29tYmluZWQgd2l0aCB0aGUgc2VtaS1jb2xvbiAoQzw7PikuCisKK1doZW4gdXNpbmcgdGhpcyBtZXRob2QgaW4gY29tYmluYXRpb24gd2l0aCAgTDwvY29sdW1uX25hbWVzPiwgIHRoZSByZXR1cm5lZAorcmVmZXJlbmNlICB3aWxsIHBvaW50IHRvIGEgIGxpc3Qgb2YgaGFzaGVzICBpbnN0ZWFkIG9mIGEgIGxpc3Qgb2YgbGlzdHMuICBBCitkaXNqb2ludGVkICBjZWxsLWJhc2VkIGNvbWJpbmVkIHNlbGVjdGlvbiAgbWlnaHQgcmV0dXJuIHJvd3Mgd2l0aCBkaWZmZXJlbnQKK251bWJlciBvZiBjb2x1bW5zIG1ha2luZyB0aGUgdXNlIG9mIGhhc2hlcyB1bnByZWRpY3RhYmxlLgorCisgJGNzdi0+Y29sdW1uX25hbWVzICgiTmFtZSIsICJBZ2UiKTsKKyBteSAkQW9IID0gJGNzdi0+ZnJhZ21lbnQgKCRpbywgImNvbD0zOzgiKTsKKworSWYgdGhlIEw8L2FmdGVyX3BhcnNlPiBjYWxsYmFjayBpcyBhY3RpdmUsICBpdCBpcyBhbHNvIGNhbGxlZCBvbiBldmVyeSBsaW5lCitwYXJzZWQgYW5kIHNraXBwZWQgYmVmb3JlIHRoZSBmcmFnbWVudC4KKworPW92ZXIgMgorCis9aXRlbSByb3cKKworIHJvdz00Cisgcm93PTUtNworIHJvdz02LSoKKyByb3c9MS0yOzQ7Ni0qCisKKz1pdGVtIGNvbAorCisgY29sPTIKKyBjb2w9MS0zCisgY29sPTQtKgorIGNvbD0xLTI7NDs3LSoKKworPWl0ZW0gY2VsbAorCitJbiBjZWxsLWJhc2VkIHNlbGVjdGlvbiwgdGhlIGNvbW1hIChDPCw+KSBpcyB1c2VkIHRvIHBhaXIgcm93IGFuZCBjb2x1bW4KKworIGNlbGw9NCwxCisKK1RoZSByYW5nZSBvcGVyYXRvciAoQzwtPikgdXNpbmcgQzxjZWxsPnMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRvcC1sZWZ0IGFuZAorYm90dG9tLXJpZ2h0IEM8Y2VsbD4gbG9jYXRpb24KKworIGNlbGw9MywxLTQsNgorCitUaGUgQzwqPiBpcyBvbmx5IGFsbG93ZWQgaW4gdGhlIHNlY29uZCBwYXJ0IG9mIGEgcGFpcgorCisgY2VsbD0zLDItKiwyICAgICMgcm93IDMgdGlsbCBlbmQsIG9ubHkgY29sdW1uIDIKKyBjZWxsPTMsMi0zLCogICAgIyBjb2x1bW4gMiB0aWxsIGVuZCwgb25seSByb3cgMworIGNlbGw9MywyLSosKiAgICAjIHN0cmlwIHJvdyAxIGFuZCAyLCBhbmQgY29sdW1uIDEKKworQ2VsbHMgYW5kIGNlbGwgcmFuZ2VzIG1heSBiZSBjb21iaW5lZCB3aXRoIEM8Oz4sIHBvc3NpYmx5IHJlc3VsdGluZyBpbiByb3dzCit3aXRoIGRpZmZlcmVudCBudW1iZXIgb2YgY29sdW1ucworCisgY2VsbD0xLDEtMiwyOzMsMy00LDQ7MSw0OzQsMQorCitEaXNqb2ludGVkIHNlbGVjdGlvbnMgd2lsbCBvbmx5IHJldHVybiBzZWxlY3RlZCBjZWxscy4gICBUaGUgY2VsbHMgdGhhdCBhcmUKK25vdCAgc3BlY2lmaWVkICB3aWxsICBub3QgIGJlICBpbmNsdWRlZCAgaW4gdGhlICByZXR1cm5lZCBzZXQsICBub3QgZXZlbiBhcworQzx1bmRlZj4uICBBcyBhbiBleGFtcGxlIGdpdmVuIGEgQzxDU1Y+IGxpa2UKKworIDExLDEyLDEzLC4uLjE5CisgMjEsMjIsLi4uMjgsMjkKKyA6ICAgICAgICAgICAgOgorIDkxLC4uLjk3LDk4LDk5CisKK3dpdGggQzxjZWxsPTEsMS0yLDI7MywzLTQsNDsxLDQ7NCwxPiB3aWxsIHJldHVybjoKKworIDExLDEyLDE0CisgMjEsMjIKKyAzMywzNAorIDQxLDQzLDQ0CisKK092ZXJsYXBwaW5nIGNlbGwtc3BlY3Mgd2lsbCByZXR1cm4gdGhvc2UgY2VsbHMgb25seSBvbmNlLCBTbworQzxjZWxsPTEsMS0zLDM7MiwyLTQsNDsyLDM7NCwyPiB3aWxsIHJldHVybjoKKworIDExLDEyLDEzCisgMjEsMjIsMjMsMjQKKyAzMSwzMiwzMywzNAorIDQyLDQzLDQ0CisKKz1iYWNrCisKK0w8UkZDNzExMXxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MTExPiBkb2VzICBCPG5vdD4gIGFsbG93IGRpZmZlcmVudAordHlwZXMgb2Ygc3BlY3MgdG8gYmUgY29tYmluZWQgICAoZWl0aGVyIEM8cm93PiBJPG9yPiBDPGNvbD4gSTxvcj4gQzxjZWxsPikuCitQYXNzaW5nIGFuIGludmFsaWQgZnJhZ21lbnQgc3BlY2lmaWNhdGlvbiB3aWxsIGNyb2FrIGFuZCBzZXQgZXJyb3IgMjAxMy4KKworPWhlYWQyIGNvbHVtbl9uYW1lcworCitTZXQgdGhlICJrZXlzIiB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgIEw8L2dldGxpbmVfaHI+ICBjYWxscy4gIElmIG5vIGtleXMKKyhjb2x1bW4gbmFtZXMpIGFyZSBwYXNzZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IHNldHRpbmcgYXMgYSBsaXN0LgorCitMPC9jb2x1bW5fbmFtZXM+IGFjY2VwdHMgYSBsaXN0IG9mIHNjYWxhcnMgICh0aGUgY29sdW1uIG5hbWVzKSAgb3IgYSBzaW5nbGUKK2FycmF5X3JlZiwgc28geW91IGNhbiBwYXNzIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBMPC9nZXRsaW5lPiB0b286CisKKyAkY3N2LT5jb2x1bW5fbmFtZXMgKCRjc3YtPmdldGxpbmUgKCRpbykpOworCitMPC9jb2x1bW5fbmFtZXM+IGRvZXMgQjxubz4gY2hlY2tpbmcgb24gZHVwbGljYXRlcyBhdCBhbGwsIHdoaWNoIG1pZ2h0IGxlYWQKK3RvIHVuZXhwZWN0ZWQgcmVzdWx0cy4gICBVbmRlZmluZWQgZW50cmllcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHN0cmluZworQzwiXGNBVU5ERUZcY0EiPiwgc28KKworICRjc3YtPmNvbHVtbl9uYW1lcyAodW5kZWYsICIiLCAibmFtZSIsICJuYW1lIik7CisgJGhyID0gJGNzdi0+Z2V0bGluZV9ociAoJGlvKTsKKworV2lsbCBzZXQgQzw8ICRoci0+eyJcY0FVTkRFRlxjQSJ9ID4+IHRvIHRoZSAxc3QgZmllbGQsICBDPDwgJGhyLT57IiJ9ID4+IHRvCit0aGUgMm5kIGZpZWxkLCBhbmQgQzw8ICRoci0+e25hbWV9ID4+IHRvIHRoZSA0dGggZmllbGQsICBkaXNjYXJkaW5nIHRoZSAzcmQKK2ZpZWxkLgorCitMPC9jb2x1bW5fbmFtZXM+IGNyb2FrcyBvbiBpbnZhbGlkIGFyZ3VtZW50cy4KKworPWhlYWQyIGhlYWRlcgorCitUaGlzIG1ldGhvZCBkb2VzIE5PVCB3b3JrIGluIHBlcmwtNS42LngKKworUGFyc2UgdGhlIENTViBoZWFkZXIgYW5kIHNldCBMPEM8c2VwPnwvc2VwPiwgY29sdW1uX25hbWVzIGFuZCBlbmNvZGluZy4KKworIG15IEBoZHIgPSAkY3N2LT5oZWFkZXIgKCRmaCk7CisgJGNzdi0+aGVhZGVyICgkZmgsIHsgc2VwX3NldCA9PiBbICI7IiwgIiwiLCAifCIsICJcdCIgXSB9KTsKKyAkY3N2LT5oZWFkZXIgKCRmaCwgeyBkZXRlY3RfYm9tID0+IDEsIG11bmdlX2NvbHVtbl9uYW1lcyA9PiAibGMiIH0pOworCitUaGUgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIGEgZmlsZSBoYW5kbGUuCisKK0Fzc3VtaW5nIHRoYXQgdGhlIGZpbGUgb3BlbmVkIGZvciBwYXJzaW5nIGhhcyBhIGhlYWRlciwgYW5kIHRoZSBoZWFkZXIgZG9lcworbm90IGNvbnRhaW4gcHJvYmxlbWF0aWMgY2hhcmFjdGVycyBsaWtlIGVtYmVkZGVkIG5ld2xpbmVzLCAgIHJlYWQgdGhlIGZpcnN0CitsaW5lIGZyb20gdGhlIG9wZW4gaGFuZGxlIHRoZW4gYXV0by1kZXRlY3Qgd2hldGhlciB0aGUgaGVhZGVyIHNlcGFyYXRlcyB0aGUKK2NvbHVtbiBuYW1lcyB3aXRoIGEgY2hhcmFjdGVyIGZyb20gdGhlIGFsbG93ZWQgc2VwYXJhdG9yIGxpc3QuCisKK0lmIGFueSBvZiB0aGUgYWxsb3dlZCBzZXBhcmF0b3JzIG1hdGNoZXMsICBhbmQgbm9uZSBvZiB0aGUgSTxvdGhlcj4gYWxsb3dlZAorc2VwYXJhdG9ycyBtYXRjaCwgIHNldCAgTDxDPHNlcD58L3NlcD4gIHRvIHRoYXQgIHNlcGFyYXRvciAgZm9yIHRoZSBjdXJyZW50CitDU1ZfUFAgaW5zdGFuY2UgYW5kIHVzZSBpdCB0byBwYXJzZSB0aGUgZmlyc3QgbGluZSwgbWFwIHRob3NlIHRvIGxvd2VyY2FzZSwKK2FuZCB1c2UgdGhhdCB0byBzZXQgdGhlIGluc3RhbmNlIEw8L2NvbHVtbl9uYW1lcz46CisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgYmluYXJ5ID0+IDEsIGF1dG9fZGlhZyA9PiAxIH0pOworIG9wZW4gbXkgJGZoLCAiPCIsICJmaWxlLmNzdiI7CisgYmlubW9kZSAkZmg7ICMgZm9yIFdpbmRvd3MKKyAkY3N2LT5oZWFkZXIgKCRmaCk7Cisgd2hpbGUgKG15ICRyb3cgPSAkY3N2LT5nZXRsaW5lX2hyICgkZmgpKSB7CisgICAgIC4uLgorICAgICB9CisKK0lmIHRoZSBoZWFkZXIgaXMgZW1wdHksICBjb250YWlucyBtb3JlIHRoYW4gb25lIHVuaXF1ZSBzZXBhcmF0b3Igb3V0IG9mIHRoZQorYWxsb3dlZCBzZXQsICBjb250YWlucyBlbXB0eSBmaWVsZHMsICAgb3IgY29udGFpbnMgaWRlbnRpY2FsIGZpZWxkcyAgKGFmdGVyCitmb2xkaW5nKSwgaXQgd2lsbCBjcm9hayB3aXRoIGVycm9yIDEwMTAsIDEwMTEsIDEwMTIsIG9yIDEwMTMgcmVzcGVjdGl2ZWx5LgorCitJZiB0aGUgaGVhZGVyIGNvbnRhaW5zIGVtYmVkZGVkIG5ld2xpbmVzIG9yIGlzIG5vdCB2YWxpZCAgQ1NWICBpbiBhbnkgb3RoZXIKK3dheSwgdGhpcyBtZXRob2Qgd2lsbCBjcm9hayBhbmQgbGVhdmUgdGhlIHBhcnNlIGVycm9yIHVudG91Y2hlZC4KKworQSBzdWNjZXNzZnVsIGNhbGwgdG8gQzxoZWFkZXI+ICB3aWxsIGFsd2F5cyBzZXQgdGhlICBMPEM8c2VwPnwvc2VwPiAgb2YgdGhlCitDPCRjc3Y+IG9iamVjdC4gVGhpcyBiZWhhdmlvciBjYW4gbm90IGJlIGRpc2FibGVkLgorCis9aGVhZDMgcmV0dXJuIHZhbHVlCisKK09uIGVycm9yIHRoaXMgbWV0aG9kIHdpbGwgY3JvYWsuCisKK0luIGxpc3QgY29udGV4dCwgIHRoZSBoZWFkZXJzIHdpbGwgYmUgcmV0dXJuZWQgd2hldGhlciB0aGV5IGFyZSB1c2VkIHRvIHNldAorTDwvY29sdW1uX25hbWVzPiBvciBub3QuCisKK0luIHNjYWxhciBjb250ZXh0LCB0aGUgaW5zdGFuY2UgaXRzZWxmIGlzIHJldHVybmVkLiAgQjxOb3RlPjogdGhlIHZhbHVlcyBhcworZm91bmQgaW4gdGhlIGhlYWRlciB3aWxsIGVmZmVjdGl2ZWx5IGJlICBCPGxvc3Q+IGlmICBDPHNldF9jb2x1bW5fbmFtZXM+IGlzCitmYWxzZS4KKworPWhlYWQzIE9wdGlvbnMKKworPW92ZXIgMgorCis9aXRlbSBzZXBfc2V0CisKKyAkY3N2LT5oZWFkZXIgKCRmaCwgeyBzZXBfc2V0ID0+IFsgIjsiLCAiLCIsICJ8IiwgIlx0IiBdIH0pOworCitUaGUgbGlzdCBvZiBsZWdhbCBzZXBhcmF0b3JzIGRlZmF1bHRzIHRvIEM8WyAiOyIsICIsIiBdPiBhbmQgY2FuIGJlIGNoYW5nZWQKK2J5IHRoaXMgb3B0aW9uLiAgQXMgdGhpcyBpcyBwcm9iYWJseSB0aGUgbW9zdCBvZnRlbiB1c2VkIG9wdGlvbiwgIGl0IGNhbiBiZQorcGFzc2VkIG9uIGl0cyBvd24gYXMgYW4gdW5uYW1lZCBhcmd1bWVudDoKKworICRjc3YtPmhlYWRlciAoJGZoLCBbICI7IiwgIiwiLCAifCIsICJcdCIsICI6OiIsICJceHsyMDYzfSIgXSk7CisKK011bHRpLWJ5dGUgIHNlcXVlbmNlcyBhcmUgYWxsb3dlZCwgIGJvdGggbXVsdGktY2hhcmFjdGVyIGFuZCAgVW5pY29kZS4gIFNlZQorTDxDPHNlcD58L3NlcD4uCisKKz1pdGVtIGRldGVjdF9ib20KKworICRjc3YtPmhlYWRlciAoJGZoLCB7IGRldGVjdF9ib20gPT4gMSB9KTsKKworVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZGV0ZWN0IGlmIHRoZSBoZWFkZXIgbGluZSBzdGFydHMgd2l0aCBhIEJPTS4gIElmCit0aGUgaGVhZGVyIGhhcyBhIEJPTSwgdXNlIHRoYXQgdG8gc2V0IHRoZSBlbmNvZGluZyBvZiBDPCRmaD4uICBUaGlzIGRlZmF1bHQKK2JlaGF2aW9yIGNhbiBiZSBkaXNhYmxlZCBieSBwYXNzaW5nIGEgZmFsc2UgdmFsdWUgdG8gQzxkZXRlY3RfYm9tPi4KKworU3VwcG9ydGVkIGVuY29kaW5ncyBmcm9tIEJPTSBhcmU6IFVURi04LCBVVEYtMTZCRSwgVVRGLTE2TEUsIFVURi0zMkJFLCAgYW5kCitVVEYtMzJMRS4gQk9NJ3MgYWxzbyBzdXBwb3J0IFVURi0xLCBVVEYtRUJDRElDLCBTQ1NVLCBCT0NVLTEsICBhbmQgR0ItMTgwMzAKK2J1dCBMPEVuY29kZT4gZG9lcyBub3QgKHlldCkuIFVURi03IGlzIG5vdCBzdXBwb3J0ZWQuCisKK1RoZSBlbmNvZGluZyBpcyBzZXQgdXNpbmcgQzxiaW5tb2RlPiBvbiBDPCRmaD4uCisKK0lmIHRoZSBoYW5kbGUgd2FzIG9wZW5lZCBpbiBhIChjb3JyZWN0KSBlbmNvZGluZywgIHRoaXMgbWV0aG9kIHdpbGwgIEI8bm90PgorYWx0ZXIgdGhlIGVuY29kaW5nLCBhcyBpdCBjaGVja3MgdGhlIGxlYWRpbmcgQjxieXRlcz4gb2YgdGhlIGZpcnN0IGxpbmUuCisKKz1pdGVtIG11bmdlX2NvbHVtbl9uYW1lcworCitUaGlzIG9wdGlvbiBvZmZlcnMgdGhlIG1lYW5zIHRvIG1vZGlmeSB0aGUgY29sdW1uIG5hbWVzIGludG8gc29tZXRoaW5nIHRoYXQKK2lzIG1vc3QgdXNlZnVsIHRvIHRoZSBhcHBsaWNhdGlvbi4gICBUaGUgZGVmYXVsdCBpcyB0byBtYXAgYWxsIGNvbHVtbiBuYW1lcwordG8gbG93ZXIgY2FzZS4KKworICRjc3YtPmhlYWRlciAoJGZoLCB7IG11bmdlX2NvbHVtbl9uYW1lcyA9PiAibGMiIH0pOworCitUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgYXZhaWxhYmxlOgorCisgIGxjICAgLSBsb3dlciBjYXNlCisgIHVjICAgLSB1cHBlciBjYXNlCisgIG5vbmUgLSBkbyBub3QgY2hhbmdlCisgIFwmY2IgLSBzdXBwbHkgYSBjYWxsYmFjaworCisgJGNzdi0+aGVhZGVyICgkZmgsIHsgbXVuZ2VfY29sdW1uX25hbWVzID0+IHN1YiB7IGZjIH0gfSk7CisgJGNzdi0+aGVhZGVyICgkZmgsIHsgbXVuZ2VfY29sdW1uX25hbWVzID0+IHN1YiB7ICJjb2x1bW5fIi4kY29sKysgfSB9KTsKKyAkY3N2LT5oZWFkZXIgKCRmaCwgeyBtdW5nZV9jb2x1bW5fbmFtZXMgPT4gc3ViIHsgbGMgKHMvXFcrL18vZ3IpIH0gfSk7CisKK0FzIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGluIGEgQzxtYXA+LCB5b3UgY2FuIHVzZSBDPCRfPiBkaXJlY3RseS4KKworPWl0ZW0gc2V0X2NvbHVtbl9uYW1lcworCisgJGNzdi0+aGVhZGVyICgkZmgsIHsgc2V0X2NvbHVtbl9uYW1lcyA9PiAxIH0pOworCitUaGUgZGVmYXVsdCBpcyB0byBzZXQgdGhlIGluc3RhbmNlcyBjb2x1bW4gbmFtZXMgdXNpbmcgIEw8L2NvbHVtbl9uYW1lcz4gaWYKK3RoZSBtZXRob2QgaXMgc3VjY2Vzc2Z1bCwgIHNvIHN1YnNlcXVlbnQgY2FsbHMgdG8gTDwvZ2V0bGluZV9ocj4gY2FuIHJldHVybgorYSBoYXNoLiBEaXNhYmxlIHNldHRpbmcgdGhlIGhlYWRlciBjYW4gYmUgZm9yY2VkIGJ5IHVzaW5nIGEgZmFsc2UgdmFsdWUgZm9yCit0aGlzIG9wdGlvbi4KKworPWJhY2sKKworPWhlYWQzIFZhbGlkYXRpb24KKworV2hlbiByZWNlaXZpbmcgQ1NWIGZpbGVzIGZyb20gZXh0ZXJuYWwgc291cmNlcywgIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvCitwcm90ZWN0IGFnYWluc3QgY2hhbmdlcyBpbiB0aGUgbGF5b3V0IGJ5IHJlc3RyaWN0aW5nIHRvIGtub3duIGhlYWRlcnMgIChhbmQKK3R5cG9zIGluIHRoZSBoZWFkZXIgZmllbGRzKS4KKworIG15ICVrbm93biA9ICgKKyAgICAgInJlY29yZCBrZXkiID0+ICJjX3JlYyIsCisgICAgICJyZWMgaWQiICAgICA9PiAiY19yZWMiLAorICAgICAiaWRfcmVjIiAgICAgPT4gImNfcmVjIiwKKyAgICAgImtvZGUiICAgICAgID0+ICJjb2RlIiwKKyAgICAgImNvZGUiICAgICAgID0+ICJjb2RlIiwKKyAgICAgInZhdWxlIiAgICAgID0+ICJ2YWx1ZSIsCisgICAgICJ2YWx1ZSIgICAgICA9PiAidmFsdWUiLAorICAgICApOworIG15ICRjc3YgPSBUZXh0OjpDU1ZfUFAtPm5ldyAoeyBiaW5hcnkgPT4gMSwgYXV0b19kaWFnID0+IDEgfSk7Cisgb3BlbiBteSAkZmgsICI8IiwgJHNvdXJjZSBvciBkaWUgIiRzb3VyY2U6ICQhIjsKKyAkY3N2LT5oZWFkZXIgKCRmaCwgeyBtdW5nZV9jb2x1bW5fbmFtZXMgPT4gc3ViIHsKKyAgICAgcy9ccyskLy87CisgICAgIHMvXlxzKy8vOworICAgICAka25vd257bGMgJF99IG9yIGRpZSAiVW5rbm93biBjb2x1bW4gJyRfJyBpbiAkc291cmNlIjsKKyAgICAgfX0pOworIHdoaWxlIChteSAkcm93ID0gJGNzdi0+Z2V0bGluZV9ociAoJGZoKSkgeworICAgICBzYXkgam9pbiAiXHQiLCAkcm93LT57Y19yZWN9LCAkcm93LT57Y29kZX0sICRyb3ctPnt2YWx1ZX07CisgICAgIH0KKworPWhlYWQyIGJpbmRfY29sdW1ucworCitUYWtlcyBhIGxpc3Qgb2Ygc2NhbGFyIHJlZmVyZW5jZXMgdG8gYmUgdXNlZCBmb3Igb3V0cHV0IHdpdGggIEw8L3ByaW50PiAgb3IKK3RvIHN0b3JlIGluIHRoZSBmaWVsZHMgZmV0Y2hlZCBieSBMPC9nZXRsaW5lPi4gIFdoZW4geW91IGRvIG5vdCBwYXNzIGVub3VnaAorcmVmZXJlbmNlcyB0byBzdG9yZSB0aGUgZmV0Y2hlZCBmaWVsZHMgaW4sIEw8L2dldGxpbmU+IHdpbGwgZmFpbCB3aXRoIGVycm9yCitDPDMwMDY+LiAgSWYgeW91IHBhc3MgbW9yZSB0aGFuIHRoZXJlIGFyZSBmaWVsZHMgdG8gcmV0dXJuLCAgdGhlIGNvbnRlbnQgb2YKK3RoZSByZW1haW5pbmcgcmVmZXJlbmNlcyBpcyBsZWZ0IHVudG91Y2hlZC4KKworICRjc3YtPmJpbmRfY29sdW1ucyAoXCRjb2RlLCBcJG5hbWUsIFwkcHJpY2UsIFwkZGVzY3JpcHRpb24pOworIHdoaWxlICgkY3N2LT5nZXRsaW5lICgkaW8pKSB7CisgICAgIHByaW50ICJUaGUgcHJpY2Ugb2YgYSAkbmFtZSBpcyBceHsyMGFjfSAkcHJpY2VcbiI7CisgICAgIH0KKworVG8gcmVzZXQgb3IgY2xlYXIgYWxsIGNvbHVtbiBiaW5kaW5nLCBjYWxsIEw8L2JpbmRfY29sdW1ucz4gd2l0aCB0aGUgc2luZ2xlCithcmd1bWVudCBDPHVuZGVmPi4gVGhpcyB3aWxsIGFsc28gY2xlYXIgY29sdW1uIG5hbWVzLgorCisgJGNzdi0+YmluZF9jb2x1bW5zICh1bmRlZik7CisKK0lmIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGF0IGFsbCwgTDwvYmluZF9jb2x1bW5zPiB3aWxsIHJldHVybiB0aGUgbGlzdCBvZgorY3VycmVudCBiaW5kaW5ncyBvciBDPHVuZGVmPiBpZiBubyBiaW5kcyBhcmUgYWN0aXZlLgorCitOb3RlIHRoYXQgaW4gcGFyc2luZyB3aXRoICBDPGJpbmRfY29sdW1ucz4sICB0aGUgZmllbGRzIGFyZSBzZXQgb24gdGhlIGZseS4KK1RoYXQgaW1wbGllcyB0aGF0IGlmIHRoZSB0aGlyZCBmaWVsZCAgb2YgYSByb3cgIGNhdXNlcyBhbiBlcnJvciwgIHRoZSBmaXJzdAordHdvIGZpZWxkcyBhbHJlYWR5IGhhdmUgYmVlbiBhc3NpZ25lZCB0aGUgdmFsdWVzIG9mIHRoZSBjdXJyZW50IHJvdywgIHdoaWxlCit0aGUgcmVzdCBvZiB0aGUgZmllbGRzIHdpbGwgc3RpbGwgaG9sZCB0aGUgdmFsdWVzIG9mIHRoZSBwcmV2aW91cyByb3cuCitJZiB5b3Ugd2FudCB0aGUgcGFyc2VyIHRvIGZhaWwgaW4gdGhlc2UgY2FzZXMsIHVzZSB0aGUgTDxDPHN0cmljdD58L3N0cmljdD4gYXR0cmlidXRlLgorCis9aGVhZDIgZW9mCisKKyAkZW9mID0gJGNzdi0+ZW9mICgpOworCitJZiBMPC9wYXJzZT4gb3IgIEw8L2dldGxpbmU+ICB3YXMgdXNlZCB3aXRoIGFuIElPIHN0cmVhbSwgIHRoaXMgbWV0aG9kIHdpbGwKK3JldHVybiB0cnVlICgxKSBpZiB0aGUgbGFzdCBjYWxsIGhpdCBlbmQgb2YgZmlsZSwgIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybgorZmFsc2UgKCcnKS4gIFRoaXMgaXMgdXNlZnVsIHRvIHNlZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgZmFpbHVyZSBhbmQgZW5kCitvZiBmaWxlLgorCitOb3RlIHRoYXQgaWYgdGhlIHBhcnNpbmcgb2YgdGhlIGxhc3QgbGluZSBjYXVzZWQgYW4gZXJyb3IsICBDPGVvZj4gaXMgc3RpbGwKK3RydWUuICBUaGF0IG1lYW5zIHRoYXQgaWYgeW91IGFyZSBJPG5vdD4gdXNpbmcgTDwvYXV0b19kaWFnPiwgYW4gaWRpb20gbGlrZQorCisgd2hpbGUgKG15ICRyb3cgPSAkY3N2LT5nZXRsaW5lICgkZmgpKSB7CisgICAgICMgLi4uCisgICAgIH0KKyAkY3N2LT5lb2Ygb3IgJGNzdi0+ZXJyb3JfZGlhZzsKKword2lsbCBJPG5vdD4gcmVwb3J0IHRoZSBlcnJvci4gWW91IHdvdWxkIGhhdmUgdG8gY2hhbmdlIHRoYXQgdG8KKworIHdoaWxlIChteSAkcm93ID0gJGNzdi0+Z2V0bGluZSAoJGZoKSkgeworICAgICAjIC4uLgorICAgICB9CisgKyRjc3YtPmVycm9yX2RpYWcgYW5kICRjc3YtPmVycm9yX2RpYWc7CisKKz1oZWFkMiB0eXBlcworCisgJGNzdi0+dHlwZXMgKFxAdHJlZik7CisKK1RoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZm9yY2UgdGhhdCAgKGFsbCkgIGNvbHVtbnMgYXJlIG9mIGEgZ2l2ZW4gdHlwZS4gIEZvcgorZXhhbXBsZSwgaWYgeW91IGhhdmUgYW4gaW50ZWdlciBjb2x1bW4sICB0d28gIGNvbHVtbnMgIHdpdGggIGRvdWJsZXMgIGFuZCBhCitzdHJpbmcgY29sdW1uLCB0aGVuIHlvdSBtaWdodCBkbyBhCisKKyAkY3N2LT50eXBlcyAoW1RleHQ6OkNTVl9QUDo6SVYgKCksCisgICAgICAgICAgICAgICBUZXh0OjpDU1ZfUFA6Ok5WICgpLAorICAgICAgICAgICAgICAgVGV4dDo6Q1NWX1BQOjpOViAoKSwKKyAgICAgICAgICAgICAgIFRleHQ6OkNTVl9QUDo6UFYgKCldKTsKKworQ29sdW1uIHR5cGVzIGFyZSB1c2VkIG9ubHkgZm9yIEk8ZGVjb2Rpbmc+IGNvbHVtbnMgd2hpbGUgcGFyc2luZywgIGluIG90aGVyCit3b3JkcyBieSB0aGUgTDwvcGFyc2U+IGFuZCBMPC9nZXRsaW5lPiBtZXRob2RzLgorCitZb3UgY2FuIHVuc2V0IGNvbHVtbiB0eXBlcyBieSBkb2luZyBhCisKKyAkY3N2LT50eXBlcyAodW5kZWYpOworCitvciBmZXRjaCB0aGUgY3VycmVudCB0eXBlIHNldHRpbmdzIHdpdGgKKworICR0eXBlcyA9ICRjc3YtPnR5cGVzICgpOworCis9b3ZlciA0CisKKz1pdGVtIElWCisKK1NldCBmaWVsZCB0eXBlIHRvIGludGVnZXIuCisKKz1pdGVtIE5WCisKK1NldCBmaWVsZCB0eXBlIHRvIG51bWVyaWMvZmxvYXQuCisKKz1pdGVtIFBWCisKK1NldCBmaWVsZCB0eXBlIHRvIHN0cmluZy4KKworPWJhY2sKKworPWhlYWQyIGZpZWxkcworCisgQGNvbHVtbnMgPSAkY3N2LT5maWVsZHMgKCk7CisKK1RoaXMgbWV0aG9kIHJldHVybnMgdGhlIGlucHV0IHRvICAgTDwvY29tYmluZT4gIG9yIHRoZSByZXN1bHRhbnQgZGVjb21wb3NlZAorZmllbGRzIG9mIGEgc3VjY2Vzc2Z1bCBMPC9wYXJzZT4sIHdoaWNoZXZlciB3YXMgY2FsbGVkIG1vcmUgcmVjZW50bHkuCisKK05vdGUgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZCBhZnRlciB1c2luZyBMPC9nZXRsaW5lPiwgd2hpY2ggZG9lcworbm90IGZpbGwgdGhlIGRhdGEgc3RydWN0dXJlcyByZXR1cm5lZCBieSBMPC9wYXJzZT4uCisKKz1oZWFkMiBtZXRhX2luZm8KKworIEBmbGFncyA9ICRjc3YtPm1ldGFfaW5mbyAoKTsKKworVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgImZsYWdzIiBvZiB0aGUgaW5wdXQgdG8gTDwvY29tYmluZT4gb3IgdGhlIGZsYWdzIG9mCit0aGUgcmVzdWx0YW50ICBkZWNvbXBvc2VkIGZpZWxkcyBvZiAgTDwvcGFyc2U+LCAgIHdoaWNoZXZlciB3YXMgY2FsbGVkIG1vcmUKK3JlY2VudGx5LgorCitGb3IgZWFjaCBmaWVsZCwgIGEgbWV0YV9pbmZvIGZpZWxkIHdpbGwgaG9sZCAgZmxhZ3MgdGhhdCAgaW5mb3JtICBzb21ldGhpbmcKK2Fib3V0ICB0aGUgIGZpZWxkICByZXR1cm5lZCAgYnkgIHRoZSAgTDwvZmllbGRzPiAgbWV0aG9kIG9yICBwYXNzZWQgdG8gIHRoZQorTDwvY29tYmluZT4gbWV0aG9kLiBUaGUgZmxhZ3MgYXJlIGJpdC13aXNlLUM8b3I+J2QgbGlrZToKKworPW92ZXIgMgorCis9aXRlbSBDPCA+MHgwMDAxCisKK1RoZSBmaWVsZCB3YXMgcXVvdGVkLgorCis9aXRlbSBDPCA+MHgwMDAyCisKK1RoZSBmaWVsZCB3YXMgYmluYXJ5LgorCis9YmFjaworCitTZWUgdGhlIEM8aXNfKioqPiBtZXRob2RzIGJlbG93LgorCis9aGVhZDIgaXNfcXVvdGVkCisKKyBteSAkcXVvdGVkID0gJGNzdi0+aXNfcXVvdGVkICgkY29sdW1uX2lkeCk7CisKK1doZXJlICBDPCRjb2x1bW5faWR4PiBpcyB0aGUgICh6ZXJvLWJhc2VkKSAgaW5kZXggb2YgdGhlIGNvbHVtbiBpbiB0aGUgbGFzdAorcmVzdWx0IG9mIEw8L3BhcnNlPi4KKworVGhpcyByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSAgaWYgdGhlIGRhdGEgaW4gdGhlIGluZGljYXRlZCBjb2x1bW4gd2FzIGVuY2xvc2VkCitpbiBMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+IHF1b3Rlcy4gIFRoaXMgbWlnaHQgYmUgaW1wb3J0YW50IGZvciBmaWVsZHMKK3doZXJlIGNvbnRlbnQgQzwsMjAwNzAxMDgsPiBpcyB0byBiZSB0cmVhdGVkIGFzIGEgbnVtZXJpYyB2YWx1ZSwgIGFuZCB3aGVyZQorQzwsIjIwMDcwMTA4Iiw+IGlzIGV4cGxpY2l0bHkgbWFya2VkIGFzIGNoYXJhY3RlciBzdHJpbmcgZGF0YS4KKworVGhpcyBtZXRob2QgaXMgb25seSB2YWxpZCB3aGVuIEw8L2tlZXBfbWV0YV9pbmZvPiBpcyBzZXQgdG8gYSB0cnVlIHZhbHVlLgorCis9aGVhZDIgaXNfYmluYXJ5CisKKyBteSAkYmluYXJ5ID0gJGNzdi0+aXNfYmluYXJ5ICgkY29sdW1uX2lkeCk7CisKK1doZXJlICBDPCRjb2x1bW5faWR4PiBpcyB0aGUgICh6ZXJvLWJhc2VkKSAgaW5kZXggb2YgdGhlIGNvbHVtbiBpbiB0aGUgbGFzdAorcmVzdWx0IG9mIEw8L3BhcnNlPi4KKworVGhpcyByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSBpZiB0aGUgZGF0YSBpbiB0aGUgaW5kaWNhdGVkIGNvbHVtbiBjb250YWluZWQgYW55CitieXRlIGluIHRoZSByYW5nZSBDPFtceDAwLVx4MDgsXHgxMC1ceDFGLFx4N0YtXHhGRl0+LgorCitUaGlzIG1ldGhvZCBpcyBvbmx5IHZhbGlkIHdoZW4gTDwva2VlcF9tZXRhX2luZm8+IGlzIHNldCB0byBhIHRydWUgdmFsdWUuCisKKz1oZWFkMiBpc19taXNzaW5nCisKKyBteSAkbWlzc2luZyA9ICRjc3YtPmlzX21pc3NpbmcgKCRjb2x1bW5faWR4KTsKKworV2hlcmUgIEM8JGNvbHVtbl9pZHg+IGlzIHRoZSAgKHplcm8tYmFzZWQpICBpbmRleCBvZiB0aGUgY29sdW1uIGluIHRoZSBsYXN0CityZXN1bHQgb2YgTDwvZ2V0bGluZV9ocj4uCisKKyAkY3N2LT5rZWVwX21ldGFfaW5mbyAoMSk7Cisgd2hpbGUgKG15ICRociA9ICRjc3YtPmdldGxpbmVfaHIgKCRmaCkpIHsKKyAgICAgJGNzdi0+aXNfbWlzc2luZyAoMCkgYW5kIG5leHQ7ICMgVGhpcyB3YXMgYW4gZW1wdHkgbGluZQorICAgICB9CisKK1doZW4gdXNpbmcgIEw8L2dldGxpbmVfaHI+LCAgaXQgaXMgaW1wb3NzaWJsZSB0byB0ZWxsIGlmIHRoZSAgcGFyc2VkIGZpZWxkcworYXJlIEM8dW5kZWY+IGJlY2F1c2UgdGhleSB3aGVyZSBub3QgZmlsbGVkIGluIHRoZSBDPENTVj4gc3RyZWFtICBvciBiZWNhdXNlCit0aGV5IHdlcmUgbm90IHJlYWQgYXQgYWxsLCBhcyBCPGFsbD4gdGhlIGZpZWxkcyBkZWZpbmVkIGJ5IEw8L2NvbHVtbl9uYW1lcz4KK2FyZSBzZXQgaW4gdGhlIGhhc2gtcmVmLiAgICBJZiB5b3Ugc3RpbGwgbmVlZCB0byBrbm93IGlmIGFsbCBmaWVsZHMgaW4gZWFjaAorcm93IGFyZSBwcm92aWRlZCwgeW91IHNob3VsZCBlbmFibGUgTDxDPGtlZXBfbWV0YV9pbmZvPnwva2VlcF9tZXRhX2luZm8+IHNvCit5b3UgY2FuIGNoZWNrIHRoZSBmbGFncy4KKworSWYgIEw8QzxrZWVwX21ldGFfaW5mbz58L2tlZXBfbWV0YV9pbmZvPiAgaXMgQzxmYWxzZT4sICBDPGlzX21pc3Npbmc+ICB3aWxsCithbHdheXMgcmV0dXJuIEM8dW5kZWY+LCByZWdhcmRsZXNzIG9mIEM8JGNvbHVtbl9pZHg+IGJlaW5nIHZhbGlkIG9yIG5vdC4gSWYKK3RoaXMgYXR0cmlidXRlIGlzIEM8dHJ1ZT4gaXQgd2lsbCByZXR1cm4gZWl0aGVyIEM8MD4gKHRoZSBmaWVsZCBpcyBwcmVzZW50KQorb3IgQzwxPiAodGhlIGZpZWxkIGlzIG1pc3NpbmcpLgorCitBIHNwZWNpYWwgY2FzZSBpcyB0aGUgZW1wdHkgbGluZS4gIElmIHRoZSBsaW5lIGlzIGNvbXBsZXRlbHkgZW1wdHkgLSAgYWZ0ZXIKK2RlYWxpbmcgd2l0aCB0aGUgZmxhZ3MgLSB0aGlzIGlzIHN0aWxsIGEgdmFsaWQgQ1NWIGxpbmU6ICBpdCBpcyBhIHJlY29yZCBvZgoranVzdCBvbmUgc2luZ2xlIGVtcHR5IGZpZWxkLiBIb3dldmVyLCBpZiBDPGtlZXBfbWV0YV9pbmZvPiBpcyBzZXQsIGludm9raW5nCitDPGlzX21pc3Npbmc+IHdpdGggaW5kZXggQzwwPiB3aWxsIG5vdyByZXR1cm4gdHJ1ZS4KKworPWhlYWQyIHN0YXR1cworCisgJHN0YXR1cyA9ICRjc3YtPnN0YXR1cyAoKTsKKworVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBsYXN0IGludm9rZWQgTDwvY29tYmluZT4gb3IgTDwvcGFyc2U+CitjYWxsLiBTdGF0dXMgaXMgc3VjY2VzcyAodHJ1ZTogQzwxPikgb3IgZmFpbHVyZSAoZmFsc2U6IEM8dW5kZWY+IG9yIEM8MD4pLgorCis9aGVhZDIgZXJyb3JfaW5wdXQKKworICRiYWRfYXJndW1lbnQgPSAkY3N2LT5lcnJvcl9pbnB1dCAoKTsKKworVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZXJyb25lb3VzIGFyZ3VtZW50IChpZiBpdCBleGlzdHMpIG9mIEw8L2NvbWJpbmU+IG9yCitMPC9wYXJzZT4sICB3aGljaGV2ZXIgd2FzIGNhbGxlZCBtb3JlIHJlY2VudGx5LiAgSWYgdGhlIGxhc3QgaW52b2NhdGlvbiB3YXMKK3N1Y2Nlc3NmdWwsIEM8ZXJyb3JfaW5wdXQ+IHdpbGwgcmV0dXJuIEM8dW5kZWY+LgorCis9aGVhZDIgZXJyb3JfZGlhZworCisgVGV4dDo6Q1NWX1BQLT5lcnJvcl9kaWFnICgpOworICRjc3YtPmVycm9yX2RpYWcgKCk7CisgJGVycm9yX2NvZGUgICAgICAgICAgICAgICA9IDAgICsgJGNzdi0+ZXJyb3JfZGlhZyAoKTsKKyAkZXJyb3Jfc3RyICAgICAgICAgICAgICAgID0gIiIgLiAkY3N2LT5lcnJvcl9kaWFnICgpOworICgkY2RlLCAkc3RyLCAkcG9zLCAkcmVjLCAkZmxkKSA9ICRjc3YtPmVycm9yX2RpYWcgKCk7CisKK0lmIChhbmQgb25seSBpZikgYW4gZXJyb3Igb2NjdXJyZWQsICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgIHRoZSBkaWFnbm9zdGljcworb2YgdGhhdCBlcnJvci4KKworSWYgY2FsbGVkIGluIHZvaWQgY29udGV4dCwgIHRoaXMgd2lsbCBwcmludCB0aGUgaW50ZXJuYWwgZXJyb3IgY29kZSBhbmQgdGhlCithc3NvY2lhdGVkIGVycm9yIG1lc3NhZ2UgdG8gU1RERVJSLgorCitJZiBjYWxsZWQgaW4gbGlzdCBjb250ZXh0LCAgdGhpcyB3aWxsIHJldHVybiAgdGhlIGVycm9yIGNvZGUgIGFuZCB0aGUgZXJyb3IKK21lc3NhZ2UgaW4gdGhhdCBvcmRlci4gIElmIHRoZSBsYXN0IGVycm9yIHdhcyBmcm9tIHBhcnNpbmcsIHRoZSByZXN0IG9mIHRoZQordmFsdWVzIHJldHVybmVkIGFyZSBhIGJlc3QgZ3Vlc3MgYXQgdGhlIGxvY2F0aW9uICB3aXRoaW4gdGhlIGxpbmUgIHRoYXQgd2FzCitiZWluZyBwYXJzZWQuIFRoZWlyIHZhbHVlcyBhcmUgMS1iYXNlZC4gIFRoZSBwb3NpdGlvbiBjdXJyZW50bHkgaXMgaW5kZXggb2YKK3RoZSBieXRlIGF0IHdoaWNoIHRoZSBwYXJzaW5nIGZhaWxlZCBpbiB0aGUgY3VycmVudCByZWNvcmQuIEl0IG1pZ2h0IGNoYW5nZQordG8gYmUgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpbiBhIGxhdGVyIHJlbGVhc2UuIFRoZSByZWNvcmRzIGlzCit0aGUgaW5kZXggb2YgdGhlIHJlY29yZCBwYXJzZWQgYnkgdGhlIGNzdiBpbnN0YW5jZS4gVGhlIGZpZWxkIG51bWJlciBpcyB0aGUKK2luZGV4IG9mIHRoZSBmaWVsZCB0aGUgcGFyc2VyIHRoaW5rcyBpdCBpcyBjdXJyZW50bHkgIHRyeWluZyB0byAgcGFyc2UuIFNlZQorRjxleGFtcGxlcy9jc3YtY2hlY2s+IGZvciBob3cgdGhpcyBjYW4gYmUgdXNlZC4KKworSWYgY2FsbGVkIGluICBzY2FsYXIgY29udGV4dCwgIGl0IHdpbGwgcmV0dXJuICB0aGUgZGlhZ25vc3RpY3MgIGluIGEgc2luZ2xlCitzY2FsYXIsIGEtbGEgQzwkIT4uICBJdCB3aWxsIGNvbnRhaW4gdGhlIGVycm9yIGNvZGUgaW4gbnVtZXJpYyBjb250ZXh0LCBhbmQKK3RoZSBkaWFnbm9zdGljcyBtZXNzYWdlIGluIHN0cmluZyBjb250ZXh0LgorCitXaGVuIGNhbGxlZCBhcyBhIGNsYXNzIG1ldGhvZCBvciBhICBkaXJlY3QgZnVuY3Rpb24gY2FsbCwgIHRoZSAgZGlhZ25vc3RpY3MKK2FyZSB0aGF0IG9mIHRoZSBsYXN0IEw8L25ldz4gY2FsbC4KKworPWhlYWQyIHJlY29yZF9udW1iZXIKKworICRyZWNubyA9ICRjc3YtPnJlY29yZF9udW1iZXIgKCk7CisKK1JldHVybnMgdGhlIHJlY29yZHMgcGFyc2VkIGJ5IHRoaXMgY3N2IGluc3RhbmNlLiAgVGhpcyB2YWx1ZSBzaG91bGQgYmUgbW9yZQorYWNjdXJhdGUgdGhhbiBDPCQuPiB3aGVuIGVtYmVkZGVkIG5ld2xpbmVzIGNvbWUgaW4gcGxheS4gUmVjb3JkcyB3cml0dGVuIGJ5Cit0aGlzIGluc3RhbmNlIGFyZSBub3QgY291bnRlZC4KKworPWhlYWQyIFNldERpYWcKKworICRjc3YtPlNldERpYWcgKDApOworCitVc2UgdG8gcmVzZXQgdGhlIGRpYWdub3N0aWNzIGlmIHlvdSBhcmUgZGVhbGluZyB3aXRoIGVycm9ycy4KKworPWhlYWQxIEZVTkNUSU9OUworCitUaGlzIHdob2xlIHNlY3Rpb24gaXMgYWxzbyB0YWtlbiBmcm9tIFRleHQ6OkNTVl9YUy4KKworPWhlYWQyIGNzdgorCitUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBvcnRlZCBieSBkZWZhdWx0IGFuZCBzaG91bGQgYmUgZXhwbGljaXRseSByZXF1ZXN0ZWQ6CisKKyB1c2UgVGV4dDo6Q1NWX1BQIHF3KCBjc3YgKTsKKworVGhpcyBpcyBhbiBoaWdoLWxldmVsIGZ1bmN0aW9uIHRoYXQgYWltcyBhdCBzaW1wbGUgKHVzZXIpIGludGVyZmFjZXMuICBUaGlzCitjYW4gYmUgdXNlZCB0byByZWFkL3BhcnNlIGEgQzxDU1Y+IGZpbGUgb3Igc3RyZWFtICh0aGUgZGVmYXVsdCBiZWhhdmlvcikgb3IKK3RvIHByb2R1Y2UgYSBmaWxlIG9yIHdyaXRlIHRvIGEgc3RyZWFtIChkZWZpbmUgdGhlICBDPG91dD4gIGF0dHJpYnV0ZSkuICBJdAorcmV0dXJucyBhbiBhcnJheS0gb3IgaGFzaC1yZWZlcmVuY2Ugb24gcGFyc2luZyAob3IgQzx1bmRlZj4gb24gZmFpbCkgb3IgdGhlCitudW1lcmljIHZhbHVlIG9mICBMPC9lcnJvcl9kaWFnPiAgb24gd3JpdGluZy4gIFdoZW4gdGhpcyBmdW5jdGlvbiBmYWlscyB5b3UKK2NhbiBnZXQgdG8gdGhlIGVycm9yIHVzaW5nIHRoZSBjbGFzcyBjYWxsIHRvIEw8L2Vycm9yX2RpYWc+CisKKyBteSAkYW9hID0gY3N2IChpbiA9PiAidGVzdC5jc3YiKSBvcgorICAgICBkaWUgVGV4dDo6Q1NWX1BQLT5lcnJvcl9kaWFnOworCitUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBhcmd1bWVudHMgYXMga2V5LXZhbHVlIHBhaXJzLiBUaGlzIGNhbiBiZSBwYXNzZWQgYXMKK2EgbGlzdCBvciBhcyBhbiBhbm9ueW1vdXMgaGFzaDoKKworIG15ICRhb2EgPSBjc3YgKCAgaW4gPT4gInRlc3QuY3N2Iiwgc2VwX2NoYXIgPT4gIjsiKTsKKyBteSAkYW9oID0gY3N2ICh7IGluID0+ICRmaCwgaGVhZGVycyA9PiAiYXV0byIgfSk7CisKK1RoZSBhcmd1bWVudHMgcGFzc2VkIGNvbnNpc3Qgb2YgdHdvIHBhcnRzOiAgdGhlIGFyZ3VtZW50cyB0byBMPC9jc3Y+IGl0c2VsZgorYW5kIHRoZSBvcHRpb25hbCBhdHRyaWJ1dGVzIHRvIHRoZSAgQzxDU1Y+ICBvYmplY3QgdXNlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uCithcyBlbnVtZXJhdGVkIGFuZCBleHBsYWluZWQgaW4gTDwvbmV3Pi4KKworSWYgbm90IG92ZXJyaWRkZW4sIHRoZSBkZWZhdWx0IG9wdGlvbiB1c2VkIGZvciBDU1YgaXMKKworIGF1dG9fZGlhZyAgID0+IDEKKyBlc2NhcGVfbnVsbCA9PiAwCisKK1RoZSBvcHRpb24gdGhhdCBpcyBhbHdheXMgc2V0IGFuZCBjYW5ub3QgYmUgYWx0ZXJlZCBpcworCisgYmluYXJ5ICAgICAgPT4gMQorCitBcyB0aGlzIGZ1bmN0aW9uIHdpbGwgbGlrZWx5IGJlIHVzZWQgaW4gb25lLWxpbmVycywgIGl0IGFsbG93cyAgQzxxdW90ZT4gdG8KK2JlIGFiYnJldmlhdGVkIGFzIEM8cXVvPiwgIGFuZCAgQzxlc2NhcGVfY2hhcj4gdG8gYmUgYWJicmV2aWF0ZWQgYXMgIEM8ZXNjPgorb3IgQzxlc2NhcGU+LgorCitBbHRlcm5hdGl2ZSBpbnZvY2F0aW9uczoKKworIG15ICRhb2EgPSBUZXh0OjpDU1ZfUFA6OmNzdiAoaW4gPT4gImZpbGUuY3N2Iik7CisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKCk7CisgbXkgJGFvYSA9ICRjc3YtPmNzdiAoaW4gPT4gImZpbGUuY3N2Iik7CisKK0luIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIGFyZSB1c2VkIGZyb20gdGhlIGV4aXN0aW5nIG9iamVjdAorYW5kIHRoZSBhdHRyaWJ1dGUgYXJndW1lbnRzIGluIHRoZSBmdW5jdGlvbiBjYWxsIGFyZSBpZ25vcmVkOgorCisgbXkgJGNzdiA9IFRleHQ6OkNTVl9QUC0+bmV3ICh7IHNlcF9jaGFyID0+ICI7IiB9KTsKKyBteSAkYW9oID0gJGNzdi0+Y3N2IChpbiA9PiAiZmlsZS5jc3YiLCBib20gPT4gMSk7CisKK3dpbGwgcGFyc2UgdXNpbmcgQzw7PiBhcyBDPHNlcF9jaGFyPiwgbm90IEM8LD4uCisKKz1oZWFkMyBpbgorCitVc2VkIHRvIHNwZWNpZnkgdGhlIHNvdXJjZS4gIEM8aW4+IGNhbiBiZSBhIGZpbGUgbmFtZSAoZS5nLiBDPCJmaWxlLmNzdiI+KSwKK3doaWNoIHdpbGwgYmUgIG9wZW5lZCBmb3IgcmVhZGluZyAgYW5kIGNsb3NlZCB3aGVuIGZpbmlzaGVkLCAgYSBmaWxlIGhhbmRsZQorKGUuZy4gIEM8JGZoPiBvciBDPEZIPiksICBhIHJlZmVyZW5jZSB0byBhIGdsb2IgKGUuZy4gQzxcKkFSR1Y+KSwgIHRoZSBnbG9iCitpdHNlbGYgKGUuZy4gQzwqU1RESU4+KSwgb3IgYSByZWZlcmVuY2UgdG8gYSBzY2FsYXIgKGUuZy4gQzxccXsxLDIsImNzdiJ9PikuCisKK1doZW4gdXNlZCB3aXRoIEw8L291dD4sIEM8aW4+IHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBhIENTViBzdHJ1Y3R1cmUgKEFvQQorb3IgQW9IKSAgb3IgYSBDT0RFLXJlZiB0aGF0IHJldHVybnMgYW4gYXJyYXktcmVmZXJlbmNlIG9yIGEgaGFzaC1yZWZlcmVuY2UuCitUaGUgY29kZS1yZWYgd2lsbCBiZSBpbnZva2VkIHdpdGggbm8gYXJndW1lbnRzLgorCisgbXkgJGFvYSA9IGNzdiAoaW4gPT4gImZpbGUuY3N2Iik7CisKKyBvcGVuIG15ICRmaCwgIjwiLCAiZmlsZS5jc3YiOworIG15ICRhb2EgPSBjc3YgKGluID0+ICRmaCk7CisKKyBteSAkY3N2ID0gWyBbcXcoIEZvbyBCYXIgKV0sIFsgMSwgMiBdLCBbIDIsIDMgXV07CisgbXkgJGVyciA9IGNzdiAoaW4gPT4gJGNzdiwgb3V0ID0+ICJmaWxlLmNzdiIpOworCitJZiBjYWxsZWQgaW4gdm9pZCBjb250ZXh0IHdpdGhvdXQgdGhlIEw8L291dD4gYXR0cmlidXRlLCB0aGUgcmVzdWx0aW5nIHJlZgord2lsbCBiZSB1c2VkIGFzIGlucHV0IHRvIGEgc3Vic2VxdWVudCBjYWxsIHRvIGNzdjoKKworIGNzdiAoaW4gPT4gImZpbGUuY3N2IiwgZmlsdGVyID0+IHsgMiA9PiBzdWIgeyBsZW5ndGggPiAyIH19KQorCit3aWxsIGJlIGEgc2hvcnRjdXQgdG8KKworIGNzdiAoaW4gPT4gY3N2IChpbiA9PiAiZmlsZS5jc3YiLCBmaWx0ZXIgPT4geyAyID0+IHN1YiB7IGxlbmd0aCA+IDIgfX0pKQorCit3aGVyZSwgaW4gdGhlIGFic2VuY2Ugb2YgdGhlIEM8b3V0PiBhdHRyaWJ1dGUsIHRoaXMgaXMgYSBzaG9ydGN1dCB0bworCisgY3N2IChpbiAgPT4gY3N2IChpbiA9PiAiZmlsZS5jc3YiLCBmaWx0ZXIgPT4geyAyID0+IHN1YiB7IGxlbmd0aCA+IDIgfX0pLAorICAgICAgb3V0ID0+ICpTVERPVVQpCisKKz1oZWFkMyBvdXQKKworSW4gb3V0cHV0IG1vZGUsIHRoZSBkZWZhdWx0IENTViBvcHRpb25zIHdoZW4gcHJvZHVjaW5nIENTViBhcmUKKworIGVvbCAgICAgICA9PiAiXHJcbiIKKworVGhlIEw8L2ZyYWdtZW50PiBhdHRyaWJ1dGUgaXMgaWdub3JlZCBpbiBvdXRwdXQgbW9kZS4KKworQzxvdXQ+IGNhbiBiZSBhIGZpbGUgbmFtZSAgKGUuZy4gIEM8ImZpbGUuY3N2Ij4pLCAgd2hpY2ggd2lsbCBiZSBvcGVuZWQgZm9yCit3cml0aW5nIGFuZCBjbG9zZWQgd2hlbiBmaW5pc2hlZCwgIGEgZmlsZSBoYW5kbGUgKGUuZy4gQzwkZmg+IG9yIEM8Rkg+KSwgIGEKK3JlZmVyZW5jZSB0byBhIGdsb2IgKGUuZy4gQzxcKlNURE9VVD4pLCBvciB0aGUgZ2xvYiBpdHNlbGYgKGUuZy4gQzwqU1RET1VUPikuCisKKyBjc3YgKGluID0+IHN1YiB7ICRzdGgtPmZldGNoIH0sICAgICAgICAgICAgb3V0ID0+ICJkdW1wLmNzdiIpOworIGNzdiAoaW4gPT4gc3ViIHsgJHN0aC0+ZmV0Y2hyb3dfaGFzaHJlZiB9LCBvdXQgPT4gImR1bXAuY3N2IiwKKyAgICAgIGhlYWRlcnMgPT4gJHN0aC0+e05BTUVfbGN9KTsKKworV2hlbiBhIGNvZGUtcmVmIGlzIHVzZWQgZm9yIEM8aW4+LCB0aGUgb3V0cHV0IGlzIGdlbmVyYXRlZCAgcGVyIGludm9jYXRpb24sCitzbyBubyBidWZmZXJpbmcgaXMgaW52b2x2ZWQuIFRoaXMgaW1wbGllcyB0aGF0IHRoZXJlIGlzIG5vIHNpemUgcmVzdHJpY3Rpb24KK29uIHRoZSBudW1iZXIgb2YgcmVjb3Jkcy4gVGhlIEM8Y3N2PiBmdW5jdGlvbiBlbmRzIHdoZW4gdGhlIGNvZGVyZWYgcmV0dXJucworYSBmYWxzZSB2YWx1ZS4KKworPWhlYWQzIGVuY29kaW5nCisKK0lmIHBhc3NlZCwgIGl0IHNob3VsZCBiZSBhbiBlbmNvZGluZyBhY2NlcHRlZCBieSB0aGUgIEM8OmVuY29kaW5nKCk+IG9wdGlvbgordG8gQzxvcGVuPi4gVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZS4gVGhpcyBhdHRyaWJ1dGUgZG9lcyBub3Qgd29yayBpbiBwZXJsCis1LjYueC4gIEM8ZW5jb2Rpbmc+IGNhbiBiZSBhYmJyZXZpYXRlZCB0byBDPGVuYz4gZm9yIGVhc2Ugb2YgdXNlIGluIGNvbW1hbmQKK2xpbmUgaW52b2NhdGlvbnMuCisKK0lmIEM8ZW5jb2Rpbmc+IGlzIHNldCB0byB0aGUgbGl0ZXJhbCB2YWx1ZSBDPCJhdXRvIj4sIHRoZSBtZXRob2QgTDwvaGVhZGVyPgord2lsbCBiZSBpbnZva2VkIG9uIHRoZSBvcGVuZWQgc3RyZWFtIHRvIGNoZWNrIGlmIHRoZXJlIGlzIGEgQk9NIGFuZCBzZXQgdGhlCitlbmNvZGluZyBhY2NvcmRpbmdseS4gICBUaGlzIGlzIGVxdWFsIHRvIHBhc3NpbmcgYSB0cnVlIHZhbHVlIGluIHRoZSBvcHRpb24KK0w8QzxkZXRlY3RfYm9tPnwvZGV0ZWN0X2JvbT4uCisKKz1oZWFkMyBkZXRlY3RfYm9tCisKK0lmICBDPGRldGVjdF9ib20+ICBpcyBnaXZlbiwgdGhlIG1ldGhvZCAgTDwvaGVhZGVyPiAgd2lsbCBiZSBpbnZva2VkIG9uIHRoZQorb3BlbmVkIHN0cmVhbSB0byBjaGVjayBpZiB0aGVyZSBpcyBhIEJPTSBhbmQgc2V0IHRoZSBlbmNvZGluZyBhY2NvcmRpbmdseS4KKworQzxkZXRlY3RfYm9tPiBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gQzxib20+LgorCitUaGlzIGlzIHRoZSBzYW1lIGFzIHNldHRpbmcgTDxDPGVuY29kaW5nPnwvZW5jb2Rpbmc+IHRvIEM8ImF1dG8iPi4KKworTm90ZSB0aGF0IGFzIEw8L2hlYWRlcj4gaXMgaW52b2tlZCwgaXRzIGRlZmF1bHQgaXMgdG8gYWxzbyBzZXQgdGhlIGhlYWRlcnMuCisKKz1oZWFkMyBoZWFkZXJzCisKK0lmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBnaXZlbiwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcHJvZHVjZSBhbiBhcnJheQorb2YgYXJyYXlzLgorCitJZiBDPGhlYWRlcnM+IGlzIHN1cHBsaWVkLCAgaXQgc2hvdWxkIGJlIGFuIGFub255bW91cyBsaXN0IG9mIGNvbHVtbiBuYW1lcywKK2FuIGFub255bW91cyBoYXNocmVmLCBhIGNvZGVyZWYsIG9yIGEgbGl0ZXJhbCBmbGFnOiAgQzxhdXRvPiwgQzxsYz4sIEM8dWM+LAorb3IgQzxza2lwPi4KKworPW92ZXIgMgorCis9aXRlbSBza2lwCisKK1doZW4gQzxza2lwPiBpcyB1c2VkLCB0aGUgaGVhZGVyIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCisKKyBteSAkYW9hID0gY3N2IChpbiA9PiAkZmgsIGhlYWRlcnMgPT4gInNraXAiKTsKKworPWl0ZW0gYXV0bworCitJZiBDPGF1dG8+IGlzIHVzZWQsIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBDPENTVj4gc291cmNlIHdpbGwgYmUgcmVhZCBhcyB0aGUKK2xpc3Qgb2YgZmllbGQgaGVhZGVycyBhbmQgdXNlZCB0byBwcm9kdWNlIGFuIGFycmF5IG9mIGhhc2hlcy4KKworIG15ICRhb2ggPSBjc3YgKGluID0+ICRmaCwgaGVhZGVycyA9PiAiYXV0byIpOworCis9aXRlbSBsYworCitJZiBDPGxjPiBpcyB1c2VkLCAgdGhlIGZpcnN0IGxpbmUgb2YgdGhlICBDPENTVj4gc291cmNlIHdpbGwgYmUgcmVhZCBhcyB0aGUKK2xpc3Qgb2YgZmllbGQgaGVhZGVycyBtYXBwZWQgdG8gIGxvd2VyIGNhc2UgYW5kIHVzZWQgdG8gcHJvZHVjZSBhbiBhcnJheSBvZgoraGFzaGVzLiBUaGlzIGlzIGEgdmFyaWF0aW9uIG9mIEM8YXV0bz4uCisKKyBteSAkYW9oID0gY3N2IChpbiA9PiAkZmgsIGhlYWRlcnMgPT4gImxjIik7CisKKz1pdGVtIHVjCisKK0lmIEM8dWM+IGlzIHVzZWQsICB0aGUgZmlyc3QgbGluZSBvZiB0aGUgIEM8Q1NWPiBzb3VyY2Ugd2lsbCBiZSByZWFkIGFzIHRoZQorbGlzdCBvZiBmaWVsZCBoZWFkZXJzIG1hcHBlZCB0byAgdXBwZXIgY2FzZSBhbmQgdXNlZCB0byBwcm9kdWNlIGFuIGFycmF5IG9mCitoYXNoZXMuIFRoaXMgaXMgYSB2YXJpYXRpb24gb2YgQzxhdXRvPi4KKworIG15ICRhb2ggPSBjc3YgKGluID0+ICRmaCwgaGVhZGVycyA9PiAidWMiKTsKKworPWl0ZW0gQ09ERQorCitJZiBhIGNvZGVyZWYgaXMgdXNlZCwgIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSAgQzxDU1Y+IHNvdXJjZSB3aWxsIGJlIHJlYWQgYXMKK3RoZSBsaXN0IG9mIG1hbmdsZWQgZmllbGQgaGVhZGVycyBpbiB3aGljaCBlYWNoIGZpZWxkIGlzIHBhc3NlZCBhcyB0aGUgb25seQorYXJndW1lbnQgdG8gdGhlIGNvZGVyZWYuIFRoaXMgbGlzdCBpcyB1c2VkIHRvIHByb2R1Y2UgYW4gYXJyYXkgb2YgaGFzaGVzLgorCisgbXkgJGFvaCA9IGNzdiAoaW4gICAgICA9PiAkZmgsCisgICAgICAgICAgICAgICAgaGVhZGVycyA9PiBzdWIgeyBsYyAoJF9bMF0pID1+IHMva29kZS9jb2RlL2dyIH0pOworCit0aGlzIGV4YW1wbGUgaXMgYSB2YXJpYXRpb24gb2YgdXNpbmcgQzxsYz4gd2hlcmUgYWxsIG9jY3VycmVuY2VzIG9mIEM8a29kZT4KK2FyZSByZXBsYWNlZCB3aXRoIEM8Y29kZT4uCisKKz1pdGVtIEFSUkFZCisKK0lmICBDPGhlYWRlcnM+ICBpcyBhbiBhbm9ueW1vdXMgbGlzdCwgIHRoZSBlbnRyaWVzIGluIHRoZSBsaXN0IHdpbGwgYmUgdXNlZAorYXMgZmllbGQgbmFtZXMuIFRoZSBmaXJzdCBsaW5lIGlzIGNvbnNpZGVyZWQgZGF0YSBpbnN0ZWFkIG9mIGhlYWRlcnMuCisKKyBteSAkYW9oID0gY3N2IChpbiA9PiAkZmgsIGhlYWRlcnMgPT4gW3F3KCBGb28gQmFyICldKTsKKyBjc3YgKGluID0+ICRhb2EsIG91dCA9PiAkZmgsIGhlYWRlcnMgPT4gW3F3KCBjb2RlIGRlc2NyaXB0aW9uIHByaWNlICldKTsKKworPWl0ZW0gSEFTSAorCitJZiBDPGhlYWRlcnM+IGlzIGFuIGhhc2ggcmVmZXJlbmNlLCB0aGlzIGltcGxpZXMgQzxhdXRvPiwgYnV0IGhlYWRlciBmaWVsZHMKK2ZvciB0aGF0IGV4aXN0IGFzIGtleSBpbiB0aGUgaGFzaHJlZiB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB2YWx1ZSBmb3IgdGhhdAora2V5LiBHaXZlbiBhIENTViBmaWxlIGxpa2UKKworIHBvc3Qta29kZSxjaXR5LG5hbWUsaWQgbnVtYmVyLGZ1YmJsZQorIDEyMzRBQSxEdWNrc3RhZCxEb25hbGQsMTMsIlgzMTNERiIKKwordXNpbmcKKworIGNzdiAoaGVhZGVycyA9PiB7ICJwb3N0LWtvZGUiID0+ICJwYyIsICJpZCBudW1iZXIiID0+ICJJRCIgfSwgLi4uCisKK3dpbGwgcmV0dXJuIGFuIGVudHJ5IGxpa2UKKworIHsgcGMgICAgID0+ICIxMjM0QUEiLAorICAgY2l0eSAgID0+ICJEdWNrc3RhZCIsCisgICBuYW1lICAgPT4gIkRvbmFsZCIsCisgICBJRCAgICAgPT4gIjEzIiwKKyAgIGZ1YmJsZSA9PiAiWDMxM0RGIiwKKyAgIH0KKworPWJhY2sKKworU2VlIGFsc28gTDxDPG11bmdlX2NvbHVtbl9uYW1lcz58L211bmdlX2NvbHVtbl9uYW1lcz4gYW5kCitMPEM8c2V0X2NvbHVtbl9uYW1lcz58L3NldF9jb2x1bW5fbmFtZXM+LgorCis9aGVhZDMgbXVuZ2VfY29sdW1uX25hbWVzCisKK0lmIEM8bXVuZ2VfY29sdW1uX25hbWVzPiBpcyBzZXQsICB0aGUgbWV0aG9kICBMPC9oZWFkZXI+ICBpcyBpbnZva2VkIG9uIHRoZQorb3BlbmVkIHN0cmVhbSB3aXRoIGFsbCBtYXRjaGluZyBhcmd1bWVudHMgdG8gZGV0ZWN0IGFuZCBzZXQgdGhlIGhlYWRlcnMuCisKK0M8bXVuZ2VfY29sdW1uX25hbWVzPiBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gQzxtdW5nZT4uCisKKz1oZWFkMyBrZXkKKworSWYgcGFzc2VkLCAgd2lsbCBkZWZhdWx0ICBMPEM8aGVhZGVycz58L2hlYWRlcnM+ICB0byBDPCJhdXRvIj4gYW5kIHJldHVybiBhCitoYXNocmVmIGluc3RlYWQgb2YgYW4gYXJyYXkgb2YgaGFzaGVzLgorCisgbXkgJHJlZiA9IGNzdiAoaW4gPT4gInRlc3QuY3N2Iiwga2V5ID0+ICJjb2RlIik7CisKK3dpdGggdGVzdC5jc3YgbGlrZQorCisgY29kZSxwcm9kdWN0LHByaWNlLGNvbG9yCisgMSxwYyw4NTAsZ3JheQorIDIsa2V5Ym9hcmQsMTIsd2hpdGUKKyAzLG1vdXNlLDUsYmxhY2sKKword2lsbCByZXR1cm4KKworICB7IDEgICA9PiB7CisgICAgICAgIGNvZGUgICAgPT4gMSwKKyAgICAgICAgY29sb3IgICA9PiAnZ3JheScsCisgICAgICAgIHByaWNlICAgPT4gODUwLAorICAgICAgICBwcm9kdWN0ID0+ICdwYycKKyAgICAgICAgfSwKKyAgICAyICAgPT4geworICAgICAgICBjb2RlICAgID0+IDIsCisgICAgICAgIGNvbG9yICAgPT4gJ3doaXRlJywKKyAgICAgICAgcHJpY2UgICA9PiAxMiwKKyAgICAgICAgcHJvZHVjdCA9PiAna2V5Ym9hcmQnCisgICAgICAgIH0sCisgICAgMyAgID0+IHsKKyAgICAgICAgY29kZSAgICA9PiAzLAorICAgICAgICBjb2xvciAgID0+ICdibGFjaycsCisgICAgICAgIHByaWNlICAgPT4gNSwKKyAgICAgICAgcHJvZHVjdCA9PiAnbW91c2UnCisgICAgICAgIH0KKyAgICB9CisKKz1oZWFkMyBmcmFnbWVudAorCitPbmx5IG91dHB1dCB0aGUgZnJhZ21lbnQgYXMgZGVmaW5lZCBpbiB0aGUgTDwvZnJhZ21lbnQ+IG1ldGhvZC4gVGhpcyBvcHRpb24KK2lzIGlnbm9yZWQgd2hlbiBJPGdlbmVyYXRpbmc+IEM8Q1NWPi4gU2VlIEw8L291dD4uCisKK0NvbWJpbmluZyBhbGwgb2YgdGhlbSBjb3VsZCBnaXZlIHNvbWV0aGluZyBsaWtlCisKKyB1c2UgVGV4dDo6Q1NWX1BQIHF3KCBjc3YgKTsKKyBteSAkYW9oID0gY3N2ICgKKyAgICAgaW4gICAgICAgPT4gInRlc3QudHh0IiwKKyAgICAgZW5jb2RpbmcgPT4gInV0Zi04IiwKKyAgICAgaGVhZGVycyAgPT4gImF1dG8iLAorICAgICBzZXBfY2hhciA9PiAifCIsCisgICAgIGZyYWdtZW50ID0+ICJyb3c9Mzs2LTk7MTUtKiIsCisgICAgICk7Cisgc2F5ICRhb2gtPlsxNV17Rm9vfTsKKworPWhlYWQzIHNlcF9zZXQKKworSWYgQzxzZXBfc2V0PiBpcyBzZXQsIHRoZSBtZXRob2QgTDwvaGVhZGVyPiBpcyBpbnZva2VkIG9uIHRoZSBvcGVuZWQgc3RyZWFtCit0byBkZXRlY3QgYW5kIHNldCBMPEM8c2VwX2NoYXI+fC9zZXBfY2hhcj4gd2l0aCB0aGUgZ2l2ZW4gc2V0LgorCitDPHNlcF9zZXQ+IGNhbiBiZSBhYmJyZXZpYXRlZCB0byBDPHNlcHM+LgorCitOb3RlIHRoYXQgYXMgTDwvaGVhZGVyPiBpcyBpbnZva2VkLCBpdHMgZGVmYXVsdCBpcyB0byBhbHNvIHNldCB0aGUgaGVhZGVycy4KKworPWhlYWQzIHNldF9jb2x1bW5fbmFtZXMKKworSWYgIEM8c2V0X2NvbHVtbl9uYW1lcz4gaXMgcGFzc2VkLCAgdGhlIG1ldGhvZCBMPC9oZWFkZXI+IGlzIGludm9rZWQgb24gdGhlCitvcGVuZWQgc3RyZWFtIHdpdGggYWxsIGFyZ3VtZW50cyBtZWFudCBmb3IgTDwvaGVhZGVyPi4KKworPWhlYWQyIENhbGxiYWNrcworCitDYWxsYmFja3MgZW5hYmxlIGFjdGlvbnMgdHJpZ2dlcmVkIGZyb20gdGhlIEk8aW5zaWRlPiBvZiBUZXh0OjpDU1ZfUFAuCisKK1doaWxlIG1vc3Qgb2Ygd2hhdCB0aGlzIGVuYWJsZXMgIGNhbiBlYXNpbHkgYmUgZG9uZSBpbiBhbiAgdW5yb2xsZWQgbG9vcCBhcworZGVzY3JpYmVkIGluIHRoZSBMPC9TWU5PUFNJUz4gY2FsbGJhY2tzIGNhbiBiZSB1c2VkIHRvIG1lZXQgc3BlY2lhbCBkZW1hbmRzCitvciBlbmhhbmNlIHRoZSBMPC9jc3Y+IGZ1bmN0aW9uLgorCis9b3ZlciAyCisKKz1pdGVtIGVycm9yCisKKyAkY3N2LT5jYWxsYmFja3MgKGVycm9yID0+IHN1YiB7ICRjc3YtPlNldERpYWcgKDApIH0pOworCit0aGUgQzxlcnJvcj4gIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMsICBidXQgIEk8b25seT4gIHdoZW4KK0w8L2F1dG9fZGlhZz4gaXMgc2V0IHRvIGEgdHJ1ZSB2YWx1ZS4gQSBjYWxsYmFjayBpcyBpbnZva2VkIHdpdGggdGhlIHZhbHVlcworcmV0dXJuZWQgYnkgTDwvZXJyb3JfZGlhZz46CisKKyBteSAoJGMsICRzKTsKKworIHN1YiBpZ25vcmUzMDA2CisgeworICAgICBteSAoJGVyciwgJG1zZywgJHBvcywgJHJlY25vLCAkZmxkbm8pID0gQF87CisgICAgIGlmICgkZXJyID09IDMwMDYpIHsKKyAgICAgICAgICMgaWdub3JlIHRoaXMgZXJyb3IKKyAgICAgICAgICgkYywgJHMpID0gKHVuZGVmLCB1bmRlZik7CisgICAgICAgICBUZXh0OjpDU1ZfUFAtPlNldERpYWcgKDApOworICAgICAgICAgfQorICAgICAjIEFueSBvdGhlciBlcnJvcgorICAgICByZXR1cm47CisgICAgIH0gIyBpZ25vcmUzMDA2CisKKyAkY3N2LT5jYWxsYmFja3MgKGVycm9yID0+IFwmaWdub3JlMzAwNik7CisgJGNzdi0+YmluZF9jb2x1bW5zIChcJGMsIFwkcyk7Cisgd2hpbGUgKCRjc3YtPmdldGxpbmUgKCRmaCkpIHsKKyAgICAgIyBFcnJvciAzMDA2IHdpbGwgbm90IHN0b3AgdGhlIGxvb3AKKyAgICAgfQorCis9aXRlbSBhZnRlcl9wYXJzZQorCisgJGNzdi0+Y2FsbGJhY2tzIChhZnRlcl9wYXJzZSA9PiBzdWIgeyBwdXNoIEB7JF9bMV19LCAiTkVXIiB9KTsKKyB3aGlsZSAobXkgJHJvdyA9ICRjc3YtPmdldGxpbmUgKCRmaCkpIHsKKyAgICAgJHJvdy0+Wy0xXSBlcSAiTkVXIjsKKyAgICAgfQorCitUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYWZ0ZXIgcGFyc2luZyB3aXRoICBMPC9nZXRsaW5lPiAgb25seSBpZiBubyAgZXJyb3IKK29jY3VycmVkLiAgVGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAgIHRoZSBjdXJyZW50IEM8Q1NWPgorcGFyc2VyIG9iamVjdCBhbmQgYW4gYXJyYXkgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZHMgcGFyc2VkLgorCitUaGUgcmV0dXJuIGNvZGUgb2YgdGhlIGNhbGxiYWNrIGlzIGlnbm9yZWQgIHVubGVzcyBpdCBpcyBhIHJlZmVyZW5jZSB0byB0aGUKK3N0cmluZyAic2tpcCIsIGluIHdoaWNoIGNhc2UgdGhlIHJlY29yZCB3aWxsIGJlIHNraXBwZWQgaW4gTDwvZ2V0bGluZV9hbGw+LgorCisgc3ViIGFkZF9mcm9tX2RiCisgeworICAgICBteSAoJGNzdiwgJHJvdykgPSBAXzsKKyAgICAgJHN0aC0+ZXhlY3V0ZSAoJHJvdy0+WzRdKTsKKyAgICAgcHVzaCBAJHJvdywgJHN0aC0+ZmV0Y2hyb3dfYXJyYXk7CisgICAgIH0gIyBhZGRfZnJvbV9kYgorCisgbXkgJGFvYSA9IGNzdiAoaW4gPT4gImZpbGUuY3N2IiwgY2FsbGJhY2tzID0+IHsKKyAgICAgYWZ0ZXJfcGFyc2UgPT4gXCZhZGRfZnJvbV9kYiB9KTsKKworVGhpcyBob29rIGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uOgorCis9b3ZlciAyCisKKz1pdGVtIEZBSUwKKworRGllIGlmIGFueSBvZiB0aGUgcmVjb3JkcyBkb2VzIG5vdCB2YWxpZGF0ZSBhIHJ1bGU6CisKKyBhZnRlcl9wYXJzZSA9PiBzdWIgeworICAgICAkX1sxXVs0XSA9fiBtL15bMC05XXs0fVxzP1tBLVpdezJ9JC8gb3IKKyAgICAgICAgIGRpZSAiNXRoIGZpZWxkIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBEdXRjaCB6aXBjb2RlIjsKKyAgICAgfQorCis9aXRlbSBERUZBVUxUCisKK1JlcGxhY2UgaW52YWxpZCBmaWVsZHMgd2l0aCBhIGRlZmF1bHQgdmFsdWU6CisKKyBhZnRlcl9wYXJzZSA9PiBzdWIgeyAkX1sxXVsyXSA9fiBtL15cZCskLyBvciAkX1sxXVsyXSA9IDAgfQorCis9aXRlbSBTS0lQCisKK1NraXAgcmVjb3JkcyB0aGF0IGhhdmUgaW52YWxpZCBmaWVsZHMgKG9ubHkgYXBwbGllcyB0byBMPC9nZXRsaW5lX2FsbD4pOgorCisgYWZ0ZXJfcGFyc2UgPT4gc3ViIHsgJF9bMV1bMF0gPX4gbS9eXGQrJC8gb3IgcmV0dXJuIFwic2tpcCI7IH0KKworPWJhY2sKKworPWl0ZW0gYmVmb3JlX3ByaW50CisKKyBteSAkaWR4ID0gMTsKKyAkY3N2LT5jYWxsYmFja3MgKGJlZm9yZV9wcmludCA9PiBzdWIgeyAkX1sxXVswXSA9ICRpZHgrKyB9KTsKKyAkY3N2LT5wcmludCAoKlNURE9VVCwgWyAwLCAkXyBdKSBmb3IgQG1lbWJlcnM7CisKK1RoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCAgYmVmb3JlIHByaW50aW5nIHdpdGggIEw8L3ByaW50PiAgb25seSBpZiBubyBlcnJvcgorb2NjdXJyZWQuICBUaGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6ICB0aGUgY3VycmVudCAgQzxDU1Y+CitwYXJzZXIgb2JqZWN0IGFuZCBhbiBhcnJheSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkcyBwYXNzZWQuCisKK1RoZSByZXR1cm4gY29kZSBvZiB0aGUgY2FsbGJhY2sgaXMgaWdub3JlZC4KKworIHN1YiBtYXhfNF9maWVsZHMKKyB7CisgICAgIG15ICgkY3N2LCAkcm93KSA9IEBfOworICAgICBAJHJvdyA+IDQgYW5kIHNwbGljZSBAJHJvdywgNDsKKyAgICAgfSAjIG1heF80X2ZpZWxkcworCisgY3N2IChpbiA9PiBjc3YgKGluID0+ICJmaWxlLmNzdiIpLCBvdXQgPT4gKlNURE9VVCwKKyAgICAgY2FsbGJhY2tzID0+IHsgYmVmb3JlIHByaW50ID0+IFwmbWF4XzRfZmllbGRzIH0pOworCitUaGlzIGNhbGxiYWNrIGlzIG5vdCBhY3RpdmUgZm9yIEw8L2NvbWJpbmU+LgorCis9YmFjaworCis9aGVhZDMgQ2FsbGJhY2tzIGZvciBjc3YgKCkKKworVGhlIEw8L2Nzdj4gYWxsb3dzIGZvciBzb21lIGNhbGxiYWNrcyB0aGF0IGRvIG5vdCBpbnRlZ3JhdGUgaW4gWFMgaW50ZXJuYWxzCitidXQgb25seSBmZWF0dXJlIHRoZSBMPC9jc3Y+IGZ1bmN0aW9uLgorCisgIGNzdiAoaW4gICAgICAgID0+ICJmaWxlLmNzdiIsCisgICAgICAgY2FsbGJhY2tzID0+IHsKKyAgICAgICAgICAgZmlsdGVyICAgICAgID0+IHsgNiA9PiBzdWIgeyAkXyA+IDE1IH0gfSwgICAgIyBmaXJzdAorICAgICAgICAgICBhZnRlcl9wYXJzZSAgPT4gc3ViIHsgc2F5ICJBRlRFUiBQQVJTRSI7ICB9LCAjIGZpcnN0CisgICAgICAgICAgIGFmdGVyX2luICAgICA9PiBzdWIgeyBzYXkgIkFGVEVSIElOIjsgICAgIH0sICMgc2Vjb25kCisgICAgICAgICAgIG9uX2luICAgICAgICA9PiBzdWIgeyBzYXkgIk9OIElOIjsgICAgICAgIH0sICMgdGhpcmQKKyAgICAgICAgICAgfSwKKyAgICAgICApOworCisgIGNzdiAoaW4gICAgICAgID0+ICRhb2gsCisgICAgICAgb3V0ICAgICAgID0+ICJmaWxlLmNzdiIsCisgICAgICAgY2FsbGJhY2tzID0+IHsKKyAgICAgICAgICAgb25faW4gICAgICAgID0+IHN1YiB7IHNheSAiT04gSU4iOyAgICAgICAgfSwgIyBmaXJzdAorICAgICAgICAgICBiZWZvcmVfb3V0ICAgPT4gc3ViIHsgc2F5ICJCRUZPUkUgT1VUIjsgICB9LCAjIHNlY29uZAorICAgICAgICAgICBiZWZvcmVfcHJpbnQgPT4gc3ViIHsgc2F5ICJCRUZPUkUgUFJJTlQiOyB9LCAjIHRoaXJkCisgICAgICAgICAgIH0sCisgICAgICAgKTsKKworPW92ZXIgMgorCis9aXRlbSBmaWx0ZXIKKworVGhpcyBjYWxsYmFjayBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgcmVjb3Jkcy4gIEl0IGlzIGNhbGxlZCBqdXN0IGFmdGVyIGEgbmV3CityZWNvcmQgaGFzIGJlZW4gc2Nhbm5lZC4gIFRoZSBjYWxsYmFjayBhY2NlcHRzIGEgaGFzaHJlZiB3aGVyZSB0aGUga2V5cyBhcmUKK3RoZSBpbmRleCB0byB0aGUgcm93ICh0aGUgZmllbGQgbnVtYmVyLCAxLWJhc2VkKSBhbmQgdGhlIHZhbHVlcyBhcmUgc3VicyB0bworcmV0dXJuIGEgdHJ1ZSBvciBmYWxzZSB2YWx1ZS4KKworIGNzdiAoaW4gPT4gImZpbGUuY3N2IiwgZmlsdGVyID0+IHsKKyAgICAgICAgICAgIDMgPT4gc3ViIHsgbS9hLyB9LCAgICAgICAjIHRoaXJkIGZpZWxkIHNob3VsZCBjb250YWluIGFuICJhIgorICAgICAgICAgICAgNSA9PiBzdWIgeyBsZW5ndGggPiA0IH0sICMgbGVuZ3RoIG9mIHRoZSA1dGggZmllbGQgbWluaW1hbCA1CisgICAgICAgICAgICB9KTsKKworIGNzdiAoaW4gPT4gImZpbGUuY3N2IiwgZmlsdGVyID0+ICJub3RfYmxhbmsiKTsKKyBjc3YgKGluID0+ICJmaWxlLmNzdiIsIGZpbHRlciA9PiAibm90X2VtcHR5Iik7CisgY3N2IChpbiA9PiAiZmlsZS5jc3YiLCBmaWx0ZXIgPT4gImZpbGxlZCIpOworCitJZiB0aGUga2V5cyB0byB0aGUgZmlsdGVyIGhhc2ggY29udGFpbiBhbnkgY2hhcmFjdGVyIHRoYXQgaXMgbm90IGEgZGlnaXQgaXQKK3dpbGwgYWxzbyBpbXBsaWNpdGx5IHNldCBMPC9oZWFkZXJzPiB0byBDPCJhdXRvIj4gIHVubGVzcyAgTDwvaGVhZGVycz4gIHdhcworYWxyZWFkeSBwYXNzZWQgYXMgYXJndW1lbnQuICBXaGVuIGhlYWRlcnMgYXJlIGFjdGl2ZSwgcmV0dXJuaW5nIGFuIGFycmF5IG9mCitoYXNoZXMsIHRoZSBmaWx0ZXIgaXMgbm90IGFwcGxpY2FibGUgdG8gdGhlIGhlYWRlciBpdHNlbGYuCisKKyBjc3YgKGluID0+ICJmaWxlLmNzdiIsIGZpbHRlciA9PiB7IGZvbyA9PiBzdWIgeyAkXyA+IDQgfX0pOworCitBbGwgc3ViIHJlc3VsdHMgc2hvdWxkIG1hdGNoLCBhcyBpbiBBTkQuCisKK1RoZSBjb250ZXh0IG9mIHRoZSBjYWxsYmFjayBzZXRzICBDPCRfPiBsb2NhbGl6ZWQgdG8gdGhlIGZpZWxkIGluZGljYXRlZCBieQordGhlIGZpbHRlci4gVGhlIHR3byBhcmd1bWVudHMgYXJlIGFzIHdpdGggYWxsIG90aGVyIGNhbGxiYWNrcywgc28gdGhlIG90aGVyCitmaWVsZHMgaW4gdGhlIGN1cnJlbnQgcm93IGNhbiBiZSBzZWVuOgorCisgZmlsdGVyID0+IHsgMyA9PiBzdWIgeyAkXyA+IDEwMCA/ICRfWzFdWzFdID1+IG0vQS8gOiAkX1sxXVs2XSA9fiBtL0IvIH19CisKK0lmIHRoZSBjb250ZXh0IGlzIHNldCB0byByZXR1cm4gYSBsaXN0IG9mIGhhc2hlcyAgKEw8L2hlYWRlcnM+IGlzIGRlZmluZWQpLAordGhlIGN1cnJlbnQgcmVjb3JkIHdpbGwgYWxzbyBiZSBhdmFpbGFibGUgaW4gdGhlIGxvY2FsaXplZCBDPCVfPjoKKworIGZpbHRlciA9PiB7IDMgPT4gc3ViIHsgJF8gPiAxMDAgJiYgJF97Zm9vfSA9fiBtL0EvICYmICRfe2Jhcn0gPCAxMDAwICB9fQorCitJZiB0aGUgZmlsdGVyIGlzIHVzZWQgdG8gSTxhbHRlcj4gdGhlIGNvbnRlbnQgYnkgY2hhbmdpbmcgQzwkXz4sICBtYWtlIHN1cmUKK3RoYXQgdGhlIHN1YiByZXR1cm5zIHRydWUgaW4gb3JkZXIgbm90IHRvIGhhdmUgdGhhdCByZWNvcmQgc2tpcHBlZDoKKworIGZpbHRlciA9PiB7IDIgPT4gc3ViIHsgJF8gPSB1YyB9fQorCit3aWxsIHVwcGVyLWNhc2UgdGhlIHNlY29uZCBmaWVsZCwgYW5kIHRoZW4gc2tpcCBpdCBpZiB0aGUgcmVzdWx0aW5nIGNvbnRlbnQKK2V2YWx1YXRlcyB0byBmYWxzZS4gVG8gYWx3YXlzIGFjY2VwdCwgZW5kIHdpdGggdHJ1dGg6CisKKyBmaWx0ZXIgPT4geyAyID0+IHN1YiB7ICRfID0gdWM7IDEgfX0KKworQjxQcmVkZWZpbmVkIGZpbHRlcnM+CisKK0dpdmVuIGEgZmlsZSBsaWtlIChsaW5lIG51bWJlcnMgcHJlZml4ZWQgZm9yIGRvYyBwdXJwb3NlIG9ubHkpOgorCisgMToxLDIsMworIDI6CisgMzosCisgNDoiIgorIDU6LCwKKyA2OiwgLAorIDc6IiIsCisgODoiICIKKyA5OjQsNSw2CisKKz1vdmVyIDIKKworPWl0ZW0gbm90X2JsYW5rCisKK0ZpbHRlciBvdXQgdGhlIGJsYW5rIGxpbmVzCisKK1RoaXMgZmlsdGVyIGlzIGEgc2hvcnRjdXQgZm9yCisKKyBmaWx0ZXIgPT4geyAwID0+IHN1YiB7IEB7JF9bMV19ID4gMSBvcgorICAgICAgICAgICAgIGRlZmluZWQgJF9bMV1bMF0gJiYgJF9bMV1bMF0gbmUgIiIgfSB9CisKK0R1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24sICBpdCBpcyBjdXJyZW50bHkgaW1wb3NzaWJsZSB0byBhbHNvIGZpbHRlciBsaW5lcwordGhhdCBjb25zaXN0cyBvbmx5IG9mIGEgcXVvdGVkIGVtcHR5IGZpZWxkLiBUaGVzZSBsaW5lcyBhcmUgYWxzbyBjb25zaWRlcmVkCitibGFuayBsaW5lcy4KKworV2l0aCB0aGUgZ2l2ZW4gZXhhbXBsZSwgbGluZXMgMiBhbmQgNCB3aWxsIGJlIHNraXBwZWQuCisKKz1pdGVtIG5vdF9lbXB0eQorCitGaWx0ZXIgb3V0IGxpbmVzIHdoZXJlIGFsbCB0aGUgZmllbGRzIGFyZSBlbXB0eS4KKworVGhpcyBmaWx0ZXIgaXMgYSBzaG9ydGN1dCBmb3IKKworIGZpbHRlciA9PiB7IDAgPT4gc3ViIHsgZ3JlcCB7IGRlZmluZWQgJiYgJF8gbmUgIiIgfSBAeyRfWzFdfSB9IH0KKworQSBzcGFjZSBpcyBub3QgcmVnYXJkZWQgYmVpbmcgZW1wdHksIHNvIGdpdmVuIHRoZSBleGFtcGxlIGRhdGEsIGxpbmVzIDIsIDMsCis0LCA1LCBhbmQgNyBhcmUgc2tpcHBlZC4KKworPWl0ZW0gZmlsbGVkCisKK0ZpbHRlciBvdXQgbGluZXMgdGhhdCBoYXZlIG5vIHZpc2libGUgZGF0YQorCitUaGlzIGZpbHRlciBpcyBhIHNob3J0Y3V0IGZvcgorCisgZmlsdGVyID0+IHsgMCA9PiBzdWIgeyBncmVwIHsgZGVmaW5lZCAmJiBtL1xTLyB9IEB7JF9bMV19IH0gfQorCitUaGlzIGZpbHRlciByZWplY3RzIGFsbCBsaW5lcyB0aGF0IEk8bm90PiBoYXZlIGF0IGxlYXN0IG9uZSBmaWVsZCB0aGF0IGRvZXMKK25vdCBldmFsdWF0ZSB0byB0aGUgZW1wdHkgc3RyaW5nLgorCitXaXRoIHRoZSBnaXZlbiBleGFtcGxlIGRhdGEsIHRoaXMgZmlsdGVyIHdvdWxkIHNraXAgbGluZXMgMiB0aHJvdWdoIDguCisKKz1iYWNrCisKKz1pdGVtIGFmdGVyX2luCisKK1RoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBmb3IgZWFjaCByZWNvcmQgYWZ0ZXIgYWxsIHJlY29yZHMgaGF2ZSBiZWVuIHBhcnNlZAorYnV0IGJlZm9yZSByZXR1cm5pbmcgdGhlIHJlZmVyZW5jZSB0byB0aGUgY2FsbGVyLiAgVGhlIGhvb2sgaXMgaW52b2tlZCB3aXRoCit0d28gYXJndW1lbnRzOiAgdGhlIGN1cnJlbnQgIEM8Q1NWPiAgcGFyc2VyIG9iamVjdCAgYW5kIGEgIHJlZmVyZW5jZSB0byB0aGUKK3JlY29yZC4gICBUaGUgcmVmZXJlbmNlIGNhbiBiZSBhIHJlZmVyZW5jZSB0byBhICBIQVNIICBvciBhIHJlZmVyZW5jZSB0byBhbgorQVJSQVkgYXMgZGV0ZXJtaW5lZCBieSB0aGUgYXJndW1lbnRzLgorCitUaGlzIGNhbGxiYWNrIGNhbiBhbHNvIGJlIHBhc3NlZCBhcyAgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlICBDPGNhbGxiYWNrcz4KK3dyYXBwZXIuCisKKz1pdGVtIGJlZm9yZV9vdXQKKworVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGZvciBlYWNoIHJlY29yZCBiZWZvcmUgdGhlIHJlY29yZCBpcyBwcmludGVkLiAgVGhlCitob29rIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAgdGhlIGN1cnJlbnQgQzxDU1Y+IHBhcnNlciBvYmplY3QgYW5kIGEKK3JlZmVyZW5jZSB0byB0aGUgcmVjb3JkLiAgIFRoZSByZWZlcmVuY2UgY2FuIGJlIGEgcmVmZXJlbmNlIHRvIGEgIEhBU0ggb3IgYQorcmVmZXJlbmNlIHRvIGFuIEFSUkFZIGFzIGRldGVybWluZWQgYnkgdGhlIGFyZ3VtZW50cy4KKworVGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBwYXNzZWQgYXMgYW4gYXR0cmlidXRlICB3aXRob3V0IHRoZSAgQzxjYWxsYmFja3M+Cit3cmFwcGVyLgorCitUaGlzIGNhbGxiYWNrIG1ha2VzIHRoZSByb3cgYXZhaWxhYmxlIGluIEM8JV8+IGlmIHRoZSByb3cgaXMgYSBoYXNocmVmLiAgSW4KK3RoaXMgY2FzZSBDPCVfPiBpcyB3cml0YWJsZSBhbmQgd2lsbCBjaGFuZ2UgdGhlIG9yaWdpbmFsIHJvdy4KKworPWl0ZW0gb25faW4KKworVGhpcyBjYWxsYmFjayBhY3RzIGV4YWN0bHkgYXMgdGhlIEw8L2FmdGVyX2luPiBvciB0aGUgTDwvYmVmb3JlX291dD4gaG9va3MuCisKK1RoaXMgY2FsbGJhY2sgY2FuIGFsc28gYmUgcGFzc2VkIGFzIGFuIGF0dHJpYnV0ZSAgd2l0aG91dCB0aGUgIEM8Y2FsbGJhY2tzPgord3JhcHBlci4KKworVGhpcyBjYWxsYmFjayBtYWtlcyB0aGUgcm93IGF2YWlsYWJsZSBpbiBDPCVfPiBpZiB0aGUgcm93IGlzIGEgaGFzaHJlZi4gIEluCit0aGlzIGNhc2UgQzwlXz4gaXMgd3JpdGFibGUgYW5kIHdpbGwgY2hhbmdlIHRoZSBvcmlnaW5hbCByb3cuIFNvIGUuZy4gd2l0aAorCisgIG15ICRhb2ggPSBjc3YgKAorICAgICAgaW4gICAgICA9PiBcImZvb1xuMVxuMlxuIiwKKyAgICAgIGhlYWRlcnMgPT4gImF1dG8iLAorICAgICAgb25faW4gICA9PiBzdWIgeyAkX3tiYXJ9ID0gMjsgfSwKKyAgICAgICk7CisKK0M8JGFvaD4gd2lsbCBiZToKKworICBbIHsgZm9vID0+IDEsCisgICAgICBiYXIgPT4gMiwKKyAgICAgIH0KKyAgICB7IGZvbyA9PiAyLAorICAgICAgYmFyID0+IDIsCisgICAgICB9CisgICAgXQorCis9aXRlbSBjc3YKKworVGhlIEk8ZnVuY3Rpb24+ICBMPC9jc3Y+IGNhbiBhbHNvIGJlIGNhbGxlZCBhcyBhIG1ldGhvZCBvciB3aXRoIGFuIGV4aXN0aW5nCitUZXh0OjpDU1ZfUFAgb2JqZWN0LiBUaGlzIGNvdWxkIGhlbHAgaWYgdGhlIGZ1bmN0aW9uIGlzIHRvIGJlIGludm9rZWQgYSBsb3QKK29mIHRpbWVzIGFuZCB0aGUgb3ZlcmhlYWQgb2YgY3JlYXRpbmcgdGhlIG9iamVjdCBpbnRlcm5hbGx5IG92ZXIgIGFuZCAgb3ZlcgorYWdhaW4gd291bGQgYmUgcHJldmVudGVkIGJ5IHBhc3NpbmcgYW4gZXhpc3RpbmcgaW5zdGFuY2UuCisKKyBteSAkY3N2ID0gVGV4dDo6Q1NWX1BQLT5uZXcgKHsgYmluYXJ5ID0+IDEsIGF1dG9fZGlhZyA9PiAxIH0pOworCisgbXkgJGFvYSA9ICRjc3YtPmNzdiAoaW4gPT4gJGZoKTsKKyBteSAkYW9hID0gY3N2IChpbiA9PiAkZmgsIGNzdiA9PiAkY3N2KTsKKworYm90aCBhY3QgdGhlIHNhbWUuIFJ1bm5pbmcgdGhpcyAyMDAwMCB0aW1lcyBvbiBhIDIwIGxpbmVzIENTViBmaWxlLCAgc2hvd2VkCithIDUzJSBzcGVlZHVwLgorCis9YmFjaworCis9aGVhZDEgRElBR05PU1RJQ1MKKworVGhpcyBzZWN0aW9uIGlzIGFsc28gdGFrZW4gZnJvbSBUZXh0OjpDU1ZfWFMuCisKK0lmIGFuIGVycm9yIG9jY3VycywgIEM8PCAkY3N2LT5lcnJvcl9kaWFnID4+IGNhbiBiZSB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbgorb24gdGhlIGNhdXNlIG9mIHRoZSBmYWlsdXJlLiBOb3RlIHRoYXQgZm9yIHNwZWVkIHJlYXNvbnMgdGhlIGludGVybmFsIHZhbHVlCitpcyBuZXZlciBjbGVhcmVkIG9uIHN1Y2Nlc3MsICBzbyB1c2luZyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgTDwvZXJyb3JfZGlhZz4KK2luIG5vcm1hbCBjYXNlcyAtIHdoZW4gbm8gZXJyb3Igb2NjdXJyZWQgLSBtYXkgY2F1c2UgdW5leHBlY3RlZCByZXN1bHRzLgorCitJZiB0aGUgY29uc3RydWN0b3IgZmFpbGVkLCB0aGUgY2F1c2UgY2FuIGJlIGZvdW5kIHVzaW5nIEw8L2Vycm9yX2RpYWc+IGFzIGEKK2NsYXNzIG1ldGhvZCwgbGlrZSBDPDwgVGV4dDo6Q1NWX1BQLT5lcnJvcl9kaWFnID4+LgorCitUaGUgQzw8ICRjc3YtPmVycm9yX2RpYWcgPj4gbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgaW52b2tlZCB1cG9uIGVycm9yIHdoZW4KK3RoZSBjb250cmFjdG9yIHdhcyBjYWxsZWQgd2l0aCAgTDxDPGF1dG9fZGlhZz58L2F1dG9fZGlhZz4gIHNldCB0byAgQzwxPiBvcgorQzwyPiwgb3Igd2hlbiBMPGF1dG9kaWU+IGlzIGluIGVmZmVjdC4gIFdoZW4gc2V0IHRvIEM8MT4sIHRoaXMgd2lsbCBjYXVzZSBhCitDPHdhcm4+IHdpdGggdGhlIGVycm9yIG1lc3NhZ2UsICB3aGVuIHNldCB0byBDPDI+LCBpdCB3aWxsIEM8ZGllPi4gQzwyMDEyIC0KK0VPRj4gaXMgZXhjbHVkZWQgZnJvbSBMPEM8YXV0b19kaWFnPnwvYXV0b19kaWFnPiByZXBvcnRzLgorCitFcnJvcnMgY2FuIGJlIChpbmRpdmlkdWFsbHkpIGNhdWdodCB1c2luZyB0aGUgTDwvZXJyb3I+IGNhbGxiYWNrLgorCitUaGUgZXJyb3JzIGFzIGRlc2NyaWJlZCBiZWxvdyBhcmUgYXZhaWxhYmxlLiBJIGhhdmUgdHJpZWQgdG8gbWFrZSB0aGUgZXJyb3IKK2l0c2VsZiBleHBsYW5hdG9yeSBlbm91Z2gsIGJ1dCBtb3JlIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGFkZGVkLiBGb3IgbW9zdCBvZgordGhlc2UgZXJyb3JzLCB0aGUgZmlyc3QgdGhyZWUgY2FwaXRhbHMgZGVzY3JpYmUgdGhlIGVycm9yIGNhdGVnb3J5OgorCis9b3ZlciAyCisKKz1pdGVtICoKK0lOSQorCitJbml0aWFsaXphdGlvbiBlcnJvciBvciBvcHRpb24gY29uZmxpY3QuCisKKz1pdGVtICoKK0VDUgorCitDYXJyaWFnZS1SZXR1cm4gcmVsYXRlZCBwYXJzZSBlcnJvci4KKworPWl0ZW0gKgorRU9GCisKK0VuZC1PZi1GaWxlIHJlbGF0ZWQgcGFyc2UgZXJyb3IuCisKKz1pdGVtICoKK0VJUQorCitQYXJzZSBlcnJvciBpbnNpZGUgcXVvdGF0aW9uLgorCis9aXRlbSAqCitFSUYKKworUGFyc2UgZXJyb3IgaW5zaWRlIGZpZWxkLgorCis9aXRlbSAqCitFQ0IKKworQ29tYmluZSBlcnJvci4KKworPWl0ZW0gKgorRUhSCisKK0hhc2hSZWYgcGFyc2UgcmVsYXRlZCBlcnJvci4KKworPWJhY2sKKworQW5kIGJlbG93IHNob3VsZCBiZSB0aGUgY29tcGxldGUgbGlzdCBvZiBlcnJvciBjb2RlcyB0aGF0IGNhbiBiZSByZXR1cm5lZDoKKworPW92ZXIgMgorCis9aXRlbSAqCisxMDAxICJJTkkgLSBzZXBfY2hhciBpcyBlcXVhbCB0byBxdW90ZV9jaGFyIG9yIGVzY2FwZV9jaGFyIgorWDwxMDAxPgorCitUaGUgIEw8c2VwYXJhdGlvbiBjaGFyYWN0ZXJ8L3NlcF9jaGFyPiAgY2Fubm90IGJlIGVxdWFsIHRvICBMPHRoZSBxdW90YXRpb24KK2NoYXJhY3RlcnwvcXVvdGVfY2hhcj4gb3IgdG8gTDx0aGUgZXNjYXBlIGNoYXJhY3RlcnwvZXNjYXBlX2NoYXI+LCAgYXMgdGhpcword291bGQgaW52YWxpZGF0ZSBhbGwgcGFyc2luZyBydWxlcy4KKworPWl0ZW0gKgorMTAwMiAiSU5JIC0gYWxsb3dfd2hpdGVzcGFjZSB3aXRoIGVzY2FwZV9jaGFyIG9yIHF1b3RlX2NoYXIgU1Agb3IgVEFCIgorWDwxMDAyPgorCitVc2luZyB0aGUgIEw8QzxhbGxvd193aGl0ZXNwYWNlPnwvYWxsb3dfd2hpdGVzcGFjZT4gIGF0dHJpYnV0ZSAgd2hlbiBlaXRoZXIKK0w8QzxxdW90ZV9jaGFyPnwvcXVvdGVfY2hhcj4gb3IgTDxDPGVzY2FwZV9jaGFyPnwvZXNjYXBlX2NoYXI+ICBpcyBlcXVhbCB0bworQzxTUEFDRT4gb3IgQzxUQUI+IGlzIHRvbyBhbWJpZ3VvdXMgdG8gYWxsb3cuCisKKz1pdGVtICoKKzEwMDMgIklOSSAtIFxyIG9yIFxuIGluIG1haW4gYXR0ciBub3QgYWxsb3dlZCIKK1g8MTAwMz4KKworVXNpbmcgZGVmYXVsdCBMPEM8ZW9sPnwvZW9sPiBjaGFyYWN0ZXJzIGluIGVpdGhlciBMPEM8c2VwX2NoYXI+fC9zZXBfY2hhcj4sCitMPEM8cXVvdGVfY2hhcj58L3F1b3RlX2NoYXI+LCAgIG9yICBMPEM8ZXNjYXBlX2NoYXI+fC9lc2NhcGVfY2hhcj4gIGlzICBub3QKK2FsbG93ZWQuCisKKz1pdGVtICoKKzEwMDQgIklOSSAtIGNhbGxiYWNrcyBzaG91bGQgYmUgdW5kZWYgb3IgYSBoYXNocmVmIgorWDwxMDA0PgorCitUaGUgTDxDPGNhbGxiYWNrcz58L0NhbGxiYWNrcz4gIGF0dHJpYnV0ZSBvbmx5IGFsbG93cyBvbmUgdG8gYmUgQzx1bmRlZj4gb3IKK2EgaGFzaCByZWZlcmVuY2UuCisKKz1pdGVtICoKKzEwMDUgIklOSSAtIEVPTCB0b28gbG9uZyIKK1g8MTAwNT4KKworVGhlIHZhbHVlIHBhc3NlZCBmb3IgRU9MIGlzIGV4Y2VlZGluZyBpdHMgbWF4aW11bSBsZW5ndGggKDE2KS4KKworPWl0ZW0gKgorMTAwNiAiSU5JIC0gU0VQIHRvbyBsb25nIgorWDwxMDA2PgorCitUaGUgdmFsdWUgcGFzc2VkIGZvciBTRVAgaXMgZXhjZWVkaW5nIGl0cyBtYXhpbXVtIGxlbmd0aCAoMTYpLgorCis9aXRlbSAqCisxMDA3ICJJTkkgLSBRVU9URSB0b28gbG9uZyIKK1g8MTAwNz4KKworVGhlIHZhbHVlIHBhc3NlZCBmb3IgUVVPVEUgaXMgZXhjZWVkaW5nIGl0cyBtYXhpbXVtIGxlbmd0aCAoMTYpLgorCis9aXRlbSAqCisxMDA4ICJJTkkgLSBTRVAgdW5kZWZpbmVkIgorWDwxMDA4PgorCitUaGUgdmFsdWUgcGFzc2VkIGZvciBTRVAgc2hvdWxkIGJlIGRlZmluZWQgYW5kIG5vdCBlbXB0eS4KKworPWl0ZW0gKgorMTAxMCAiSU5JIC0gdGhlIGhlYWRlciBpcyBlbXB0eSIKK1g8MTAxMD4KKworVGhlIGhlYWRlciBsaW5lIHBhcnNlZCBpbiB0aGUgTDwvaGVhZGVyPiBpcyBlbXB0eS4KKworPWl0ZW0gKgorMTAxMSAiSU5JIC0gdGhlIGhlYWRlciBjb250YWlucyBtb3JlIHRoYW4gb25lIHZhbGlkIHNlcGFyYXRvciIKK1g8MTAxMT4KKworVGhlIGhlYWRlciBsaW5lIHBhcnNlZCBpbiB0aGUgIEw8L2hlYWRlcj4gIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgICh1bmlxdWUpCitzZXBhcmF0b3IgY2hhcmFjdGVyIG91dCBvZiB0aGUgYWxsb3dlZCBzZXQgb2Ygc2VwYXJhdG9ycy4KKworPWl0ZW0gKgorMTAxMiAiSU5JIC0gdGhlIGhlYWRlciBjb250YWlucyBhbiBlbXB0eSBmaWVsZCIKK1g8MTAxMj4KKworVGhlIGhlYWRlciBsaW5lIHBhcnNlZCBpbiB0aGUgTDwvaGVhZGVyPiBpcyBjb250YWlucyBhbiBlbXB0eSBmaWVsZC4KKworPWl0ZW0gKgorMTAxMyAiSU5JIC0gdGhlIGhlYWRlciBjb250YWlucyBudW4tdW5pcXVlIGZpZWxkcyIKK1g8MTAxMz4KKworVGhlIGhlYWRlciBsaW5lIHBhcnNlZCBpbiB0aGUgIEw8L2hlYWRlcj4gIGNvbnRhaW5zIGF0IGxlYXN0ICB0d28gaWRlbnRpY2FsCitmaWVsZHMuCisKKz1pdGVtICoKKzEwMTQgIklOSSAtIGhlYWRlciBjYWxsZWQgb24gdW5kZWZpbmVkIHN0cmVhbSIKK1g8MTAxND4KKworVGhlIGhlYWRlciBsaW5lIGNhbm5vdCBiZSBwYXJzZWQgZnJvbSBhbiB1bmRlZmluZWQgc291cmNlcy4KKworPWl0ZW0gKgorMTUwMCAiUFJNIC0gSW52YWxpZC91bnN1cHBvcnRlZCBhcmd1bWVudChzKSIKK1g8MTUwMD4KKworRnVuY3Rpb24gb3IgbWV0aG9kIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnQocykgb3IgcGFyYW1ldGVyKHMpLgorCis9aXRlbSAqCisyMDEwICJFQ1IgLSBRVU8gY2hhciBpbnNpZGUgcXVvdGVzIGZvbGxvd2VkIGJ5IENSIG5vdCBwYXJ0IG9mIEVPTCIKK1g8MjAxMD4KKworV2hlbiAgTDxDPGVvbD58L2VvbD4gIGhhcyAgYmVlbiAgc2V0ICB0byAgYW55dGhpbmcgIGJ1dCB0aGUgIGRlZmF1bHQsICBsaWtlCitDPCJcclx0XG4iPiwgIGFuZCAgdGhlICBDPCJcciI+ICBpcyAgZm9sbG93aW5nICB0aGUgICBCPHNlY29uZD4gICAoY2xvc2luZykKK0w8QzxxdW90ZV9jaGFyPnwvcXVvdGVfY2hhcj4sIHdoZXJlIHRoZSBjaGFyYWN0ZXJzIGZvbGxvd2luZyB0aGUgQzwiXHIiPiBkbworbm90IG1ha2UgdXAgdGhlIEw8Qzxlb2w+fC9lb2w+IHNlcXVlbmNlLCB0aGlzIGlzIGFuIGVycm9yLgorCis9aXRlbSAqCisyMDExICJFQ1IgLSBDaGFyYWN0ZXJzIGFmdGVyIGVuZCBvZiBxdW90ZWQgZmllbGQiCitYPDIwMTE+CisKK1NlcXVlbmNlcyBsaWtlIEM8MSxmb28sImJhciJiYXosMjIsMT4gYXJlIG5vdCBhbGxvd2VkLiBDPCJiYXIiPiBpcyBhIHF1b3RlZAorZmllbGQgYW5kIGFmdGVyIHRoZSBjbG9zaW5nIGRvdWJsZS1xdW90ZSwgdGhlcmUgc2hvdWxkIGJlIGVpdGhlciBhIG5ldy1saW5lCitzZXF1ZW5jZSBvciBhIHNlcGFyYXRpb24gY2hhcmFjdGVyLgorCis9aXRlbSAqCisyMDEyICJFT0YgLSBFbmQgb2YgZGF0YSBpbiBwYXJzaW5nIGlucHV0IHN0cmVhbSIKK1g8MjAxMj4KKworU2VsZi1leHBsYWluaW5nLiBFbmQtb2YtZmlsZSB3aGlsZSBpbnNpZGUgcGFyc2luZyBhIHN0cmVhbS4gQ2FuIGhhcHBlbiBvbmx5Cit3aGVuIHJlYWRpbmcgZnJvbSBzdHJlYW1zIHdpdGggTDwvZ2V0bGluZT4sICBhcyB1c2luZyAgTDwvcGFyc2U+IGlzIGRvbmUgb24KK3N0cmluZ3MgdGhhdCBhcmUgbm90IHJlcXVpcmVkIHRvIGhhdmUgYSB0cmFpbGluZyBMPEM8ZW9sPnwvZW9sPi4KKworPWl0ZW0gKgorMjAxMyAiSU5JIC0gU3BlY2lmaWNhdGlvbiBlcnJvciBmb3IgZnJhZ21lbnRzIFJGQzcxMTEiCitYPDIwMTM+CisKK0ludmFsaWQgc3BlY2lmaWNhdGlvbiBmb3IgVVJJIEw8L2ZyYWdtZW50PiBzcGVjaWZpY2F0aW9uLgorCis9aXRlbSAqCisyMDE0ICJFTkYgLSBJbmNvbnNpc3RlbnQgbnVtYmVyIG9mIGZpZWxkcyIKK1g8MjAxND4KKworSW5jb25zaXN0ZW50IG51bWJlciBvZiBmaWVsZHMgdW5kZXIgc3RyaWN0IHBhcnNpbmcuCisKKz1pdGVtICoKKzIwMjEgIkVJUSAtIE5MIGNoYXIgaW5zaWRlIHF1b3RlcywgYmluYXJ5IG9mZiIKK1g8MjAyMT4KKworU2VxdWVuY2VzIGxpa2UgQzwxLCJmb29cbmJhciIsMjIsMT4gYXJlIGFsbG93ZWQgb25seSB3aGVuIHRoZSBiaW5hcnkgb3B0aW9uCitoYXMgYmVlbiBzZWxlY3RlZCB3aXRoIHRoZSBjb25zdHJ1Y3Rvci4KKworPWl0ZW0gKgorMjAyMiAiRUlRIC0gQ1IgY2hhciBpbnNpZGUgcXVvdGVzLCBiaW5hcnkgb2ZmIgorWDwyMDIyPgorCitTZXF1ZW5jZXMgbGlrZSBDPDEsImZvb1xyYmFyIiwyMiwxPiBhcmUgYWxsb3dlZCBvbmx5IHdoZW4gdGhlIGJpbmFyeSBvcHRpb24KK2hhcyBiZWVuIHNlbGVjdGVkIHdpdGggdGhlIGNvbnN0cnVjdG9yLgorCis9aXRlbSAqCisyMDIzICJFSVEgLSBRVU8gY2hhcmFjdGVyIG5vdCBhbGxvd2VkIgorWDwyMDIzPgorCitTZXF1ZW5jZXMgbGlrZSBDPCJmb28gImJhciIgYmF6IixxdT4gYW5kIEM8MjAyMywiLDIwMDgtMDQtMDUsIkZvbywgQmFyIixcbj4KK3dpbGwgY2F1c2UgdGhpcyBlcnJvci4KKworPWl0ZW0gKgorMjAyNCAiRUlRIC0gRU9GIGNhbm5vdCBiZSBlc2NhcGVkLCBub3QgZXZlbiBpbnNpZGUgcXVvdGVzIgorWDwyMDI0PgorCitUaGUgZXNjYXBlIGNoYXJhY3RlciBpcyBub3QgYWxsb3dlZCBhcyBsYXN0IGNoYXJhY3RlciBpbiBhbiBpbnB1dCBzdHJlYW0uCisKKz1pdGVtICoKKzIwMjUgIkVJUSAtIExvb3NlIHVuZXNjYXBlZCBlc2NhcGUiCitYPDIwMjU+CisKK0FuIGVzY2FwZSBjaGFyYWN0ZXIgc2hvdWxkIGVzY2FwZSBvbmx5IGNoYXJhY3RlcnMgdGhhdCBuZWVkIGVzY2FwaW5nLgorCitBbGxvd2luZyAgdGhlIGVzY2FwZSAgZm9yIG90aGVyIGNoYXJhY3RlcnMgIGlzIHBvc3NpYmxlICB3aXRoIHRoZSBhdHRyaWJ1dGUKK0w8L2FsbG93X2xvb3NlX2VzY2FwZT4uCisKKz1pdGVtICoKKzIwMjYgIkVJUSAtIEJpbmFyeSBjaGFyYWN0ZXIgaW5zaWRlIHF1b3RlZCBmaWVsZCwgYmluYXJ5IG9mZiIKK1g8MjAyNj4KKworQmluYXJ5IGNoYXJhY3RlcnMgYXJlIG5vdCBhbGxvd2VkIGJ5IGRlZmF1bHQuICAgIEV4Y2VwdGlvbnMgYXJlIGZpZWxkcyB0aGF0Citjb250YWluIHZhbGlkIFVURi04LCAgdGhhdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdXBncmFkZWQgaWYgdGhlIGNvbnRlbnQgaXMKK3ZhbGlkIFVURi04LiBTZXQgTDxDPGJpbmFyeT58L2JpbmFyeT4gdG8gQzwxPiB0byBhY2NlcHQgYmluYXJ5IGRhdGEuCisKKz1pdGVtICoKKzIwMjcgIkVJUSAtIFF1b3RlZCBmaWVsZCBub3QgdGVybWluYXRlZCIKK1g8MjAyNz4KKworV2hlbiBwYXJzaW5nIGEgZmllbGQgdGhhdCBzdGFydGVkIHdpdGggYSBxdW90YXRpb24gY2hhcmFjdGVyLCAgdGhlIGZpZWxkIGlzCitleHBlY3RlZCB0byBiZSBjbG9zZWQgd2l0aCBhIHF1b3RhdGlvbiBjaGFyYWN0ZXIuICAgV2hlbiB0aGUgcGFyc2VkIGxpbmUgaXMKK2V4aGF1c3RlZCBiZWZvcmUgdGhlIHF1b3RlIGlzIGZvdW5kLCB0aGF0IGZpZWxkIGlzIG5vdCB0ZXJtaW5hdGVkLgorCis9aXRlbSAqCisyMDMwICJFSUYgLSBOTCBjaGFyIGluc2lkZSB1bnF1b3RlZCB2ZXJiYXRpbSwgYmluYXJ5IG9mZiIKK1g8MjAzMD4KKworPWl0ZW0gKgorMjAzMSAiRUlGIC0gQ1IgY2hhciBpcyBmaXJzdCBjaGFyIG9mIGZpZWxkLCBub3QgcGFydCBvZiBFT0wiCitYPDIwMzE+CisKKz1pdGVtICoKKzIwMzIgIkVJRiAtIENSIGNoYXIgaW5zaWRlIHVucXVvdGVkLCBub3QgcGFydCBvZiBFT0wiCitYPDIwMzI+CisKKz1pdGVtICoKKzIwMzQgIkVJRiAtIExvb3NlIHVuZXNjYXBlZCBxdW90ZSIKK1g8MjAzND4KKworPWl0ZW0gKgorMjAzNSAiRUlGIC0gRXNjYXBlZCBFT0YgaW4gdW5xdW90ZWQgZmllbGQiCitYPDIwMzU+CisKKz1pdGVtICoKKzIwMzYgIkVJRiAtIEVTQyBlcnJvciIKK1g8MjAzNj4KKworPWl0ZW0gKgorMjAzNyAiRUlGIC0gQmluYXJ5IGNoYXJhY3RlciBpbiB1bnF1b3RlZCBmaWVsZCwgYmluYXJ5IG9mZiIKK1g8MjAzNz4KKworPWl0ZW0gKgorMjExMCAiRUNCIC0gQmluYXJ5IGNoYXJhY3RlciBpbiBDb21iaW5lLCBiaW5hcnkgb2ZmIgorWDwyMTEwPgorCis9aXRlbSAqCisyMjAwICJFSU8gLSBwcmludCB0byBJTyBmYWlsZWQuIFNlZSBlcnJubyIKK1g8MjIwMD4KKworPWl0ZW0gKgorMzAwMSAiRUhSIC0gVW5zdXBwb3J0ZWQgc3ludGF4IGZvciBjb2x1bW5fbmFtZXMgKCkiCitYPDMwMDE+CisKKz1pdGVtICoKKzMwMDIgIkVIUiAtIGdldGxpbmVfaHIgKCkgY2FsbGVkIGJlZm9yZSBjb2x1bW5fbmFtZXMgKCkiCitYPDMwMDI+CisKKz1pdGVtICoKKzMwMDMgIkVIUiAtIGJpbmRfY29sdW1ucyAoKSBhbmQgY29sdW1uX25hbWVzICgpIGZpZWxkcyBjb3VudCBtaXNtYXRjaCIKK1g8MzAwMz4KKworPWl0ZW0gKgorMzAwNCAiRUhSIC0gYmluZF9jb2x1bW5zICgpIG9ubHkgYWNjZXB0cyByZWZzIHRvIHNjYWxhcnMiCitYPDMwMDQ+CisKKz1pdGVtICoKKzMwMDYgIkVIUiAtIGJpbmRfY29sdW1ucyAoKSBkaWQgbm90IHBhc3MgZW5vdWdoIHJlZnMgZm9yIHBhcnNlZCBmaWVsZHMiCitYPDMwMDY+CisKKz1pdGVtICoKKzMwMDcgIkVIUiAtIGJpbmRfY29sdW1ucyBuZWVkcyByZWZzIHRvIHdyaXRhYmxlIHNjYWxhcnMiCitYPDMwMDc+CisKKz1pdGVtICoKKzMwMDggIkVIUiAtIHVuZXhwZWN0ZWQgZXJyb3IgaW4gYm91bmQgZmllbGRzIgorWDwzMDA4PgorCis9aXRlbSAqCiszMDA5ICJFSFIgLSBwcmludF9ociAoKSBjYWxsZWQgYmVmb3JlIGNvbHVtbl9uYW1lcyAoKSIKK1g8MzAwOT4KKworPWl0ZW0gKgorMzAxMCAiRUhSIC0gcHJpbnRfaHIgKCkgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHMiCitYPDMwMTA+CisKKz1iYWNrCisKKz1oZWFkMSBTRUUgQUxTTworCitMPFRleHQ6OkNTVl9YUz4sIEw8VGV4dDo6Q1NWPgorCitPbGRlciB2ZXJzaW9ucyB0b29rIG1hbnkgcmVnZXhwIGZyb20gTDxodHRwOi8vd3d3LmRpbi5vci5qcC9+b2h6YWtpL3BlcmwuaHRtPgorCis9aGVhZDEgQVVUSE9SCisKK0tlbmljaGkgSXNoaWdha2ksIEU8bHQ+aXNoaWdha2lbYXRdY3Bhbi5vcmdFPGd0PgorTWFrYW1ha2EgSGFubnlhaGFyYW1pdHUsIEU8bHQ+bWFrYW1ha2FbYXRdY3Bhbi5vcmdFPGd0PgorCitUZXh0OjpDU1ZfWFMgd2FzIHdyaXR0ZW4gYnkgRTxsdD5qb2VbYXRdaXNwc29mdC5kZUU8Z3Q+CithbmQgbWFpbnRhaW5lZCBieSBFPGx0PmgubS5icmFuZFthdF14czRhbGwubmxFPGd0Pi4KKworVGV4dDo6Q1NWIHdhcyB3cml0dGVuIGJ5IEU8bHQ+YWxhblthdF1tZmdydGwuY29tRTxndD4uCisKKz1oZWFkMSBDT1BZUklHSFQgQU5EIExJQ0VOU0UKKworQ29weXJpZ2h0IDIwMTctIGJ5IEtlbmljaGkgSXNoaWdha2ksIEU8bHQ+aXNoaWdha2lbYXRdY3Bhbi5vcmdFPGd0PgorQ29weXJpZ2h0IDIwMDUtMjAxNSBieSBNYWthbWFrYSBIYW5ueWFoYXJhbWl0dSwgRTxsdD5tYWthbWFrYVthdF1jcGFuLm9yZ0U8Z3Q+CisKK01vc3Qgb2YgdGhlIGNvZGUgYW5kIGRvYyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBwdXJlIHBlcmwgcGFydCBvZgorVGV4dDo6Q1NWX1hTLgorCitDb3B5cmlnaHQgKEMpIDIwMDctMjAxNiBILk1lcmlqbiBCcmFuZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSBKb2NoZW4gV2llZG1hbm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitDb3B5cmlnaHQgKEMpIDE5OTcgICAgICBBbGFuIENpdHRlcm1hbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1RoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKworPWN1dAo=