ZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvYmFzZTY0X2NvZGVjLnB5IGIvTGliL2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTFlNjUuLjAwMDAwMDAKLS0tIGEvTGliL2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0iIiIgUHl0aG9uICdiYXNlNjRfY29kZWMnIENvZGVjIC0gYmFzZTY0IGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcKLQotICAgIFVubGlrZSBtb3N0IG9mIHRoZSBvdGhlciBjb2RlY3Mgd2hpY2ggdGFyZ2V0IFVuaWNvZGUsIHRoaXMgY29kZWMKLSAgICB3aWxsIHJldHVybiBQeXRob24gc3RyaW5nIG9iamVjdHMgZm9yIGJvdGggZW5jb2RlIGFuZCBkZWNvZGUuCi0KLSAgICBXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KLQotIiIiCi1pbXBvcnQgY29kZWNzLCBiYXNlNjQKLQotIyMjIENvZGVjIEFQSXMKLQotZGVmIGJhc2U2NF9lbmNvZGUoaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKLQotICAgICIiIiBFbmNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0Ci0gICAgICAgIG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KLQotICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCi0gICAgICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAgICAgICAgZXJyb3IgaGFuZGxpbmcgZm9yIHRoaXMgY29kZWMuCi0KLSAgICAiIiIKLSAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCi0gICAgb3V0cHV0ID0gYnl0ZXMoYmFzZTY0LmVuY29kZXN0cmluZyhpbnB1dCkpCi0gICAgcmV0dXJuIChvdXRwdXQsIGxlbihpbnB1dCkpCi0KLWRlZiBiYXNlNjRfZGVjb2RlKGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6Ci0KLSAgICAiIiIgRGVjb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAotICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCi0KLSAgICAgICAgaW5wdXQgbXVzdCBiZSBhbiBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgdGhlIGJmX2dldHJlYWRidWYKLSAgICAgICAgYnVmZmVyIHNsb3QuIFB5dGhvbiBzdHJpbmdzLCBidWZmZXIgb2JqZWN0cyBhbmQgbWVtb3J5Ci0gICAgICAgIG1hcHBlZCBmaWxlcyBhcmUgZXhhbXBsZXMgb2Ygb2JqZWN0cyBwcm92aWRpbmcgdGhpcyBzbG90LgotCi0gICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KLSAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcgd2hpY2ggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZAotICAgICAgICBlcnJvciBoYW5kbGluZyBmb3IgdGhpcyBjb2RlYy4KLQotICAgICIiIgotICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKLSAgICBvdXRwdXQgPSBiYXNlNjQuZGVjb2Rlc3RyaW5nKGlucHV0KQotICAgIHJldHVybiAob3V0cHV0LCBsZW4oaW5wdXQpKQotCi1jbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgotCi0gICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICByZXR1cm4gYmFzZTY0X2VuY29kZShpbnB1dCxlcnJvcnMpCi0gICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICByZXR1cm4gYmFzZTY0X2RlY29kZShpbnB1dCxlcnJvcnMpCi0KLWNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKLSAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIGFzc2VydCBzZWxmLmVycm9ycyA9PSAnc3RyaWN0JwotICAgICAgICByZXR1cm4gYmFzZTY0LmVuY29kZXN0cmluZyhpbnB1dCkKLQotY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgotICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKLSAgICAgICAgYXNzZXJ0IHNlbGYuZXJyb3JzID09ICdzdHJpY3QnCi0gICAgICAgIHJldHVybiBiYXNlNjQuZGVjb2Rlc3RyaW5nKGlucHV0KQotCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgcGFzcwotCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgcGFzcwotCi0jIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKLQotZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCi0gICAgICAgIG5hbWU9J2Jhc2U2NCcsCi0gICAgICAgIGVuY29kZT1iYXNlNjRfZW5jb2RlLAotICAgICAgICBkZWNvZGU9YmFzZTY0X2RlY29kZSwKLSAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKLSAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKLSAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKLSAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKLSAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL2hleF9jb2RlYy5weSBiL0xpYi9lbmNvZGluZ3MvaGV4X2NvZGVjLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWIzOGQ5Li4wMDAwMDAwCi0tLSBhL0xpYi9lbmNvZGluZ3MvaGV4X2NvZGVjLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIiIiIFB5dGhvbiAnaGV4X2NvZGVjJyBDb2RlYyAtIDItZGlnaXQgaGV4IGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcKLQotICAgIFVubGlrZSBtb3N0IG9mIHRoZSBvdGhlciBjb2RlY3Mgd2hpY2ggdGFyZ2V0IFVuaWNvZGUsIHRoaXMgY29kZWMKLSAgICB3aWxsIHJldHVybiBQeXRob24gc3RyaW5nIG9iamVjdHMgZm9yIGJvdGggZW5jb2RlIGFuZCBkZWNvZGUuCi0KLSAgICBXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KLQotIiIiCi1pbXBvcnQgY29kZWNzLCBiaW5hc2NpaQotCi0jIyMgQ29kZWMgQVBJcwotCi1kZWYgaGV4X2VuY29kZShpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgotCi0gICAgIiIiIEVuY29kZXMgdGhlIG9iamVjdCBpbnB1dCBhbmQgcmV0dXJucyBhIHR1cGxlIChvdXRwdXQKLSAgICAgICAgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgotCi0gICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KLSAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcgd2hpY2ggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZAotICAgICAgICBlcnJvciBoYW5kbGluZyBmb3IgdGhpcyBjb2RlYy4KLQotICAgICIiIgotICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKLSAgICBvdXRwdXQgPSBiaW5hc2NpaS5iMmFfaGV4KGlucHV0KQotICAgIHJldHVybiAob3V0cHV0LCBsZW4oaW5wdXQpKQotCi1kZWYgaGV4X2RlY29kZShpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgotCi0gICAgIiIiIERlY29kZXMgdGhlIG9iamVjdCBpbnB1dCBhbmQgcmV0dXJucyBhIHR1cGxlIChvdXRwdXQKLSAgICAgICAgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgotCi0gICAgICAgIGlucHV0IG11c3QgYmUgYW4gb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBiZl9nZXRyZWFkYnVmCi0gICAgICAgIGJ1ZmZlciBzbG90LiBQeXRob24gc3RyaW5ncywgYnVmZmVyIG9iamVjdHMgYW5kIG1lbW9yeQotICAgICAgICBtYXBwZWQgZmlsZXMgYXJlIGV4YW1wbGVzIG9mIG9iamVjdHMgcHJvdmlkaW5nIHRoaXMgc2xvdC4KLQotICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCi0gICAgICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAgICAgICAgZXJyb3IgaGFuZGxpbmcgZm9yIHRoaXMgY29kZWMuCi0KLSAgICAiIiIKLSAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCi0gICAgb3V0cHV0ID0gYmluYXNjaWkuYTJiX2hleChpbnB1dCkKLSAgICByZXR1cm4gKG91dHB1dCwgbGVuKGlucHV0KSkKLQotY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKLQotICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgcmV0dXJuIGhleF9lbmNvZGUoaW5wdXQsZXJyb3JzKQotICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgcmV0dXJuIGhleF9kZWNvZGUoaW5wdXQsZXJyb3JzKQotCi1jbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6Ci0gICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICBhc3NlcnQgc2VsZi5lcnJvcnMgPT0gJ3N0cmljdCcKLSAgICAgICAgcmV0dXJuIGJpbmFzY2lpLmIyYV9oZXgoaW5wdXQpCi0KLWNsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKLSAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIGFzc2VydCBzZWxmLmVycm9ycyA9PSAnc3RyaWN0JwotICAgICAgICByZXR1cm4gYmluYXNjaWkuYTJiX2hleChpbnB1dCkKLQotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIHBhc3MKLQotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIHBhc3MKLQotIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCi0KLWRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAotICAgICAgICBuYW1lPSdoZXgnLAotICAgICAgICBlbmNvZGU9aGV4X2VuY29kZSwKLSAgICAgICAgZGVjb2RlPWhleF9kZWNvZGUsCi0gICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCi0gICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCi0gICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCi0gICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCi0gICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9xdW9wcmlfY29kZWMucHkgYi9MaWIvZW5jb2RpbmdzL3F1b3ByaV9jb2RlYy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwMmFlNi4uMDAwMDAwMAotLS0gYS9MaWIvZW5jb2RpbmdzL3F1b3ByaV9jb2RlYy5weQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSIiIkNvZGVjIGZvciBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nLgotCi1MaWtlIGJhc2U2NCBhbmQgcm90MTMsIHRoaXMgcmV0dXJucyBQeXRob24gc3RyaW5ncywgbm90IFVuaWNvZGUuCi0iIiIKLQotaW1wb3J0IGNvZGVjcywgcXVvcHJpCi10cnk6Ci0gICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLQotZGVmIHF1b3ByaV9lbmNvZGUoaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgIiIiRW5jb2RlIHRoZSBpbnB1dCwgcmV0dXJuaW5nIGEgdHVwbGUgKG91dHB1dCBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCi0KLSAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCi0gICAgJ3N0cmljdCcgaGFuZGxpbmcgd2hpY2ggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZAotICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgotCi0gICAgIiIiCi0gICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JwotICAgIGYgPSBTdHJpbmdJTyhpbnB1dCkKLSAgICBnID0gU3RyaW5nSU8oKQotICAgIHF1b3ByaS5lbmNvZGUoZiwgZywgMSkKLSAgICBvdXRwdXQgPSBnLmdldHZhbHVlKCkKLSAgICByZXR1cm4gKG91dHB1dCwgbGVuKGlucHV0KSkKLQotZGVmIHF1b3ByaV9kZWNvZGUoaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgIiIiRGVjb2RlIHRoZSBpbnB1dCwgcmV0dXJuaW5nIGEgdHVwbGUgKG91dHB1dCBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCi0KLSAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCi0gICAgJ3N0cmljdCcgaGFuZGxpbmcgd2hpY2ggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZAotICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgotCi0gICAgIiIiCi0gICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JwotICAgIGYgPSBTdHJpbmdJTyhpbnB1dCkKLSAgICBnID0gU3RyaW5nSU8oKQotICAgIHF1b3ByaS5kZWNvZGUoZiwgZykKLSAgICBvdXRwdXQgPSBnLmdldHZhbHVlKCkKLSAgICByZXR1cm4gKG91dHB1dCwgbGVuKGlucHV0KSkKLQotY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKLQotICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgcmV0dXJuIHF1b3ByaV9lbmNvZGUoaW5wdXQsZXJyb3JzKQotICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgcmV0dXJuIHF1b3ByaV9kZWNvZGUoaW5wdXQsZXJyb3JzKQotCi1jbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6Ci0gICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gcXVvcHJpX2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCi0KLWNsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKLSAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBxdW9wcmlfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KLQotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBwYXNzCi0KLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBwYXNzCi0KLSMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKLQotZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCi0gICAgICAgIG5hbWU9J3F1b3ByaScsCi0gICAgICAgIGVuY29kZT1xdW9wcmlfZW5jb2RlLAotICAgICAgICBkZWNvZGU9cXVvcHJpX2RlY29kZSwKLSAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKLSAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKLSAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKLSAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKLSAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3JvdF8xMy5weSBiL0xpYi9lbmNvZGluZ3Mvcm90XzEzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmI2NDMxLi4wMDAwMDAwCi0tLSBhL0xpYi9lbmNvZGluZ3Mvcm90XzEzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBmb3IgUk9UMTMuCi0KLSAgICBTZWUgaHR0cDovL3Vjc3ViLmNvbG9yYWRvLmVkdS9+a29taW5lay9yb3QxMy8gZm9yIGRldGFpbHMuCi0KLSAgICBXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KLQotIiIiIyIKLQotaW1wb3J0IGNvZGVjcwotCi0jIyMgQ29kZWMgQVBJcwotCi1jbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgotCi0gICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKLQotICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ19tYXApCi0KLWNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKLSAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQotCi1jbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6Ci0gICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX21hcClbMF0KLQotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIHBhc3MKLQotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIHBhc3MKLQotIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCi0KLWRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAotICAgICAgICBuYW1lPSdyb3QtMTMnLAotICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCi0gICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKLSAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKLSAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKLSAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKLSAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKLSAgICApCi0KLSMjIyBEZWNvZGluZyBNYXAKLQotZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQotZGVjb2RpbmdfbWFwLnVwZGF0ZSh7Ci0gICAweDAwNDE6IDB4MDA0ZSwKLSAgIDB4MDA0MjogMHgwMDRmLAotICAgMHgwMDQzOiAweDAwNTAsCi0gICAweDAwNDQ6IDB4MDA1MSwKLSAgIDB4MDA0NTogMHgwMDUyLAotICAgMHgwMDQ2OiAweDAwNTMsCi0gICAweDAwNDc6IDB4MDA1NCwKLSAgIDB4MDA0ODogMHgwMDU1LAotICAgMHgwMDQ5OiAweDAwNTYsCi0gICAweDAwNGE6IDB4MDA1NywKLSAgIDB4MDA0YjogMHgwMDU4LAotICAgMHgwMDRjOiAweDAwNTksCi0gICAweDAwNGQ6IDB4MDA1YSwKLSAgIDB4MDA0ZTogMHgwMDQxLAotICAgMHgwMDRmOiAweDAwNDIsCi0gICAweDAwNTA6IDB4MDA0MywKLSAgIDB4MDA1MTogMHgwMDQ0LAotICAgMHgwMDUyOiAweDAwNDUsCi0gICAweDAwNTM6IDB4MDA0NiwKLSAgIDB4MDA1NDogMHgwMDQ3LAotICAgMHgwMDU1OiAweDAwNDgsCi0gICAweDAwNTY6IDB4MDA0OSwKLSAgIDB4MDA1NzogMHgwMDRhLAotICAgMHgwMDU4OiAweDAwNGIsCi0gICAweDAwNTk6IDB4MDA0YywKLSAgIDB4MDA1YTogMHgwMDRkLAotICAgMHgwMDYxOiAweDAwNmUsCi0gICAweDAwNjI6IDB4MDA2ZiwKLSAgIDB4MDA2MzogMHgwMDcwLAotICAgMHgwMDY0OiAweDAwNzEsCi0gICAweDAwNjU6IDB4MDA3MiwKLSAgIDB4MDA2NjogMHgwMDczLAotICAgMHgwMDY3OiAweDAwNzQsCi0gICAweDAwNjg6IDB4MDA3NSwKLSAgIDB4MDA2OTogMHgwMDc2LAotICAgMHgwMDZhOiAweDAwNzcsCi0gICAweDAwNmI6IDB4MDA3OCwKLSAgIDB4MDA2YzogMHgwMDc5LAotICAgMHgwMDZkOiAweDAwN2EsCi0gICAweDAwNmU6IDB4MDA2MSwKLSAgIDB4MDA2ZjogMHgwMDYyLAotICAgMHgwMDcwOiAweDAwNjMsCi0gICAweDAwNzE6IDB4MDA2NCwKLSAgIDB4MDA3MjogMHgwMDY1LAotICAgMHgwMDczOiAweDAwNjYsCi0gICAweDAwNzQ6IDB4MDA2NywKLSAgIDB4MDA3NTogMHgwMDY4LAotICAgMHgwMDc2OiAweDAwNjksCi0gICAweDAwNzc6IDB4MDA2YSwKLSAgIDB4MDA3ODogMHgwMDZiLAotICAgMHgwMDc5OiAweDAwNmMsCi0gICAweDAwN2E6IDB4MDA2ZCwKLX0pCi0KLSMjIyBFbmNvZGluZyBNYXAKLQotZW5jb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfZW5jb2RpbmdfbWFwKGRlY29kaW5nX21hcCkKLQotIyMjIEZpbHRlciBBUEkKLQotZGVmIHJvdDEzKGluZmlsZSwgb3V0ZmlsZSk6Ci0gICAgb3V0ZmlsZS53cml0ZShpbmZpbGUucmVhZCgpLmVuY29kZSgncm90LTEzJykpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgaW1wb3J0IHN5cwotICAgIHJvdDEzKHN5cy5zdGRpbiwgc3lzLnN0ZG91dCkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weSBiL0xpYi9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyOWEyNi4uMDAwMDAwMAotLS0gYS9MaWIvZW5jb2RpbmdzL3N0cmluZ19lc2NhcGUucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCi0iIiIgUHl0aG9uICdlc2NhcGUnIENvZGVjCi0KLQotV3JpdHRlbiBieSBNYXJ0aW4gdi4gTPZ3aXMgKG1hcnRpbkB2LmxvZXdpcy5kZSkuCi0KLSIiIgotaW1wb3J0IGNvZGVjcwotCi1jbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgotCi0gICAgZW5jb2RlID0gY29kZWNzLmVzY2FwZV9lbmNvZGUKLSAgICBkZWNvZGUgPSBjb2RlY3MuZXNjYXBlX2RlY29kZQotCi1jbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6Ci0gICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gY29kZWNzLmVzY2FwZV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQotCi1jbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6Ci0gICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gY29kZWNzLmVzY2FwZV9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQotCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgcGFzcwotCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgcGFzcwotCi1kZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKLSAgICAgICAgbmFtZT0nc3RyaW5nLWVzY2FwZScsCi0gICAgICAgIGVuY29kZT1Db2RlYy5lbmNvZGUsCi0gICAgICAgIGRlY29kZT1Db2RlYy5kZWNvZGUsCi0gICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCi0gICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCi0gICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCi0gICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCi0gICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy91dV9jb2RlYy5weSBiL0xpYi9lbmNvZGluZ3MvdXVfY29kZWMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYWY3NzkuLjAwMDAwMDAKLS0tIGEvTGliL2VuY29kaW5ncy91dV9jb2RlYy5weQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0iIiIgUHl0aG9uICd1dV9jb2RlYycgQ29kZWMgLSBVVSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nCi0KLSAgICBVbmxpa2UgbW9zdCBvZiB0aGUgb3RoZXIgY29kZWNzIHdoaWNoIHRhcmdldCBVbmljb2RlLCB0aGlzIGNvZGVjCi0gICAgd2lsbCByZXR1cm4gUHl0aG9uIHN0cmluZyBvYmplY3RzIGZvciBib3RoIGVuY29kZSBhbmQgZGVjb2RlLgotCi0gICAgV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuIFNvbWUgZGV0YWlscyB3ZXJlCi0gICAgYWRhcHRlZCBmcm9tIHV1LnB5IHdoaWNoIHdhcyB3cml0dGVuIGJ5IExhbmNlIEVsbGluZ2hvdXNlIGFuZAotICAgIG1vZGlmaWVkIGJ5IEphY2sgSmFuc2VuIGFuZCBGcmVkcmlrIEx1bmRoLgotCi0iIiIKLWltcG9ydCBjb2RlY3MsIGJpbmFzY2lpCi0KLSMjIyBDb2RlYyBBUElzCi0KLWRlZiB1dV9lbmNvZGUoaW5wdXQsZXJyb3JzPSdzdHJpY3QnLGZpbGVuYW1lPSc8ZGF0YT4nLG1vZGU9MDY2Nik6Ci0KLSAgICAiIiIgRW5jb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAotICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCi0KLSAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bwotICAgICAgICAnc3RyaWN0JyBoYW5kbGluZyB3aGljaCBpcyB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkCi0gICAgICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgotCi0gICAgIiIiCi0gICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JwotICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotICAgIGZyb20gYmluYXNjaWkgaW1wb3J0IGIyYV91dQotICAgIGluZmlsZSA9IFN0cmluZ0lPKGlucHV0KQotICAgIG91dGZpbGUgPSBTdHJpbmdJTygpCi0gICAgcmVhZCA9IGluZmlsZS5yZWFkCi0gICAgd3JpdGUgPSBvdXRmaWxlLndyaXRlCi0KLSAgICAjIEVuY29kZQotICAgIHdyaXRlKCdiZWdpbiAlbyAlc1xuJyAlIChtb2RlICYgMDc3NywgZmlsZW5hbWUpKQotICAgIGNodW5rID0gcmVhZCg0NSkKLSAgICB3aGlsZSBjaHVuazoKLSAgICAgICAgd3JpdGUoYjJhX3V1KGNodW5rKSkKLSAgICAgICAgY2h1bmsgPSByZWFkKDQ1KQotICAgIHdyaXRlKCcgXG5lbmRcbicpCi0KLSAgICByZXR1cm4gKG91dGZpbGUuZ2V0dmFsdWUoKSwgbGVuKGlucHV0KSkKLQotZGVmIHV1X2RlY29kZShpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgotCi0gICAgIiIiIERlY29kZXMgdGhlIG9iamVjdCBpbnB1dCBhbmQgcmV0dXJucyBhIHR1cGxlIChvdXRwdXQKLSAgICAgICAgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgotCi0gICAgICAgIGlucHV0IG11c3QgYmUgYW4gb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBiZl9nZXRyZWFkYnVmCi0gICAgICAgIGJ1ZmZlciBzbG90LiBQeXRob24gc3RyaW5ncywgYnVmZmVyIG9iamVjdHMgYW5kIG1lbW9yeQotICAgICAgICBtYXBwZWQgZmlsZXMgYXJlIGV4YW1wbGVzIG9mIG9iamVjdHMgcHJvdmlkaW5nIHRoaXMgc2xvdC4KLQotICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCi0gICAgICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAgICAgICAgZXJyb3IgaGFuZGxpbmcgZm9yIHRoaXMgY29kZWMuCi0KLSAgICAgICAgTm90ZTogZmlsZW5hbWUgYW5kIGZpbGUgbW9kZSBpbmZvcm1hdGlvbiBpbiB0aGUgaW5wdXQgZGF0YSBpcwotICAgICAgICBpZ25vcmVkLgotCi0gICAgIiIiCi0gICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JwotICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotICAgIGZyb20gYmluYXNjaWkgaW1wb3J0IGEyYl91dQotICAgIGluZmlsZSA9IFN0cmluZ0lPKGlucHV0KQotICAgIG91dGZpbGUgPSBTdHJpbmdJTygpCi0gICAgcmVhZGxpbmUgPSBpbmZpbGUucmVhZGxpbmUKLSAgICB3cml0ZSA9IG91dGZpbGUud3JpdGUKLQotICAgICMgRmluZCBzdGFydCBvZiBlbmNvZGVkIGRhdGEKLSAgICB3aGlsZSAxOgotICAgICAgICBzID0gcmVhZGxpbmUoKQotICAgICAgICBpZiBub3QgczoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdNaXNzaW5nICJiZWdpbiIgbGluZSBpbiBpbnB1dCBkYXRhJwotICAgICAgICBpZiBzWzo1XSA9PSAnYmVnaW4nOgotICAgICAgICAgICAgYnJlYWsKLQotICAgICMgRGVjb2RlCi0gICAgd2hpbGUgMToKLSAgICAgICAgcyA9IHJlYWRsaW5lKCkKLSAgICAgICAgaWYgbm90IHMgb3IgXAotICAgICAgICAgICBzID09ICdlbmRcbic6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBkYXRhID0gYTJiX3V1KHMpCi0gICAgICAgIGV4Y2VwdCBiaW5hc2NpaS5FcnJvciBhcyB2OgotICAgICAgICAgICAgIyBXb3JrYXJvdW5kIGZvciBicm9rZW4gdXVlbmNvZGVycyBieSAvRnJlZHJpayBMdW5kaAotICAgICAgICAgICAgbmJ5dGVzID0gKCgob3JkKHNbMF0pLTMyKSAmIDYzKSAqIDQgKyA1KSAvIDMKLSAgICAgICAgICAgIGRhdGEgPSBhMmJfdXUoc1s6bmJ5dGVzXSkKLSAgICAgICAgICAgICNzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiAlc1xuIiAlIHN0cih2KSkKLSAgICAgICAgd3JpdGUoZGF0YSkKLSAgICBpZiBub3QgczoKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ1RydW5jYXRlZCBpbnB1dCBkYXRhJwotCi0gICAgcmV0dXJuIChvdXRmaWxlLmdldHZhbHVlKCksIGxlbihpbnB1dCkpCi0KLWNsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6Ci0KLSAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgcmV0dXJuIHV1X2VuY29kZShpbnB1dCxlcnJvcnMpCi0KLSAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgcmV0dXJuIHV1X2RlY29kZShpbnB1dCxlcnJvcnMpCi0KLWNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKLSAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiB1dV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQotCi1jbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6Ci0gICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gdXVfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KLQotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIHBhc3MKLQotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIHBhc3MKLQotIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCi0KLWRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAotICAgICAgICBuYW1lPSd1dScsCi0gICAgICAgIGVuY29kZT11dV9lbmNvZGUsCi0gICAgICAgIGRlY29kZT11dV9kZWNvZGUsCi0gICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCi0gICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCi0gICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCi0gICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCi0gICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy96bGliX2NvZGVjLnB5IGIvTGliL2VuY29kaW5ncy96bGliX2NvZGVjLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDE5ZjlmLi4wMDAwMDAwCi0tLSBhL0xpYi9lbmNvZGluZ3MvemxpYl9jb2RlYy5weQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0iIiIgUHl0aG9uICd6bGliX2NvZGVjJyBDb2RlYyAtIHpsaWIgY29tcHJlc3Npb24gZW5jb2RpbmcKLQotICAgIFVubGlrZSBtb3N0IG9mIHRoZSBvdGhlciBjb2RlY3Mgd2hpY2ggdGFyZ2V0IFVuaWNvZGUsIHRoaXMgY29kZWMKLSAgICB3aWxsIHJldHVybiBQeXRob24gc3RyaW5nIG9iamVjdHMgZm9yIGJvdGggZW5jb2RlIGFuZCBkZWNvZGUuCi0KLSAgICBXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KLQotIiIiCi1pbXBvcnQgY29kZWNzCi1pbXBvcnQgemxpYiAjIHRoaXMgY29kZWMgbmVlZHMgdGhlIG9wdGlvbmFsIHpsaWIgbW9kdWxlICEKLQotIyMjIENvZGVjIEFQSXMKLQotZGVmIHpsaWJfZW5jb2RlKGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6Ci0KLSAgICAiIiIgRW5jb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAotICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCi0KLSAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bwotICAgICAgICAnc3RyaWN0JyBoYW5kbGluZyB3aGljaCBpcyB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkCi0gICAgICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgotCi0gICAgIiIiCi0gICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JwotICAgIG91dHB1dCA9IHpsaWIuY29tcHJlc3MoaW5wdXQpCi0gICAgcmV0dXJuIChvdXRwdXQsIGxlbihpbnB1dCkpCi0KLWRlZiB6bGliX2RlY29kZShpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgotCi0gICAgIiIiIERlY29kZXMgdGhlIG9iamVjdCBpbnB1dCBhbmQgcmV0dXJucyBhIHR1cGxlIChvdXRwdXQKLSAgICAgICAgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgotCi0gICAgICAgIGlucHV0IG11c3QgYmUgYW4gb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBiZl9nZXRyZWFkYnVmCi0gICAgICAgIGJ1ZmZlciBzbG90LiBQeXRob24gc3RyaW5ncywgYnVmZmVyIG9iamVjdHMgYW5kIG1lbW9yeQotICAgICAgICBtYXBwZWQgZmlsZXMgYXJlIGV4YW1wbGVzIG9mIG9iamVjdHMgcHJvdmlkaW5nIHRoaXMgc2xvdC4KLQotICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCi0gICAgICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAgICAgICAgZXJyb3IgaGFuZGxpbmcgZm9yIHRoaXMgY29kZWMuCi0KLSAgICAiIiIKLSAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCi0gICAgb3V0cHV0ID0gemxpYi5kZWNvbXByZXNzKGlucHV0KQotICAgIHJldHVybiAob3V0cHV0LCBsZW4oaW5wdXQpKQotCi1jbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgotCi0gICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgcmV0dXJuIHpsaWJfZW5jb2RlKGlucHV0LCBlcnJvcnMpCi0gICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgcmV0dXJuIHpsaWJfZGVjb2RlKGlucHV0LCBlcnJvcnMpCi0KLWNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JwotICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycwotICAgICAgICBzZWxmLmNvbXByZXNzb2JqID0gemxpYi5jb21wcmVzc29iaigpCi0KLSAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIGlmIGZpbmFsOgotICAgICAgICAgICAgYyA9IHNlbGYuY29tcHJlc3NvYmouY29tcHJlc3MoaW5wdXQpCi0gICAgICAgICAgICByZXR1cm4gYyArIHNlbGYuY29tcHJlc3NvYmouZmx1c2goKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tcHJlc3NvYmouY29tcHJlc3MoaW5wdXQpCi0KLSAgICBkZWYgcmVzZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuY29tcHJlc3NvYmogPSB6bGliLmNvbXByZXNzb2JqKCkKLQotY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCi0gICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCi0gICAgICAgIHNlbGYuZGVjb21wcmVzc29iaiA9IHpsaWIuZGVjb21wcmVzc29iaigpCi0KLSAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIGlmIGZpbmFsOgotICAgICAgICAgICAgYyA9IHNlbGYuZGVjb21wcmVzc29iai5kZWNvbXByZXNzKGlucHV0KQotICAgICAgICAgICAgcmV0dXJuIGMgKyBzZWxmLmRlY29tcHJlc3NvYmouZmx1c2goKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVjb21wcmVzc29iai5kZWNvbXByZXNzKGlucHV0KQotCi0gICAgZGVmIHJlc2V0KHNlbGYpOgotICAgICAgICBzZWxmLmRlY29tcHJlc3NvYmogPSB6bGliLmRlY29tcHJlc3NvYmooKQotCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgcGFzcwotCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgcGFzcwotCi0jIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKLQotZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCi0gICAgICAgIG5hbWU9J3psaWInLAotICAgICAgICBlbmNvZGU9emxpYl9lbmNvZGUsCi0gICAgICAgIGRlY29kZT16bGliX2RlY29kZSwKLSAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKLSAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKLSAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKLSAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKLSAgICApCmRpZmYgLS1naXQgYS9MaWIvcGlja2xlLnB5IGIvTGliL3BpY2tsZS5weQppbmRleCBiOTUwNzE3Li45OTE5YWE0IDEwMDY0NAotLS0gYS9MaWIvcGlja2xlLnB5CisrKyBiL0xpYi9waWNrbGUucHkKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCByZQogaW1wb3J0IGlvCitpbXBvcnQgY29kZWNzCiAKIF9fYWxsX18gPSBbIlBpY2tsZUVycm9yIiwgIlBpY2tsaW5nRXJyb3IiLCAiVW5waWNrbGluZ0Vycm9yIiwgIlBpY2tsZXIiLAogICAgICAgICAgICAiVW5waWNrbGVyIiwgImR1bXAiLCAiZHVtcHMiLCAibG9hZCIsICJsb2FkcyJdCkBAIC05MjksNyArOTMwLDcgQEAKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImluc2VjdXJlIHN0cmluZyBwaWNrbGUiCi0gICAgICAgIHNlbGYuYXBwZW5kKHN0cjgocmVwLmRlY29kZSgic3RyaW5nLWVzY2FwZSIpKSkKKyAgICAgICAgc2VsZi5hcHBlbmQoc3RyOChjb2RlY3MuZXNjYXBlX2RlY29kZShyZXApWzBdKSkKICAgICBkaXNwYXRjaFtTVFJJTkdbMF1dID0gbG9hZF9zdHJpbmcKIAogICAgIGRlZiBsb2FkX2JpbnN0cmluZyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9waWNrbGV0b29scy5weSBiL0xpYi9waWNrbGV0b29scy5weQppbmRleCAwMDBmYzZiLi4yM2MxODZhIDEwMDY0NAotLS0gYS9MaWIvcGlja2xldG9vbHMucHkKKysrIGIvTGliL3BpY2tsZXRvb2xzLnB5CkBAIC0xMCw2ICsxMCw4IEBACiAgICBQcmludCBhIHN5bWJvbGljIGRpc2Fzc2VtYmx5IG9mIGEgcGlja2xlLgogJycnCiAKK2ltcG9ydCBjb2RlY3MKKwogX19hbGxfXyA9IFsnZGlzJywKICAgICAgICAgICAgJ2dlbm9wcycsCiAgICAgICAgICAgXQpAQCAtMzE4LDEwICszMjAsOCBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm8gc3RyaW5nIHF1b3RlcyBhcm91bmQgJXIiICUgZGF0YSkKIAotICAgICMgSSdtIG5vdCBzdXJlIHdoZW4gJ3N0cmluZ19lc2NhcGUnIHdhcyBhZGRlZCB0byB0aGUgc3RkIGNvZGVjczsgaXQncwotICAgICMgY3Jhenkgbm90IHRvIHVzZSBpdCBpZiBpdCdzIHRoZXJlLgogICAgIGlmIGRlY29kZToKLSAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKCdzdHJpbmdfZXNjYXBlJykKKyAgICAgICAgZGF0YSA9IGNvZGVjcy5lc2NhcGVfZGVjb2RlKGRhdGEpWzBdCiAgICAgcmV0dXJuIGRhdGEKIAogc3RyaW5nbmwgPSBBcmd1bWVudERlc2NyaXB0b3IoCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CmluZGV4IDAwODFlMjMuLjdhNjc5YjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CkBAIC00ODYsMTAgKzQ4Niw2IEBACiAgICAgICAgIHNlbGYuY2hlY2tfc3RhdGVfaGFuZGxpbmdfZGVjb2RlKHNlbGYuZW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUsIHUuZW5jb2RlKHNlbGYuZW5jb2RpbmcpKQogCi1jbGFzcyBFc2NhcGVEZWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29kZWNzLmVzY2FwZV9kZWNvZGUoIiIpLCAoIiIsIDApKQotCiBjbGFzcyBSZWNvZGluZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3JlY29kaW5nKHNlbGYpOgogICAgICAgICBmID0gaW8uQnl0ZXNJTygpCkBAIC05ODYsMjUgKzk4Miw4IEBACiAgICAgICAgIGVmLndyaXRlKGInXHhjM1x4YmMnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLmdldHZhbHVlKCksIGInXHhmYycpCiAKLWNsYXNzIFN0cjJTdHJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6Ci0gICAgICAgIHNpbiA9ICJceDgwIi5lbmNvZGUoImJhc2U2NF9jb2RlYyIpCi0gICAgICAgIHJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoImJhc2U2NF9jb2RlYyIpKGlvLkJ5dGVzSU8oc2luKSkKLSAgICAgICAgc291dCA9IHJlYWRlci5yZWFkKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3V0LCAiXHg4MCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHNvdXQsIHN0cikpCi0KLSAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKLSAgICAgICAgc2luID0gIlx4ODAiLmVuY29kZSgiYmFzZTY0X2NvZGVjIikKLSAgICAgICAgcmVhZGVyID0gY29kZWNzLmdldHJlYWRlcigiYmFzZTY0X2NvZGVjIikoaW8uQnl0ZXNJTyhzaW4pKQotICAgICAgICBzb3V0ID0gcmVhZGVyLnJlYWRsaW5lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3V0LCAiXHg4MCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHNvdXQsIHN0cikpCi0KIGFsbF91bmljb2RlX2VuY29kaW5ncyA9IFsKICAgICAiYXNjaWkiLAotICAgICJiYXNlNjRfY29kZWMiLAogICAgICJiaWc1IiwKICAgICAiYmlnNWhrc2NzIiwKICAgICAiY2hhcm1hcCIsCkBAIC0xMDUxLDcgKzEwMzAsNiBAQAogICAgICJnYjE4MDMwIiwKICAgICAiZ2IyMzEyIiwKICAgICAiZ2JrIiwKLSAgICAiaGV4X2NvZGVjIiwKICAgICAiaHBfcm9tYW44IiwKICAgICAiaHoiLAogICAgICJpZG5hIiwKQEAgLTEwOTEsNyArMTA2OSw2IEBACiAgICAgInB0Y3AxNTQiLAogICAgICJwdW55Y29kZSIsCiAgICAgInJhd191bmljb2RlX2VzY2FwZSIsCi0gICAgInJvdF8xMyIsCiAgICAgInNoaWZ0X2ppcyIsCiAgICAgInNoaWZ0X2ppc18yMDA0IiwKICAgICAic2hpZnRfamlzeDAyMTMiLApAQCAtMTEwOCw1MyArMTA4NSwyNCBAQAogaWYgaGFzYXR0cihjb2RlY3MsICJtYmNzX2VuY29kZSIpOgogICAgIGFsbF91bmljb2RlX2VuY29kaW5ncy5hcHBlbmQoIm1iY3MiKQogCi0jIFRoZSBmb2xsb3dpbmcgZW5jb2RpbmdzIHdvcmsgb25seSB3aXRoIHN0cjgsIG5vdCBzdHIKLWFsbF9zdHJpbmdfZW5jb2RpbmdzID0gWwotICAgICJxdW9wcmlfY29kZWMiLAotICAgICJzdHJpbmdfZXNjYXBlIiwKLSAgICAidXVfY29kZWMiLAotXQotCiAjIFRoZSBmb2xsb3dpbmcgZW5jb2RpbmcgaXMgbm90IHRlc3RlZCwgYmVjYXVzZSBpdCdzIG5vdCBzdXBwb3NlZAogIyB0byB3b3JrOgogIyAgICAidW5kZWZpbmVkIgogCiAjIFRoZSBmb2xsb3dpbmcgZW5jb2RpbmdzIGRvbid0IHdvcmsgaW4gc3RhdGVmdWwgbW9kZQogYnJva2VuX3VuaWNvZGVfd2l0aF9zdHJlYW1zID0gWwotICAgICJiYXNlNjRfY29kZWMiLAotICAgICJoZXhfY29kZWMiLAogICAgICJwdW55Y29kZSIsCiAgICAgInVuaWNvZGVfaW50ZXJuYWwiCiBdCiBicm9rZW5faW5jcmVtZW50YWxfY29kZXJzID0gYnJva2VuX3VuaWNvZGVfd2l0aF9zdHJlYW1zICsgWwogICAgICJpZG5hIiwKLSAgICAiemxpYl9jb2RlYyIsCi0gICAgImJ6Ml9jb2RlYyIsCiBdCiAKICMgVGhlIGZvbGxvd2luZyBlbmNvZGluZ3Mgb25seSBzdXBwb3J0ICJzdHJpY3QiIG1vZGUKIG9ubHlfc3RyaWN0X21vZGUgPSBbCiAgICAgImlkbmEiLAotICAgICJ6bGliX2NvZGVjIiwKLSAgICAiYnoyX2NvZGVjIiwKIF0KIAotdHJ5OgotICAgIGltcG9ydCBiejIKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBwYXNzCi1lbHNlOgotICAgIGFsbF91bmljb2RlX2VuY29kaW5ncy5hcHBlbmQoImJ6Ml9jb2RlYyIpCi0gICAgYnJva2VuX3VuaWNvZGVfd2l0aF9zdHJlYW1zLmFwcGVuZCgiYnoyX2NvZGVjIikKLQotdHJ5OgotICAgIGltcG9ydCB6bGliCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICBhbGxfdW5pY29kZV9lbmNvZGluZ3MuYXBwZW5kKCJ6bGliX2NvZGVjIikKLSAgICBicm9rZW5fdW5pY29kZV93aXRoX3N0cmVhbXMuYXBwZW5kKCJ6bGliX2NvZGVjIikKLQogY2xhc3MgQmFzaWNVbmljb2RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwgTWl4SW5DaGVja1N0YXRlSGFuZGxpbmcpOgogICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKICAgICAgICAgcyA9ICJhYmMxMjMiICMgYWxsIGNvZGVjcyBzaG91bGQgYmUgYWJsZSB0byBlbmNvZGUgdGhlc2UKQEAgLTEyODcsMTUgKzEyMzUsNiBAQAogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RhdGVfaGFuZGxpbmdfZGVjb2RlKGVuY29kaW5nLCB1LCB1LmVuY29kZShlbmNvZGluZykpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0ZV9oYW5kbGluZ19lbmNvZGUoZW5jb2RpbmcsIHUsIHUuZW5jb2RlKGVuY29kaW5nKSkKIAotY2xhc3MgQmFzaWNTdHJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6Ci0gICAgICAgIHMgPSBzdHI4KCJhYmMxMjMiKQotICAgICAgICBmb3IgZW5jb2RpbmcgaW4gYWxsX3N0cmluZ19lbmNvZGluZ3M6Ci0gICAgICAgICAgICAoZW5jb2RlZCwgc2l6ZSkgPSBjb2RlY3MuZ2V0ZW5jb2RlcihlbmNvZGluZykocykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZSwgbGVuKHMpKQotICAgICAgICAgICAgKGNoYXJzLCBzaXplKSA9IGNvZGVjcy5nZXRkZWNvZGVyKGVuY29kaW5nKShlbmNvZGVkKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFycywgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGNoYXJzLCBzLCBlbmNvZGluZykpCi0KIGNsYXNzIENoYXJtYXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9kZWNvZGVfd2l0aF9zdHJpbmdfbWFwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKQEAgLTEzNTQsNyArMTI5Myw2IEBACiAgICAgICAgIFVURjE2RXhUZXN0LAogICAgICAgICBSZWFkQnVmZmVyVGVzdCwKICAgICAgICAgQ2hhckJ1ZmZlclRlc3QsCi0gICAgICAgIEVzY2FwZURlY29kZVRlc3QsCiAgICAgICAgIFJlY29kaW5nVGVzdCwKICAgICAgICAgUHVueWNvZGVUZXN0LAogICAgICAgICBVbmljb2RlSW50ZXJuYWxUZXN0LApAQCAtMTM2Myw5ICsxMzAxLDcgQEAKICAgICAgICAgQ29kZWNzTW9kdWxlVGVzdCwKICAgICAgICAgU3RyZWFtUmVhZGVyVGVzdCwKICAgICAgICAgRW5jb2RlZEZpbGVUZXN0LAotICAgICAgICBTdHIyU3RyVGVzdCwKICAgICAgICAgQmFzaWNVbmljb2RlVGVzdCwKLSAgICAgICAgQmFzaWNTdHJUZXN0LAogICAgICAgICBDaGFybWFwVGVzdCwKICAgICAgICAgV2l0aFN0bXRUZXN0LAogICAgICkK